Skip to content

The Faylee API lets scripts, internal tools and agents upload recordings, read them, open recording links and manage webhook endpoints. It is a JSON API over HTTPS. Request and response keys are snake_case.

Terminal window
https://app.faylee.app/api/v1

Paths on these pages are relative to this base. The one exception, oEmbed, is marked.

The API accepts cross-origin browser requests only from the Faylee extension. Call it from a server, a script or a CLI, not from JavaScript running on another website.

Every request sends a personal token in the Authorization header:

Terminal window
curl https://app.faylee.app/api/v1/recordings \
-H "Authorization: Bearer $FAYLEE_TOKEN"

To create a token, open Settings → Browsers and tokens in Faylee, give the token a name and create it. Faylee shows the token once. Only a SHA-256 digest of it is stored, so copy it before you leave the page. If you lose it, create a new one.

Tokens do not expire. Revoke a token from the same settings page when you no longer need it. The page shows when each token was last used.

A missing, unknown or revoked token gets 401:

{ "error": "Sign in to Faylee again" }

A token acts as the person who created it, with exactly their access. There are no scopes.

ActionWho can do it
List and read recordings, captures, frames, transcripts and attachmentsAny member, for recordings in their workspace
Upload a recordingAny member. Only the person who started an upload can complete it
Update a recording, add attachments, email it, file an issueAny member, for recordings in their workspace
Move a recording to the trashThe recording’s author, or a workspace admin
Open, list and turn off recording linksAny member
Manage webhook endpointsWorkspace admins only

A request for something the token’s owner may not do gets 403. A recording, link or endpoint outside the owner’s workspace gets 404, so the API does not reveal that it exists.

Wherever a path takes a recording :id, you can pass either the numeric id or the share_id. The share_id is the last segment of a share link, so https://app.faylee.app/s/V1StGXR8_Z is recording V1StGXR8_Z.

Endpoints that return a recording use this shape.

FieldTypeNotes
idinteger
share_idstring10 characters. Also accepted as :id in paths
kindstringvideo, replay or screenshot
titlestring or null
descriptionstring or null
statusstringuploading, processing, ready or failed. See processing states
visibilitystringworkspace, public or password
duration_msinteger or null
page_urlstring or nullThe first page captured
error_countintegerUncaught errors plus console errors
failed_request_countinteger
tagsstring[]Lowercase
reporter_namestring or nullSet for recordings sent through a recording link
reporter_emailstring or nullSet for recordings sent through a recording link
created_atstringISO 8601
share_urlstringThe recording’s share link. Uses the workspace’s own link domain when it has a verified one
authorstringThe member who recorded it, or who made the recording link it came through
similarobject[]Other recordings in the workspace that failed in some of the same ways. Each has share_id, title and share_url
analysisobject or nullThe assistant’s write-up, once it has read the recording. See below

analysis has these fields:

FieldType
titlestring
summarystring
actual_behaviorstring
expected_behaviorstring
likely_causestring
next_stepsstring[]
moments{ atMs, label }[], where atMs is milliseconds into the recording
{
"id": 4812,
"share_id": "V1StGXR8_Z",
"kind": "video",
"title": "Checkout fails with a 500",
"description": null,
"status": "ready",
"visibility": "workspace",
"duration_ms": 48200,
"page_url": "https://shop.example.com/checkout",
"error_count": 2,
"failed_request_count": 1,
"tags": ["checkout"],
"reporter_name": null,
"reporter_email": null,
"created_at": "2026-09-30T14:03:11.000Z",
"share_url": "https://app.faylee.app/s/V1StGXR8_Z",
"author": "Ann Park",
"similar": [],
"analysis": null
}

Every error response has one field, error, with a sentence you can show to a person:

{ "error": "Media content type is not included in the list" }
StatusWhen
401The token is missing, unknown or revoked
403The token’s owner may not do this, for example trash someone else’s recording, or manage webhooks without being an admin
404The record does not exist or is outside the workspace. The message is Not found
422A parameter is missing or invalid, a validation failed (messages are joined into one sentence), the workspace has no storage, or an upload could not be completed
426An outdated Faylee extension or CLI sent the request. See below

Faylee’s own extension and CLI name themselves in an X-Faylee-Client header, such as cli/0.4.0. When that version is older than the server supports, the server answers 426 with instructions to update. Requests without the header are served normally, so your scripts do not need to send it.

GET /recordings is paginated: 50 recordings a page, with page and total_pages in the response. Pass page to get another page. See Reading recordings.

GET /recording_links returns up to the 100 newest open links and is not paginated.

MethodPathPage
POST/recordingsUploading
POST/recordings/:id/completeUploading
GET/foldersUploading
GET/recordingsReading
GET/recordings/:idReading
PATCH/recordings/:idReading
DELETE/recordings/:idReading
GET/recordings/:id/captureReading
GET/recordings/:id/framesReading
GET/recordings/:id/transcriptReading
GET/recordings/:id/attachmentsReading
POST/recordings/:id/attachmentsReading
POST/recordings/:id/emailsReading
GET/integrationsReading
GET/integrations/:id/fieldsReading
POST/recordings/:id/issuesReading
GET/oembed, outside /api/v1Reading
GET/recording_linksRecording links
POST/recording_linksRecording links
DELETE/recording_links/:idRecording links
GET/webhook_endpointsWebhooks
POST/webhook_endpointsWebhooks
GET/webhook_endpoints/:idWebhooks
PATCH/webhook_endpoints/:idWebhooks
DELETE/webhook_endpoints/:idWebhooks
POST/webhook_endpoints/:id/secretWebhooks

Every recording carries a capture file, data.json. Its format is described in Capture format.