API REFERENCE

Errors & limits

JSON errors with a stable type to branch on; limits default to 100 requests a minute.

01.The error shape

{
  "error": {
    "type": "unsupported_language",
    "message": "\"xx\" is not one of the 30 supported language codes.",
    "doc_url": "https://thefamiliarlab.com/docs/languages"
  }
}

Branch on type, log message, follow doc_url -- messages may be reworded; types are stable within /v1.

02.Request IDs

HTTP/1.1 200 OK
Familiar-Request-Id: req_7hk2p0d4

Every response carries a Familiar-Request-Id header; log it and include it when reporting an issue (Help Center).

03.Status codes

TABLE 01 · WHAT EACH CODE MEANS
CODETYPEMEANING
400invalid_requestA field is missing or malformed; the message names it.
401invalid_keyNo key, a malformed key, or a rotated-away key.
403api_access_disabledValid key, API access disabled for its organization (billing hold or abuse review).
404not_foundNo such resource under your organization.
409conflictWrong state, e.g. rendering a manual dub not in_review, or deleting one mid-render.
422unsupported_languageTarget outside the 30 output languages, source outside the 99, or source equal to a target.
422validation_failedWell-formed fields that can't be honored together; the message names the pair.
429rate_limitedToo many requests; back off per Retry-After.
5xxinternalOur side. Safe to retry with backoff.

04.Example bodies

409 · RENDER OUT OF STATE
{
  "error": {
    "type": "conflict",
    "message": "dub_31xk9m is \"rendering\"; /render is only valid at \"in_review\".",
    "doc_url": "https://thefamiliarlab.com/docs/dubbing/transcript"
  }
}
429 · RATE LIMITED
HTTP/1.1 429 Too Many Requests
Retry-After: 12

{
  "error": {
    "type": "rate_limited",
    "message": "Request rate above your organization's limit; retry after 12 seconds.",
    "doc_url": "https://thefamiliarlab.com/docs/errors"
  }
}

05.Rate limits

The default limit is 100 requests per minute per organization. Every response reports where you stand:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1786731720

Past it, requests return 429 with Retry-After in seconds; honor it and the limiter recovers immediately. Jobs already accepted are never dropped by the limiter.

06.Default limits

TABLE 02 · DEFAULTS PER ORGANIZATION
LIMITDEFAULT
API request rate100 requests per minute
Concurrent dub renders10
Concurrent live sessions (experimental)2 (once live is enabled)
Upload size10 GB per file
Source duration24 hours per video
Resolutionup to 4K, matching the source
Audio layouttrue 5.1 surround or stereo, chosen per job
Target languages29 per dub -- the full set minus the source
Page size (limit)20 default · 100 max
Idempotency-Key window24 hours
Webhook delivery10-second acknowledgement · retried up to 24 hours

Every default is raised the same way: ask your point of contact.

07.Idempotent retries

Send an Idempotency-Key header (any unique string, e.g. a UUID) on any POST and retries with the same key return the original result instead of creating a second resource. Keys are remembered for 24 hours; reusing one with a different body returns 409.

curl -X POST https://api.thefamiliarlab.com/v1/dubs \
  -H "Authorization: Bearer $FAMILIAR_API_KEY" \
  -H "Idempotency-Key: 4c1b2f0e-9d3a-4d8e-b1c7-2f6a0e8d5b91" \
  -F "source_url=https://cdn.yourapp.com/upload.mp4" \
  -F "target_langs=es"

Webhooks can also arrive twice -- dedupe on the event id; see Webhooks.

08.Access

The API is enterprise-only: private access under a Studio contract, with volume pricing, raised limits, ProRes masters on request, and a named point of contact. Book a call and your key is issued with the contract.