- Changed
API contract changes
Contract changes (28)
endpoint facebook.post added (/v1/facebook/post)resource post: field platform_specific.facebook addedresource post: field platform_specific.facebook.feedback_id addedresource post: field platform_specific.facebook.video_id addedresource post: field platform_specific.facebook.reactions addedresource post: field platform_specific.facebook.reactions[].type addedresource post: field platform_specific.facebook.reactions[].count addedresource post: field platform_specific.facebook.shared_post addedresource post: field platform_specific.facebook.shared_post.id addedresource post: field platform_specific.facebook.shared_post.url addedresource post: field platform_specific.facebook.shared_post.author addedresource post: field platform_specific.facebook.shared_post.author.id addedresource post: field platform_specific.facebook.shared_post.author.username addedresource post: field platform_specific.facebook.shared_post.author.display_name addedresource post: field platform_specific.facebook.shared_post.author.url addedresource post: field platform_specific.facebook.shared_post.author.avatar_url addedresource post: field platform_specific.facebook.shared_post.author.is_verified addedresource post: field platform_specific.facebook.link addedresource post: field platform_specific.facebook.link.url addedresource post: field platform_specific.facebook.link.title addedresource post: field platform_specific.facebook.link.image_url addedMCP tool get_post: platform facebook addedendpoint threads.profile added (/v1/threads/profile)resource profile: field platform_specific.threads addedresource profile: field platform_specific.threads.interest_tags addedresource profile: field platform_specific.threads.verified_link_urls addedMCP tool find_endpoint: platform threads addedMCP tool get_profile: platform threads added
- Added
Threads profiles
GET /v1/threads/profilereturns a public Threads account. Send a username with or without the @, the account's numeric id, or a threads.com or threads.net profile link, including the replies, reposts and media tabs.Follower counts are the exact integer Threads publishes. The response also lists the topic labels Threads shows on the profile and which bio links Threads marks verified. A private account's public header comes back with
is_privatetrue. An unknown account isnot_found, and a post link is refused.Contract changes (48)
operation GET /v1/security_events added (security_events.list)route session.create: param body.agent_token addeddocs path agent_confirm added (/agent/confirm/)docs path check_email added (/signup/check-email/)docs path forgot_password added (/signin/forgot/)docs path reset_password added (/signin/reset/)docs path security added (/security/)docs path signin added (/signin/)docs path start added (/start/)docs path two_factor added (/signin/two-factor/)docs path verify_email added (/signup/verify/)breaking (accepted): operation POST /v1/signup removedbreaking (accepted): route session.create: auth changed none → sessionbreaking (accepted): route session.create: scope changed "" → "account:read"breaking (accepted): route session.create: param body.token removedbreaking (accepted): docs path signup_confirm (/signup/confirm/) removedendpoint instagram.posts added (/v1/instagram/posts)MCP tool list_posts: platform instagram addedresource post: field platform_specific.instagram addedresource post: field platform_specific.instagram.is_ai_generated addedendpoint facebook.post added (/v1/facebook/post)resource post: field platform_specific.facebook addedresource post: field platform_specific.facebook.feedback_id addedresource post: field platform_specific.facebook.video_id addedresource post: field platform_specific.facebook.reactions addedresource post: field platform_specific.facebook.reactions[].type addedresource post: field platform_specific.facebook.reactions[].count addedresource post: field platform_specific.facebook.shared_post addedresource post: field platform_specific.facebook.shared_post.id addedresource post: field platform_specific.facebook.shared_post.url addedresource post: field platform_specific.facebook.shared_post.author addedresource post: field platform_specific.facebook.shared_post.author.id addedresource post: field platform_specific.facebook.shared_post.author.username addedresource post: field platform_specific.facebook.shared_post.author.display_name addedresource post: field platform_specific.facebook.shared_post.author.url addedresource post: field platform_specific.facebook.shared_post.author.avatar_url addedresource post: field platform_specific.facebook.shared_post.author.is_verified addedresource post: field platform_specific.facebook.link addedresource post: field platform_specific.facebook.link.url addedresource post: field platform_specific.facebook.link.title addedresource post: field platform_specific.facebook.link.image_url addedMCP tool get_post: platform facebook addedendpoint threads.profile added (/v1/threads/profile)resource profile: field platform_specific.threads addedresource profile: field platform_specific.threads.interest_tags addedMCP tool find_endpoint: platform threads addedMCP tool get_profile: platform threads addedresource profile: field platform_specific.threads.verified_link_urls added
- Changed
API contract changes
Contract changes (100)
endpoint youtube.posts added (/v1/youtube/posts)MCP tool list_posts addedendpoint tiktok.post added (/v1/tiktok/post)resource post: field platform_specific.tiktok addedresource post: field platform_specific.tiktok.author_sec_uid addedresource post: field platform_specific.tiktok.country_code addedresource post: field platform_specific.tiktok.is_ad addedresource post: field platform_specific.tiktok.is_ai_generated addedresource post: field platform_specific.tiktok.location addedresource post: field platform_specific.tiktok.location.id addedresource post: field platform_specific.tiktok.location.name addedresource post: field platform_specific.tiktok.location.address addedresource post: field platform_specific.tiktok.location.city addedresource post: field platform_specific.tiktok.location.category addedresource post: field platform_specific.tiktok.music addedresource post: field platform_specific.tiktok.music.id addedresource post: field platform_specific.tiktok.music.title addedresource post: field platform_specific.tiktok.music.author_name addedresource post: field platform_specific.tiktok.music.is_original addedresource post: field platform_specific.tiktok.music.duration_ms addedresource post: field platform_specific.tiktok.music.cover_url addedresource post: field platform_specific.tiktok.music.play_url addedMCP tool get_post: platform tiktok addedendpoint tiktok.posts added (/v1/tiktok/posts)MCP tool list_posts: platform tiktok addedendpoint tiktok.comments added (/v1/tiktok/comments)resource comment: field platform_specific.tiktok addedresource comment: field platform_specific.tiktok.language addedMCP tool list_comments: platform tiktok addedendpoint instagram.profile added (/v1/instagram/profile)resource profile: field platform_specific.instagram addedresource profile: field platform_specific.instagram.fbid addedresource profile: field platform_specific.instagram.is_memorialized addedresource profile: field platform_specific.instagram.is_story_live addedresource profile: field platform_specific.instagram.is_highlights_shown addedresource profile: field platform_specific.instagram.pronouns addedMCP tool get_profile: platform instagram addedendpoint rumble.search_posts added (/v1/rumble/search_posts)resource post: field platform_specific.rumble addedresource post: field platform_specific.rumble.dislike_count addedresource post: field platform_specific.rumble.author_follower_count addedresource post: field platform_specific.rumble.is_age_restricted addedresource post: field platform_specific.rumble.is_live_now addedresource post: field platform_specific.rumble.concurrent_viewer_count addedresource post: field platform_specific.rumble.live_started_at addedresource post: field platform_specific.rumble.scheduled_start_at addedMCP tool find_endpoint: platform rumble addedMCP tool search: argument duration addedMCP tool search: platform rumble addedMCP tool search: argument sort addedMCP tool search: argument tab addedMCP tool search: type posts addedendpoint rumble.post added (/v1/rumble/post)resource post: field platform_specific.rumble.embed_id addedresource post: field platform_specific.rumble.embed_url addedresource post: field platform_specific.rumble.numeric_id addedresource post: field platform_specific.rumble.category addedresource post: field platform_specific.rumble.secondary_category addedresource post: field platform_specific.rumble.keywords addedresource post: field platform_specific.rumble.caption_tracks addedresource post: field platform_specific.rumble.caption_tracks[].language addedresource post: field platform_specific.rumble.caption_tracks[].label addedresource post: field platform_specific.rumble.caption_tracks[].url addedresource post: field platform_specific.rumble.caption_tracks[].is_auto_generated addedresource post: field platform_specific.rumble.files addedresource post: field platform_specific.rumble.files[].kind addedresource post: field platform_specific.rumble.files[].format addedresource post: field platform_specific.rumble.files[].url addedresource post: field platform_specific.rumble.files[].width addedresource post: field platform_specific.rumble.files[].height addedresource post: field platform_specific.rumble.files[].bitrate_kbps addedresource post: field platform_specific.rumble.files[].size_bytes addedMCP tool get_post: platform rumble addedendpoint rumble.transcript added (/v1/rumble/transcript)resource transcript: field platform_specific.rumble addedresource transcript: field platform_specific.rumble.track_label addedresource transcript: field platform_specific.rumble.caption_url addedresource transcript: field platform_specific.rumble.caption_tracks addedresource transcript: field platform_specific.rumble.caption_tracks[].language addedresource transcript: field platform_specific.rumble.caption_tracks[].label addedresource transcript: field platform_specific.rumble.caption_tracks[].url addedresource transcript: field platform_specific.rumble.caption_tracks[].is_auto_generated addedMCP tool get_transcript: platform rumble addedendpoint rumble.profile added (/v1/rumble/profile)resource profile: field platform_specific.rumble addedresource profile: field platform_specific.rumble.account_type addedresource profile: field platform_specific.rumble.numeric_id addedresource profile: field platform_specific.rumble.user_id addedMCP tool get_profile: platform rumble addedendpoint rumble.comments added (/v1/rumble/comments)resource comment: field platform_specific.rumble addedresource comment: field platform_specific.rumble.dislike_count addedresource comment: field platform_specific.rumble.author_badges addedMCP tool list_comments: platform rumble addedendpoint rumble.posts added (/v1/rumble/posts)MCP tool list_posts: argument duration addedMCP tool list_posts: platform rumble addedendpoint rumble.posts: param since addedendpoint rumble.posts: param until addedendpoint rumble.posts: pages emptied by since/until are free
- Changed
Sign in with Google, GitHub or a password, and two-factor authentication
The dashboard has a new sign-in.
- Sign up and sign in with Google, GitHub, or an email address and a password (the address is verified first).
The emailed sign-in links are gone:
POST /v1/signupis removed, andPOST /v1/sessionis now the dashboard's setup call once you are signed in. - Two-factor authentication with an authenticator app and backup codes, for every way of signing in.
- Security settings: your sign-in methods, password, sessions (sign out any of them), and a log of sign-ins and
security changes (
GET /v1/security_events). - AI agents still sign up with
POST /v1/agent_signup. To activate an agent's live key, its human now signs in (or signs up) with the address the agent used and approves the agent.
Contract changes (38)
error code insufficient_credits: details key purchase_url addederror code insufficient_credits: details key checkout addederror code unknown_endpoint added (HTTP 404)warning code test_default_example addedMCP tool create_job: argument detail addedMCP tool create_job: argument idempotency_key addedMCP tool list_job_results addedresource ad: field platform_specific addedresource comment: field platform_specific addedresource post: field platform_specific addedresource profile: field platform_specific addedresource transcript: field platform_specific addedendpoint youtube.profile added (/v1/youtube/profile)resource profile: field platform_specific.youtube addedresource profile: field platform_specific.youtube.keywords addedresource profile: field platform_specific.youtube.is_official_artist_channel addedMCP tool get_profile: platform youtube addedresource profile: field platform_specific.youtube.is_subscriber_count_hidden addedresource profile: field platform_specific.youtube.is_business_email_listed addedbreaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/apix ⇒ username apixbreaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/cx ⇒ username cxbreaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/jobsx ⇒ username jobsxbreaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/livex ⇒ username livexbreaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/logoutx ⇒ username logoutxbreaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/select_sitex ⇒ username select_sitexbreaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/sx ⇒ username sxbreaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/testtubex ⇒ username testtubexbreaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/trendsx ⇒ username trendsxbreaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/tx ⇒ username txbreaking (accepted): endpoint youtube.profile: no longer accepts https://www.youtube.com/ytx ⇒ username ytxoperation POST /v1/docs_feedback added (docs_feedback.create)MCP tool read_doc addedMCP tool search_docs addeddocs path api_catalog added (/.well-known/api-catalog)docs path endpoint_reference added (/docs/reference/{platform}/{name}/)docs path not_found_markdown added (/404.md)docs path search_index added (/search.json)docs path skill added (/skill.md)
- Sign up and sign in with Google, GitHub, or an email address and a password (the address is verified first).
The emailed sign-in links are gone:
- Added
Self-serve signup, test keys, API key management and usage
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 (115)
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 addedendpoint facebook.search_ads: param lang addedshared param status addedMCP tool search: argument lang addedbreaking (accepted): endpoint facebook.search_ads: param status default changed "" → "all"warning code partial_data addedmeta: field warnings[].fields addedresource ad: field unknown_fields addedresource comment: field unknown_fields addedresource post: field unknown_fields addedresource profile: field unknown_fields addeddocs path pricing_feed added (/pricing.json)
- 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
- Changed
Request conventions, richer errors and response metadata
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.
- Unknown parameters are rejected with
- Added
Background jobs and batches, webhooks, events and Idempotency-Key
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.
- Jobs:
Changelog
What's new
Every change to the API, newest first. Changes within /v1 are additive: anything that would break a client is announced here first, with a sunset date.