Error codes
Every code the API can return, when it happens and what to do about it. Branch on the code — it is stable. The message is written for a human and may change.
Codes marked refunded cost nothing: the credits are returned automatically and the reversal appears in your usage ledger.
| Code | When | What to do |
|---|---|---|
key_in_urlinvalid_request | The key was sent as `?api_key=` in the URL. | Send it in the `Authorization: Bearer …` header. A key that has been in URLs may be in someone's logs: consider revoking it. |
missing_api_keyauthentication_error | No Authorization header was sent. | Send `Authorization: Bearer sf_live_…`. Create a key in the dashboard. |
invalid_api_keyauthentication_error | The key is unknown or was revoked. | Check the key, or create a new one. Revoked keys never come back. |
insufficient_creditspermission_error | The account is out of credits. | Buy a pack on the dashboard’s billing page; calls work again at once. Nothing was charged for this call. |
scope_not_allowedpermission_error | The key is scoped to some surfaces and this is not one of them. | Use a key with the surface in its scopes, or widen the key. |
fresh_not_availablepermission_error | `fresh=true` on an account that has never bought credits. | Trial credits are cache-first. Buy any amount of credits to bypass the cache. |
disposable_emailinvalid_request | Signup with a throwaway mailbox provider. | Use an address you will still have next month. We send one verification email and then only write when something breaks. |
signup_rate_limitpermission_error | Too many signups from one address in an hour. | Email us if you genuinely need several keys — we will just make them. |
invalid_linkinvalid_request | A sign-in or confirmation link that is not ours. | Check you copied the whole link — mail apps sometimes break long links across lines — or ask for a new one from the sign-in page. |
link_usedinvalid_request | A sign-in or confirmation link opened a second time. | Links work once. Ask for a new one from the sign-in page. |
link_expiredinvalid_request | A sign-in link older than fifteen minutes, or a confirmation link older than a day. | Ask for a new one from the sign-in page; it goes to the same address. |
email_rate_limitpermission_error | Five emails to one inbox in an hour, however many callers asked for them. | Check that inbox and its spam folder for the ones already sent, or try again in an hour. |
sign_in_rate_limitpermission_error | Ten sign-in emails from one address in an hour. | Check your inbox and spam folder for the ones already sent — each works for fifteen minutes. |
account_closedpermission_error | Signing in to, or signing up with, an account that has been closed. | Email us if you want it back. A closed account is not reopened by signing up again. |
unverified_accountpermission_error | Calling the API before confirming your email address. | Open the link we emailed. Confirming the address adds the trial credits and signs you in. |
unknown_endpointnot_found | The path is not one of the documented endpoints. | See the endpoint list at /docs. Paths are `/v1/{surface}/{resource}`. |
missing_parameterinvalid_request | A required parameter was not given. | The message names it. Every parameter is documented on the endpoint page. |
missing_one_ofinvalid_request | An endpoint that accepts either of two identifiers got neither. | Give exactly one of the parameters the message names. |
invalid_parameterinvalid_request | A parameter was the wrong type or out of range. | The message says what was expected and what arrived. |
invalid_cursorinvalid_request | The cursor was not one we issued. | Pass `meta.next_cursor` from the previous page verbatim, or omit it. |
profile_not_foundnot_found | No account exists for that username or URL. | Check the username. Usernames are case-insensitive and exclude the leading @. |
place_not_foundnot_found | No place exists for that id or URL. | Place ids come from a search. A place that has closed permanently may stop resolving. |
subject_suppressednot_found | The account or place asked us not to serve it, and we do not. | Nothing to fix on your side, and nothing was charged. In a list, rows about them are left out. |
results_expirednot_found | A batch job finished more than seven days ago, and its results were deleted, as the privacy notice says. | Run the job again. Download results within seven days of a job finishing. |
post_not_foundnot_found | No post or video exists at that URL or id. | The post may have been deleted or made private. |
concurrency_limitrate_limit | More requests are in flight than the account allows. | Retry after the seconds in `Retry-After`. Concurrency is what we limit, not requests per second, and it rises with credits purchased. |
| We could not complete the fetch in time. | Retry. This call was not charged, and the refund is already in your usage ledger. | |
internal_errorinternal_errorrefunded | Something broke on our side. | This call was not charged. If it repeats, send us the request_id. |