Sovran
API documentation

Endpoint reference

Find routes, request rules, response fields, and error actions.

The API uses JSON over HTTPS. Add /api/v1 to the origin shown in Developer. Some guides abbreviate routes, such as /projects. Add the /api/v1 prefix once when you build a request URL. Full paths, such as /api/v1/projects, already include it.

Download the OpenAPI 3.1 description for complete endpoint schemas and current permissions. OpenAPI is a machine-readable HTTP interface description.

Find a resource

TaskGuide
Projects, sequences, render estimates, and outputsCreate your first video
Upload reservations and asset preparationUploads
Compositions, captions, AI video, and voiceoversCreate and edit content
Editor mutations and searchesEditor tool reference
Provider connections, imports, publishing, and team controlsConnect, import, and publish
Jobs, retries, credits, and signed eventsJobs and webhooks
File sizes, output limits, and feature availabilityLimits and recovery

Requests and responses

Send Content-Type: application/json for a body. JSON bodies must be at most 1 MiB (1,048,576 bytes). Successful responses contain data and requestId. Errors contain error.code, error.message, and requestId. Save the request ID when you need help with a failed request.

Creation, changes, paid work, and retries need Idempotency-Key. This is a request token that prevents duplicate operations. Use a new token for each intended operation. If a request times out, send the same token and body again. The identity includes workspace, method, path, and token. Keys in one workspace share this identity. Changed input returns 409 idempotency_conflict. Never use a new token to bypass an unknown result.

POST /api/v1/projects
curl "$SOVRAN_API_ORIGIN/api/v1/projects" \
  -H "Authorization: Bearer $SOVRAN_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: project-2026-10-04-001" \
  --data '{"name":"My API project"}'

Lists and pagination

Paged lists use limit from 1 to 100 and an opaque cursor from nextCursor. The default limit is 50. Project composition lists use a default limit of 100. Keep requesting the returned cursor until nextCursor is null. Do not build or change cursor values yourself.

GET /api/v1/projects?limit=10
curl "$SOVRAN_API_ORIGIN/api/v1/projects?limit=10" \
  -H "Authorization: Bearer $SOVRAN_API_KEY"

Use the same page controls for project compositions. This request returns at most one item.

GET /api/v1/projects/{projectId}/compositions?limit=1
curl "$SOVRAN_API_ORIGIN/api/v1/projects/$PROJECT_ID/compositions?limit=1" \
  -H "Authorization: Bearer $SOVRAN_API_KEY"

A populated page can return a cursor for more items.

GET /api/v1/projects/{projectId}/compositions HTTP 200 — populated page
{
  "data": {
    "items": [{
      "id": "<COMPOSITION_UUID>",
      "projectId": "<PROJECT_UUID>",
      "title": "Example composition",
      "updatedAt": "2026-10-05T10:00:00.000Z",
      "composition": {
        "version": 1, "aspectRatio": "9:16", "backgroundColor": "#000000",
        "durationInFrames": 30, "fps": 30, "width": 1080, "height": 1920,
        "overlays": []
      }
    }],
    "nextCursor": "1"
  },
  "requestId": "<REQUEST_UUID>"
}

An empty page has no next cursor.

GET /api/v1/projects/{projectId}/compositions HTTP 200 — empty page
{
  "data": { "items": [], "nextCursor": null },
  "requestId": "<REQUEST_UUID>"
}

Handle HTTP errors

StatusNext action
400 or 422Correct the input identified by the error details.
401Check the host and key. Replace an expired or revoked key in Developer.
403Check permissions, the creator's role, and the active paid plan.
404Check the resource ID and the key's workspace.
409Read error.code. Read current revisions or selection data before changing input. For an uncertain charge or provider result, follow job recovery.
413Reduce the body or file to the permitted size.
429Wait for the duration in Retry-After. Reuse the same token and body for the same operation.
503Check availability. For a temporary read failure, wait and read again. For a mutation, keep the same token and body.

Workspace keys share request counters. Current tier limits apply to ordinary requests, uploads, rendering, and AI work. An unavailable limit service returns 503.

