Skip to content

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."
}
}
  • type is stable. Branch on it in code.
  • message is 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.
  1. 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 reject policy).
  2. On the job, when a queued action fails later: the job’s status is failed and job.error has the same { type, message, next } shape. Guardrails such as doNotContact and duplicateContent, and LinkedIn’s own answers, usually arrive this way. You also get a job.failed webhook.
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.