Docs
Changelog
Every change to the API, newest first. Also a JSON Feed. Changes within /v1 are additive: anything that would break a client is announced here first, with a sunset date.
Self-serve signup, test keys, API key management and usage
· Added
You can now get started without talking to anyone, test for free, and manage your account through the API.
- Sign up with your email address: the emailed link creates your account with free credits, a live key and a
test key, and opens the dashboard (keys, usage, balance, credit packs). AI agents can sign up with
POST /v1/agent_signup: they get a test key at once and a live key that works once you confirm by email. - Test keys (
st_test_…) answer every endpoint from recorded responses, free and deterministic, and reserved "magic" inputs trigger each error code, so integrations and CI can exercise every branch at no cost. - API keys have scopes (
endpoints,jobs,account:read,admin), optional spend limits per day or month (spend_limit_reached), expiry and IP allowlists, managed through/v1/api_keys. - Account and usage:
GET /v1/account(balance, plan, the calling key),GET /v1/usage(requests and credits over time by endpoint, key and outcome) andGET /v1/credit_transactions(the ledger). Setlow_balance_thresholdto get acredits.lowemail and event. meta.modesays whether a response came from a live or a test key.forbiddenis now returned (withdetails.reason), and a missing key'sunauthorizedsays where to get one.
Contract changes (104)
endpoint facebook.transcript: accepts video linksendpoint instagram.transcript: accepts video linksendpoint instagram.transcript: accepts post linksendpoint tiktok.transcript: accepts video linksendpoint tiktok.transcript: accepts post linksendpoint youtube.transcript: accepts video linkserror code endpoint_retired added (HTTP 410)error code forbidden added (HTTP 403)error code idempotency_key_in_progress added (HTTP 409)error code idempotency_key_reused added (HTTP 422)error code insufficient_credits: details key credits_required addederror code insufficient_credits: details key credits_available addederror code invalid_cursor: details key reason addederror code invalid_input: details key suggestion addederror code invalid_input: details key accepted_params addederror code invalid_input: details key url_kind addederror code invalid_input: details key url_platform addederror code invalid_input: details key accepted_url_kinds addederror code invalid_input: details key endpoints addederror code invalid_input: details key fields addederror code job_not_found added (HTTP 404)error code overloaded: details key retry_after addederror code rate_limited: details key retry_after addederror code spend_limit_reached added (HTTP 402)header cache-control addedheader deprecation addedheader link addedheader ratelimit addedheader ratelimit-policy addedheader sunset addedheader traceparent addedheader x-client-request-id addedcommon param fields addedwarning code deprecated_endpoint addedshared param country addedshared param lang addedshared param since addedshared param sort addedshared param until addedmeta fields are part of the locked contractpage fields are part of the locked contracterror fields are part of the locked contractMCP tool find_endpoint addedMCP tool get_transcript addedheader authorization addederror code forbidden: details key reason addederror code forbidden: details key required_scope addederror code spend_limit_reached: details key api_key_id addederror code spend_limit_reached: details key spend_limit addederror code spend_limit_reached: details key interval addederror code spend_limit_reached: details key used addederror code spend_limit_reached: details key credits_required addederror code spend_limit_reached: details key resets_at addederror code unauthorized: details key signup_url addederror code unauthorized: details key agent_signup_url addedmeta: field mode addedMCP tool get_account addederror code insufficient_credits: details key max_credits addedheader idempotency-key addedheader idempotent-replayed addedheader location addedheader prefer addedheader preference-applied addedheader webhook-id addedheader webhook-signature addedheader webhook-timestamp addedevent type job.completed addedevent type job.canceled addedevent type job.expired addedevent type credits.low addedevent type credits.depleted addedevent type api_key.spend_limit_reached addedevent type webhook.test addedoperation DELETE /v1/webhook_endpoints/{id} added (webhook_endpoints.delete)operation GET /v1/events added (events.list)operation GET /v1/events/{id} added (events.get)operation GET /v1/jobs added (jobs.list)operation GET /v1/jobs/{id} added (jobs.get)operation GET /v1/jobs/{id}/results added (jobs.results.list)operation GET /v1/jobs/{id}/results.jsonl added (jobs.results.download)operation GET /v1/webhook_endpoints added (webhook_endpoints.list)operation GET /v1/webhook_endpoints/{id} added (webhook_endpoints.get)operation GET /v1/webhook_endpoints/{id}/deliveries added (webhook_endpoints.deliveries.list)operation PATCH /v1/webhook_endpoints/{id} added (webhook_endpoints.update)operation POST /v1/events/{id}/redeliver added (events.redeliver)operation POST /v1/jobs added (jobs.create)operation POST /v1/jobs/{id}/cancel added (jobs.cancel)operation POST /v1/webhook_endpoints added (webhook_endpoints.create)operation POST /v1/webhook_endpoints/{id}/rotate_secret added (webhook_endpoints.rotate_secret)operation POST /v1/webhook_endpoints/{id}/test added (webhook_endpoints.test)MCP tool create_job addedMCP tool get_job addedendpoint tiktok.profile added (/v1/tiktok/profile)resource profile is liveMCP tool get_profile addedendpoint instagram.post added (/v1/instagram/post)resource post is liveMCP tool get_post addedendpoint facebook.search_ads added (/v1/facebook/search_ads)resource ad is liveMCP tool search addedendpoint youtube.comments added (/v1/youtube/comments)resource comment is liveMCP tool list_comments added
Request conventions, richer errors and response metadata
· Changed
Every endpoint now follows the same request conventions, and every response tells you more about itself.
- Unknown parameters are rejected with
invalid_input, free, naming the parameter and the one you most likely meant (username→handle). Previously they were ignored. Common parameters (max_age,fields) are always known. - Errors carry everything needed to react without parsing the message:
status,retryable,param,remediation,doc_url,details(for examplecredits_required, or the endpoint a link belongs to) andcharged(always false).retry-afteris never sent on credit errors. - A link of the wrong kind (a profile link sent to a video endpoint, a link from another platform) is answered with the endpoint that takes it.
metagainsinput(what your url resolved to),credits_remaining,client_request_idandwarnings.fieldsselects only the fields you need, after the cache, at no cost.- Lists gain
page.end_reasonand aLink: rel="next"header;sincestops paging on newest-first lists. - Headers: send
x-client-request-idto have your own ID echoed and logged, andtraceparentto match traces.RateLimit-PolicyandRateLimitdescribe the account's runaway-protection ceiling, andCache-Control: max-ageworks likemax_age. - Deprecated endpoints will announce themselves with
DeprecationandSunsetheaders and a warning, and answerendpoint_retiredafter their sunset. This changelog is also a JSON Feed.
Background jobs and batches, webhooks, events and Idempotency-Key
· Added
Run many requests, or one long one, without holding a connection open, and hear back when they are done.
- Jobs:
POST /v1/jobsruns a batch of endpoint requests in the background, at each endpoint's own price, andmax_pageswalks a whole list server-side. With?waita short job answers inline (a synchronous batch); otherwise pollGET /v1/jobs/{id}(free), page throughGET /v1/jobs/{id}/resultsas items finish, or download every result from the job's signedresults_url.Prefer: respond-asyncturns any endpoint request into a one-request job. - Credits are set aside per job (
max_credits) and charged per item as it ends; failed items are free. A key's spend limit holds through its jobs, and a test key's jobs answer from recorded responses, free. - Webhooks (Standard Webhooks signatures, retried for days, secrets rotated without downtime) deliver
job.completed,job.canceled,job.expired,credits.low,credits.depletedandapi_key.spend_limit_reached;/v1/eventslists every event and redelivers one on request. - Idempotency-Key on every POST: retrying with the same key and body never repeats the work.
- The SDKs gain
jobs,webhookEndpointsandevents, a create-and-wait helper and webhook signature verification.