Errors
Every error has the same shape:
{ "ok": false, "error": { "type": "lowQualityTarget", "message": "Ida Lind scores 22/100 for a cold invitation (3rd-degree connection, no shared connections).", "next": "Find a warm path (a shared connection or an intro), engage with their content first, or lower minInviteQuality for this account." }}typeis stable. Branch on it in code.messageis written for people. Show it as is.next, when present, says what to do. Follow it rather than retrying blindly.- Validation errors also carry
issues, the list of problems with the request body.
Two places errors show up
Section titled “Two places errors show up”- On the request, as an HTTP error: bad input, a bad key, a rate limit, or a command that can never run right now (account paused, budget exhausted, outside working hours with the
rejectpolicy). - On the job, when a queued action fails later: the job’s
statusisfailedandjob.errorhas the same{ type, message, next }shape. Guardrails such asdoNotContactandduplicateContent, and LinkedIn’s own answers, usually arrive this way. You also get ajob.failedwebhook.
Error types and HTTP status
Section titled “Error types and HTTP status”type |
HTTP | When |
|---|---|---|
invalidParams |
400 | The input failed validation, or names something that doesn’t exist (such as an unknown account). Some lookups (GET /v1/jobs/{id}, approvals, webhooks) answer 404 with this type. |
unauthorized |
401 | Missing, unknown or revoked credential. |
totpRequired |
401 | A signed-in person still has to enter their two-factor code. |
notAllowed |
403 / 422 | 403 when a member calls an owner/admin endpoint. 422 for other refusals, such as all seats in use or cookie connect not enabled. |
notFound |
404 | Malformed id, or LinkedIn couldn’t find a post, invitation or account. |
personNotFound |
404 | LinkedIn couldn’t find that person. |
companyNotFound |
404 | LinkedIn couldn’t find that company. |
chatNotFound |
404 | No such conversation. |
accountNotReady |
409 | The account hasn’t finished connecting. |
reconnectionRequired |
409 | LinkedIn signed the account out; a person must reconnect it. |
accountPaused |
409 | The account is paused (by a person or by the health ladder). |
outsideWorkingHours |
409 | Outside the account’s working hours and its off-hours policy is reject. |
limitExceeded |
429 | The account’s Linnia budget for this kind of action is used up. |
linkedinLimitReached |
429 | LinkedIn’s own limit was hit. The category cools down. |
linkedinThrottled |
429 | LinkedIn slowed the account down. |
rateLimited |
429 | Too many API requests for this key. See Rate limits. |
alreadyConnected |
422 | Already a 1st-degree connection. next suggests send_message. |
alreadyInvitedRecently |
422 | LinkedIn won’t allow another invitation to this person yet. |
invitationPending |
422 | An invitation to this person is already pending. |
notConnected |
422 | Messaging needs a connection (or inmail: true). |
cannotInvite |
422 | LinkedIn doesn’t allow inviting this person. |
recipientUnavailable |
422 | The person can’t receive this message. |
alreadyDone |
422 | Already done (for example already endorsed). |
connectionCapReached |
422 | The account hit LinkedIn’s connection cap. |
noInmailCredits |
422 | No InMail credits left. |
lowQualityTarget |
422 | Blocked by the invitation quality gate (minInviteQuality). |
duplicateContent |
422 | Same text already sent to this person, or too many near-identical messages today. |
doNotContact |
422 | The person is on your do-not-contact list. |
recentlyContactedByColleague |
422 | A colleague contacted this person in the last 30 days. |
accountRestricted |
422 | LinkedIn restricted the account. |
featureUnavailable |
422 | The account’s LinkedIn plan doesn’t include this (for example Sales Navigator features). |
linkedinError |
422 | LinkedIn returned an error Linnia couldn’t classify. |
unexpectedError |
500 | Something went wrong on Linnia’s side. Safe to retry later. |
providerUnavailable |
503 | Linnia’s LinkedIn provider is unavailable. Retry later. |
providerTimeout |
504 | The request to LinkedIn timed out. Linnia checks whether it went through before retrying. |