All operations

Use this table to find each endpoint and its required permissions. Some operations also check the saved job, selected tool, or provider connection.

MethodEndpointActionPermissions
DELETE/api/v1/assets/{assetId}Delete an asset after impact checksread, delete
DELETE/api/v1/assets/{assetId}/captions/{language}Delete captions with a revision checkread, delete
DELETE/api/v1/avatars/{avatarId}/voiceovers/{voiceoverId}/approvalRevoke an avatar voice approvalread, delete
DELETE/api/v1/avatars/{resourceId}Delete the saved voice or disable the avatarread, delete
DELETE/api/v1/cloud-drive/dropbox/folder-syncs/{syncId}Disconnect a saved Dropbox folder with its revisionread, delete
DELETE/api/v1/compositions/{compositionId}Delete an editor composition after impact checksread, delete
DELETE/api/v1/dictionary/{resourceId}Delete a dictionary ruleread, delete
DELETE/api/v1/projects/{projectId}Delete a project after active-work guardsread, delete
DELETE/api/v1/projects/{projectId}/auto-edit-templates/{resourceId}Delete auto-edit-templates with its revisionread, delete
DELETE/api/v1/projects/{projectId}/briefs/{resourceId}Delete briefs with its revisionread, delete
DELETE/api/v1/projects/{projectId}/messaging/{resourceId}Delete messaging with its revisionread, delete
DELETE/api/v1/projects/{projectId}/messaging-templates/{resourceId}Delete messaging-templates with its revisionread, delete
DELETE/api/v1/projects/{projectId}/naming-fields/{resourceId}delete project naming-fieldsread, delete
DELETE/api/v1/projects/{projectId}/naming-templates/{resourceId}delete project naming-templatesread, delete
DELETE/api/v1/projects/{projectId}/research/facebook/saves/{collection}/{savedId}Delete saved research with a revision checkread, delete
DELETE/api/v1/projects/{projectId}/research/tiktok/saves/{collection}/{savedId}Delete saved research with a revision checkread, delete
DELETE/api/v1/sequences/{sequenceId}Delete a sequenceread, delete
DELETE/api/v1/voice-clones/{resourceId}Delete the saved voice or disable the avatarread, delete
DELETE/api/v1/workspace/invitations/{resourceId}Revoke an invitationread, delete
DELETE/api/v1/workspace/members/{resourceId}Remove a member and revoke cloud accessread, delete
GET/api/v1/ad-launches/metaList meta ad-launchesread
GET/api/v1/ad-launches/meta/{jobId}Read meta ad-launches resultsread
GET/api/v1/ad-launches/tiktokList tiktok ad-launchesread
GET/api/v1/ad-launches/tiktok/{jobId}Read tiktok ad-launches resultsread
GET/api/v1/ai-video-modelsList ai-video-modelsread
GET/api/v1/ai-videos/{resourceId}Read ai-videos and verified output availabilityread
GET/api/v1/assets/{assetId}Read an assetread
GET/api/v1/assets/{assetId}/captionsList captions and signed SRT URLsread
GET/api/v1/assets/{assetId}/captions/{language}Read captions for one languageread
GET/api/v1/assets/{assetId}/delete-impactRead asset deletion impactread
GET/api/v1/assets/{assetId}/mediaGet a short-lived source or thumbnail URLread
GET/api/v1/assets/{assetId}/transcriptRead timed transcript passagesread
GET/api/v1/auto-edits/{resourceId}Read auto-edits and verified output availabilityread
GET/api/v1/avatar-videos/{resourceId}Read avatar-videos and verified output availabilityread
GET/api/v1/avatarsList avatarsread
GET/api/v1/avatars/{avatarId}/images/{imageId}/mediaRead a signed avatar image URLread
GET/api/v1/avatars/{resourceId}Read avatarsread
GET/api/v1/cloud-drive/dropbox/exportsList dropbox exportsread
GET/api/v1/cloud-drive/dropbox/exports/{jobId}Read dropbox exportsread
GET/api/v1/cloud-drive/dropbox/folder-syncsList creator-owned saved Dropbox foldersread
GET/api/v1/cloud-drive/dropbox/folder-syncs/{syncId}Read a saved Dropbox folder and its bounded progressread
GET/api/v1/cloud-drive/dropbox/folder-syncs/{syncId}/filesList saved file states for one Dropbox folderread
GET/api/v1/cloud-drive/dropbox/importsList dropbox importsread
GET/api/v1/cloud-drive/dropbox/imports/{jobId}Read dropbox importsread
GET/api/v1/cloud-drive/dropbox/syncsList dropbox syncsread
GET/api/v1/cloud-drive/dropbox/syncs/{jobId}Read dropbox syncsread
GET/api/v1/cloud-drive/google_drive/exportsList google_drive exportsread
GET/api/v1/cloud-drive/google_drive/exports/{jobId}Read google_drive exportsread
GET/api/v1/cloud-drive/google_drive/importsList google_drive importsread
GET/api/v1/cloud-drive/google_drive/imports/{jobId}Read google_drive importsread
GET/api/v1/cloud-drive/google_drive/syncsGoogle Drive folder sync is discontinued (discontinued)read
GET/api/v1/cloud-drive/google_drive/syncs/{jobId}Google Drive folder sync is discontinued (discontinued)read
GET/api/v1/compositions/{compositionId}Read an editor compositionread
GET/api/v1/compositions/{compositionId}/delete-impactRead guarded composition deletion impactread
GET/api/v1/dictionaryList dictionaryread
GET/api/v1/integrationsRead connection and publishing capability flagsread
GET/api/v1/integrations/dropbox/accountsRead dropbox accountsread
GET/api/v1/integrations/dropbox/connectionsRead dropbox connectionsread
GET/api/v1/integrations/google_drive/accountsRead google_drive accountsread
GET/api/v1/integrations/google_drive/connectionsRead google_drive connectionsread
GET/api/v1/integrations/meta/accountsRead meta accountsread
GET/api/v1/integrations/meta/connectionsRead meta connectionsread
GET/api/v1/integrations/tiktok/accountsRead tiktok accountsread
GET/api/v1/integrations/tiktok/connectionsRead tiktok connectionsread
GET/api/v1/jobs/{jobId}Read a job, child counts, output references, and safe errorsread
GET/api/v1/musicList active music catalog tracksread
GET/api/v1/projectsList workspace projectsread
GET/api/v1/projects/{projectId}Read a projectread
GET/api/v1/projects/{projectId}/ai-videosList ai-videosread
GET/api/v1/projects/{projectId}/assetsList project assets and preparation statusread
GET/api/v1/projects/{projectId}/auto-edit-templatesList auto-edit-templatesread
GET/api/v1/projects/{projectId}/auto-edit-templates/{resourceId}Read auto-edit-templatesread
GET/api/v1/projects/{projectId}/auto-editsList auto-editsread
GET/api/v1/projects/{projectId}/avatar-videosList avatar-videosread
GET/api/v1/projects/{projectId}/briefsList briefsread
GET/api/v1/projects/{projectId}/briefs/{resourceId}Read briefsread
GET/api/v1/projects/{projectId}/clipsList clipsread
GET/api/v1/projects/{projectId}/compositionsList version 1 editor compositionsread
GET/api/v1/projects/{projectId}/insightsRead saved Meta performance insightsread
GET/api/v1/projects/{projectId}/insights/adsRead saved Meta ads performanceread
GET/api/v1/projects/{projectId}/insights/hooksRead saved Meta hooks performanceread
GET/api/v1/projects/{projectId}/messagingList messagingread
GET/api/v1/projects/{projectId}/messaging/{resourceId}Read messagingread
GET/api/v1/projects/{projectId}/messaging-templatesList messaging-templatesread
GET/api/v1/projects/{projectId}/messaging-templates/{resourceId}Read messaging-templatesread
GET/api/v1/projects/{projectId}/naming-fieldsRead project naming-fieldsread
GET/api/v1/projects/{projectId}/naming-templatesRead project naming-templatesread
GET/api/v1/projects/{projectId}/research/facebookRead saved facebook researchread
GET/api/v1/projects/{projectId}/research/facebook/saves/{collection}List saved research in one collectionread
GET/api/v1/projects/{projectId}/research/facebook/saves/{collection}/{savedId}Read one saved research itemread
GET/api/v1/projects/{projectId}/research/tiktokRead saved tiktok researchread
GET/api/v1/projects/{projectId}/research/tiktok/saves/{collection}List saved research in one collectionread
GET/api/v1/projects/{projectId}/research/tiktok/saves/{collection}/{savedId}Read one saved research itemread
GET/api/v1/projects/{projectId}/sequencesList project sequencesread
GET/api/v1/projects/{projectId}/settingsRead project settingsread
GET/api/v1/projects/{projectId}/voiceoversList voiceoversread
GET/api/v1/publications/metaList meta publicationsread
GET/api/v1/publications/meta/{jobId}Read meta publications resultsread
GET/api/v1/publications/tiktokList tiktok publicationsread
GET/api/v1/publications/tiktok/{jobId}Read tiktok publications resultsread
GET/api/v1/renders/{renderId}/outputsRead durable outputs and short-lived media URLsread
GET/api/v1/sequences/{sequenceId}Read a sequenceread
GET/api/v1/sequences/{sequenceId}/combinationsRead the clip selection manifest and fingerprintread
GET/api/v1/sequences/{sequenceId}/compositionsRead compositions with saved sequence timeline editsread
GET/api/v1/sequences/{sequenceId}/smart-variationsList Smart analysesread
GET/api/v1/sequences/{sequenceId}/smart-variations/{resourceId}Read a saved Smart analysisread
GET/api/v1/uploads/{uploadId}Read an upload reservationread
GET/api/v1/usageRead paid plan status, API eligibility, and existing feature balancesread
GET/api/v1/voice-clonesList voice-clonesread
GET/api/v1/voice-clones/{resourceId}Read voice-clonesread
GET/api/v1/voice-clones/{resourceId}/mediaRead a signed voice preview URLread
GET/api/v1/voiceovers/{resourceId}Read voiceovers and verified output availabilityread
GET/api/v1/voicesList voicesread
GET/api/v1/workspaceRead workspace detailsread
GET/api/v1/workspace/invitationsList workspace/invitationsread
GET/api/v1/workspace/membersList workspace/membersread
PATCH/api/v1/assets/{assetId}Rename an assetread, write
PATCH/api/v1/assets/{assetId}/transcriptSave transcript text with revision checksread, write
PATCH/api/v1/avatars/{resourceId}Rename the saved voice or avatarread, write
PATCH/api/v1/cloud-drive/dropbox/folder-syncs/{syncId}Pause or activate a saved Dropbox folder with its revisionread, write
PATCH/api/v1/dictionary/{resourceId}Update a dictionary ruleread, write
PATCH/api/v1/projects/{projectId}Update a project with its revisionread, write
PATCH/api/v1/projects/{projectId}/auto-edit-templates/{resourceId}Replace auto-edit-templates with its revisionread, write
PATCH/api/v1/projects/{projectId}/briefs/{resourceId}Replace briefs with its revisionread, write
PATCH/api/v1/projects/{projectId}/messaging/{resourceId}Replace messaging with its revisionread, write
PATCH/api/v1/projects/{projectId}/messaging-templates/{resourceId}Replace messaging-templates with its revisionread, write
PATCH/api/v1/projects/{projectId}/naming-fields/{resourceId}patch project naming-fieldsread, write
PATCH/api/v1/projects/{projectId}/naming-templates/{resourceId}patch project naming-templatesread, write
PATCH/api/v1/projects/{projectId}/research/facebook/saves/{collection}/{savedId}Update saved research notes with a revision checkread, write
PATCH/api/v1/projects/{projectId}/research/tiktok/saves/{collection}/{savedId}Update saved research notes with a revision checkread, write
PATCH/api/v1/projects/{projectId}/settingsSave project settingsread, write
PATCH/api/v1/sequences/{sequenceId}Update sequence name or descriptionread, write
PATCH/api/v1/voice-clones/{resourceId}Rename the saved voice or avatarread, write
PATCH/api/v1/workspaceRename workspace as its ownerread, write
PATCH/api/v1/workspace/members/{resourceId}Change a member role with an expected roleread, write
POST/api/v1/ad-launches/metaAccept meta ad-launchesread, publish
POST/api/v1/ad-launches/meta/{jobId}/retryRequire Meta Ads Manager review before a new ad requestread, publish
POST/api/v1/ad-launches/tiktokAccept tiktok ad-launchesread, publish
POST/api/v1/ad-launches/tiktok/{jobId}/retryRetry eligible tiktok ad-launchesread, publish
POST/api/v1/assets/{assetId}/tagsAdd or remove asset tagsread, write
POST/api/v1/assets/{assetId}/transcriptRequest transcript preparationread, generate
POST/api/v1/avatarsCreate an avatar from verified project imagesread, write
POST/api/v1/cloud-drive/dropbox/exportsAccept dropbox exportsread, write
POST/api/v1/cloud-drive/dropbox/exports/{jobId}/retryRetry eligible dropbox exportsread, write
POST/api/v1/cloud-drive/dropbox/folder-syncsConnect a saved Dropbox folder without importing old filesread, write
POST/api/v1/cloud-drive/dropbox/folder-syncs/{syncId}/runAccept one changes poll or one explicit bounded scanread, write
POST/api/v1/cloud-drive/dropbox/importsAccept dropbox importsread, write
POST/api/v1/cloud-drive/dropbox/imports/{jobId}/retryRetry eligible dropbox importsread, write
POST/api/v1/cloud-drive/dropbox/syncsAccept dropbox syncsread, write
POST/api/v1/cloud-drive/dropbox/syncs/{jobId}/retryRetry eligible dropbox syncsread, write
POST/api/v1/cloud-drive/dropbox/syncs/{jobId}/stopStop bounded Dropbox work after plan expiryread, write
POST/api/v1/cloud-drive/google_drive/exportsAccept google_drive exportsread, write
POST/api/v1/cloud-drive/google_drive/exports/{jobId}/retryRetry eligible google_drive exportsread, write
POST/api/v1/cloud-drive/google_drive/importsAccept google_drive importsread, write
POST/api/v1/cloud-drive/google_drive/imports/{jobId}/retryRetry eligible google_drive importsread, write
POST/api/v1/cloud-drive/google_drive/syncsGoogle Drive folder sync is discontinued (discontinued)read, write
POST/api/v1/compositions/{compositionId}/ai-actionsAccept an AI edit plan for customer reviewread, generate
POST/api/v1/compositions/{compositionId}/ai-actions/applyApply a reviewed saved plan with a revision checkread, write, generate
POST/api/v1/compositions/{compositionId}/ai-toolsRun an editor search, caption tool, or saved mutation jobread, generate + tool permissions
POST/api/v1/compositions/{compositionId}/background-removalsRemove one video background and apply its saved outputread, write, generate
POST/api/v1/compositions/{compositionId}/render-estimateEstimate one version 1 composition outputread
POST/api/v1/compositions/{compositionId}/rendersAccept one frozen composition exportread, generate
POST/api/v1/dictionaryCreate a dictionary ruleread, write
POST/api/v1/dictionary/applyApply frozen rules to 1–100 explicit transcriptsread, write
POST/api/v1/jobs/{jobId}/retryRetry eligible confirmed failed workread + saved job permissions
POST/api/v1/projectsCreate a projectread, write
POST/api/v1/projects/{projectId}/ai-videosAccept ai-videosread, generate
POST/api/v1/projects/{projectId}/auto-edit-templatesCreate auto-edit-templatesread, write
POST/api/v1/projects/{projectId}/auto-editsAccept auto-editsread, generate
POST/api/v1/projects/{projectId}/avatar-videosAccept avatar-videosread, generate
POST/api/v1/projects/{projectId}/briefsCreate briefsread, write
POST/api/v1/projects/{projectId}/clipsAccept clipsread, generate
POST/api/v1/projects/{projectId}/compositionsCreate a version 1 editor compositionread, write
POST/api/v1/projects/{projectId}/insights/syncRefresh one linked Meta account with no media downloadsread, write
POST/api/v1/projects/{projectId}/messagingCreate messagingread, write
POST/api/v1/projects/{projectId}/messaging/generateGenerate hooks, scripts, or test groupsread, generate
POST/api/v1/projects/{projectId}/messaging-templatesCreate messaging-templatesread, write
POST/api/v1/projects/{projectId}/naming-fieldsSave project naming-fieldsread, write
POST/api/v1/projects/{projectId}/naming-templatesSave project naming-templatesread, write
POST/api/v1/projects/{projectId}/research/facebook/{savedId}/adaptAdapt frozen research text to project contextread, generate
POST/api/v1/projects/{projectId}/research/facebook/{savedId}/transcriptTranscribe a bounded research video with saved audioread, generate
POST/api/v1/projects/{projectId}/research/facebook/savesSave one server selected research resultread, write
POST/api/v1/projects/{projectId}/research/facebook/searchQuery Facebook companies or one bounded ad pageread, generate
POST/api/v1/projects/{projectId}/research/tiktok/{savedId}/adaptAdapt frozen research text to project contextread, generate
POST/api/v1/projects/{projectId}/research/tiktok/{savedId}/transcriptTranscribe a bounded research video with saved audioread, generate
POST/api/v1/projects/{projectId}/research/tiktok/savesSave one server selected research resultread, write
POST/api/v1/projects/{projectId}/research/tiktok/searchQuery TikTok trendsread, generate
POST/api/v1/projects/{projectId}/sequencesCreate a sequenceread, write
POST/api/v1/projects/{projectId}/uploadsReserve a signed direct uploadread, write
POST/api/v1/projects/{projectId}/voiceoversAccept voiceoversread, generate
POST/api/v1/publications/metaAccept meta publicationsread, publish
POST/api/v1/publications/meta/{jobId}/retryRetry eligible meta publicationsread, publish
POST/api/v1/publications/tiktokAccept tiktok publicationsread, publish
POST/api/v1/publications/tiktok/{jobId}/retryRetry eligible tiktok publicationsread, publish
POST/api/v1/sequences/{sequenceId}/render-estimateEstimate finished outputs and render creditsread
POST/api/v1/sequences/{sequenceId}/rendersAccept a frozen background render batchread, generate
POST/api/v1/sequences/{sequenceId}/smart-variationsAccept a bounded Smart analysisread, generate
POST/api/v1/uploads/{uploadId}/completeVerify stored path, size, and MIME typeread, write
POST/api/v1/voice-clonesReserve a voice sample upload or selected project videoread, generate
POST/api/v1/voice-clones/{resourceId}/cancelCancel a voice clone and its saved sampleread, delete
POST/api/v1/voice-clones/{resourceId}/runVerify the saved sample and accept voice cloningread, generate
POST/api/v1/workspace/invitationsCreate and email an invitationread, write
POST/api/v1/workspace/invitations/{resourceId}/resendResend an invitation to its expected addressread, write
PUT/api/v1/assets/{assetId}/captions/{language}Save an SRT file with a revision checkread, write
PUT/api/v1/assets/{assetId}/tagsReplace asset tagsread, write
PUT/api/v1/avatars/{avatarId}/voiceovers/{voiceoverId}/approvalRecord approval after reviewing the voice previewread, write
PUT/api/v1/compositions/{compositionId}Replace an editor composition with its revisionread, write
PUT/api/v1/sequences/{sequenceId}/configurationReplace sequence configuration with a revision checkread, write

Admin tools, workers, provider callbacks, checkout, and account deletion are outside this API. Connect provider accounts in the dashboard.

Was this article helpful?

On this page