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.
No error costs credits. Most are found before anything is charged. The ones marked refunded can happen after a call has started; the credits come back at once. A call’s refund is a row in your usage ledger.
| Code | HTTP | When | What to do |
|---|---|---|---|
key_in_urlinvalid_request | 400 | 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 | 401 | No Authorization header was sent. | Send `Authorization: Bearer sf_live_…`. Create a key in the dashboard, or, from an agent, ask for one for your person with `POST /v1/signup`. |
invalid_api_keyauthentication_error | 401 | The key is unknown or was revoked. | Check the key, or create a new one. Revoked keys never come back. |
insufficient_creditspermission_error | 403 | The balance is less than the call costs. | Buy a pack on the dashboard’s billing page; calls work again at once. Nothing was charged for this call. |
account_suspendedpermission_error | 403 | The account is suspended: for a breach of the acceptable use policy, or while a payment is disputed. Every key of the account is paused, and no new key can be made. | Reply to the email that told you why, or write to support. The keys work again as soon as the account is resumed. Nothing is charged while it is suspended. |
scope_not_allowedpermission_error | 403 | 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 | 403 | `fresh=true` on an account that has never bought credits, or in the demo. | Trial credits are cache-first. Buy any amount of credits to bypass the cache. |
disposable_emailinvalid_request | 400 | Signup with a throwaway mailbox provider. | Use an address you will still have next month. |
signup_rate_limitpermission_error | 403 | 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 | 400 | 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 | 400 | 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 | 400 | A sign-in link older than 15 minutes, or a confirmation link older than 24 hours. | Ask for a new one from the sign-in page; it goes to the same address. |
email_rate_limitpermission_error | 403 | 5 emails to one inbox in an hour from one network, or 10 from all networks together. A request we refuse sends nothing and is not counted. A browser that has signed in to that address before is not held to this. | Check that inbox and its spam folder for the ones already sent, or try again in an hour, or from the browser you last signed in with. |
sign_in_rate_limitpermission_error | 403 | 10 sign-in emails from one address in an hour. | Check your inbox and spam folder for the ones already sent — each works for 15 minutes. |
account_closedpermission_error | 403 | 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. |
key_limitpermission_error | 403 | The account already has as many active keys as it may: an agent's approved request makes one more. | Revoke a key you no longer use on the Keys page, then ask the agent to check again. |
unverified_accountpermission_error | 403 | 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 | 404 | The path is not one of the documented endpoints. | See the endpoint list at /docs. Paths are `/v1/{surface}/{resource}`. |
missing_parameterinvalid_request | 400 | A required parameter was not given. | The message names it. Every parameter is documented on the endpoint page. |
missing_one_ofinvalid_request | 400 | An endpoint that accepts either of two identifiers got neither. | Give exactly one of the parameters the message names. |
invalid_parameterinvalid_requestrefunded | 400 | A parameter was the wrong type, out of range, not in the form it takes (an id, a username, a URL on the platform), over 2,048 characters, not a parameter of the endpoint, or sent with the other one of its pair. | The message names the parameter and says what was expected and what arrived. |
invalid_jsoninvalid_request | 400 | A POST body, to `/v1/signup`, is not valid JSON. | Send one JSON object, with `Content-Type: application/json`. The message gives the parser’s reason. |
invalid_cursorinvalid_requestrefunded | 400 | The cursor was not issued for this query, or its page has expired: pages are kept as long as the answer is cached, hours rather than days. | Pass `meta.next_cursor` from the previous page verbatim and soon, or start again from the first page. |
profile_not_foundnot_foundrefunded | 404 | No account, person or company page exists for that username or URL. | Check the username. Usernames are case-insensitive and exclude the leading @. |
place_not_foundnot_foundrefunded | 404 | 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_foundrefunded | 404 | 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. |
signup_not_foundnot_found | 404 | No sign-up request has that id. | Send the `id` that `POST /v1/signup` returned as `Authorization: Bearer …`, exactly as it was. A request that has expired says `expired`; start a new one. |
post_not_foundnot_foundrefunded | 404 | No post or video exists at that URL or id. | The post may have been deleted or made private. |
posting_not_foundnot_foundrefunded | 404 | No LinkedIn job posting exists for that id or URL. | Job ids come from a search. A posting that was filled or taken down stops resolving. |
group_not_foundnot_found | 404 | No LinkedIn group exists for that id or URL. | Group ids come from `linkedin/groups`. A group that was closed stops resolving. |
ad_not_foundnot_found | 404 | No ad with that id is in LinkedIn's Ad Library. | Ad ids come from `linkedin/ads`. An ad LinkedIn has taken out of its library stops resolving. |
community_not_foundnot_found | 404 | No X community exists at that URL or id. | Check the number in `https://x.com/i/communities/<id>`. A community that was removed stops resolving. |
endpoint_busyrate_limitrefunded | 429 | The call waited in line for a place among this endpoint's calls at once, which all customers share, and its turn did not come within its time. It can happen before your own limit. | Retry after the seconds in `Retry-After`. Nothing was charged. |
concurrency_limitrate_limit | 429 | 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. |
method_not_allowedmethod_not_allowed | 405 | The path does not take that HTTP method: a read is a GET, and only an agent's sign-up is a POST. | Use a method from the `Allow` header, which lists what the path takes. |
not_found_limitrate_limit | 429 | 1000 calls in an hour that found nothing, or 50 on an account that has not bought credits. Only "does not exist" answers count, never a failure of ours. They cost nothing, but each one reached the source. | Check the names, URLs and ids you send, and retry after the seconds in `Retry-After`. The same call for something that does not exist answers again from the cache for up to 6 hours, free, and does not count. |
demo_limitrate_limit | 429 | About 60 demo calls a minute came from one address. | Wait the seconds in `Retry-After`, or add an API key: keyed calls are limited by concurrency, not by rate. |
not_available_yetnot_available | 501 | The endpoint, or one of its options, is documented but not live yet. | Leave the option out, or wait for the endpoint. Nothing was charged, and its documentation page says so while it lasts. |
| 502 | We could not get the answer from the platform: every source we asked failed, most often within a second or two, or the call ran out of its 25 seconds. The message says which, without the detail. | Retry. This call was not charged, and the refund is already in your usage ledger. When the message says the endpoint has no capacity left, retrying will not help until our status page says it is back. | |
internal_errorinternal_errorrefunded | 500 | Something broke on our side. | This call was not charged. If it repeats, send us the request_id. |