Facebook Pixel
API

Rate Limits

How many ConnectSafely API calls you can make, how fast, and what happens when you reach a limit. Covers request spacing, per-minute limits, daily and weekly LinkedIn action limits, custom per-account limits, response headers and every 429 error.

LinkedIn watches how each account behaves. An account that sends 50 requests in one second, or 500 connection requests in a week, does not look like a person, and LinkedIn may restrict it. Rate limits are how ConnectSafely keeps every connected account inside a safe pattern, even if your own code has a bug or a loop runs away.

This page explains every limit the API applies, what counts against each one, and what to do when you reach one.

The short version

  • Every limit is per LinkedIn account. Calls on one account never use up another account's limits.
  • There are three layers:
    1. Spacing. Calls to the same account are spaced about 3 seconds apart. You don't need to do anything for this.
    2. Per-minute limits. How many calls of one type an account can make in any 60 seconds.
    3. Daily and weekly limits. How many LinkedIn actions (connection requests, messages, comments and so on) an account can do per day or per week.
  • When you reach a limit, the API answers with HTTP status 429 and tells you when to try again. Nothing is sent to LinkedIn, and the account is not harmed.
  • You can set your own lower (or higher) daily and weekly limits for each account.

Layer 1: spacing between calls

If several calls for the same LinkedIn account arrive at the same moment, we don't send them to LinkedIn all at once. We hold each one briefly and release them one after another, about 3 to 4 seconds apart. This applies to every call to an account, reads included.

What this means for you:

  • A single call is sent straight away.
  • If you send 3 calls for one account at the same time, the first runs at once, the second about 3 seconds later, and the third about 6 seconds later. Your code just sees slower responses.
  • A call is held for at most 8 seconds. If it would have to wait longer, you get a 429 with a Retry-After header instead of a long wait.
  • Calls to different accounts run in parallel and don't wait on each other.

Tip: send calls for one account one at a time, not in parallel. You'll get the same speed with no errors.

Layer 2: per-minute limits

Each type of call has its own count per account. The minute is a rolling 60 seconds, not a clock minute: a call made at 10:00:30 frees up again at 10:01:30.

Type of callExamplesLimit per account
ActionsSend connection request, send message, comment, react, follow, visit profile, publish or schedule a post, withdraw or answer an invitation, endorse a skill15 per minute
SearchPeople, post, company and job search30 per minute
Profile readsGet profile, check relationship30 per minute
Content readsLatest posts, post comments and reactions, connections, invitations, groups, analytics, feed30 per minute
AccountAccount status, quota, activity10 per minute
Inbox readsList conversations, read messages, sync inboxNo per-minute limit
Anything elseAny endpoint not listed above30 per minute

Each type is counted separately. Reaching the search limit does not stop you from sending messages.

Inbox reads have no per-minute limit, but they still go through the spacing in layer 1.

Layer 3: daily and weekly limits

These limit the LinkedIn actions themselves. Daily limits reset at 00:00 UTC every day. The weekly limit resets at 00:00 UTC every Monday (a calendar week, not a rolling 7 days).

ActionDefault limitResetsEndpoints that count
Connection requests90 per weekMonday 00:00 UTCPOST /connect
Messages (opening messages only, see below)150 per dayDailyPOST /conversations/send, POST /messaging/send and its variants, POST /sales-nav/send, POST /message
Comments100 per dayDailyPOST /posts/comment
Reactions120 per dayDailyPOST /posts/react
Follows100 per dayDailyPOST /follow with action: follow
Unfollows100 per dayDailyPOST /follow with action: unfollow
Profile views120 per dayDailyGET /profile, POST /profile, POST /profile/visit
Relationship checks150 per dayDailyGET /relationship/...
Author country lookups100 per dayDailyPOST /profile/geo
People search1,000 per dayDailyPOST /search/people, POST /search/people/v2, POST /people/search
Post search1,000 per dayDailyPOST /search/posts/v2, POST /posts/search
Company search1,000 per dayDailyPOST /search/companies
Job search1,000 per dayDailyPOST /search/jobs
Sales Navigator search2,500 per dayDailyPeople or company search with a Sales Navigator search URL
Group members1,000 per dayDailyPOST /groups/members, POST /groups/members-by-url

All paths above are under https://api.connectsafely.ai/linkedin.

What counts, and what doesn't

  • Only actions done through ConnectSafely count. That includes your API and MCP calls, and anything ConnectSafely runs for the same account (campaigns, auto-commenting and so on). They all share one count. Things you do by hand on linkedin.com are not counted, but LinkedIn still sees them, so leave room for them.
  • Replies don't count as messages. Only opening messages count, meaning the first message to someone you don't already have a conversation with. A message counts as a reply if you pass the conversationUrn, or if we already have a conversation with that person on record.
    • If an account's inbox has never been synced, we can't see its existing conversations, so every message counts until the inbox is synced.
    • The older POST /message endpoint counts every message, replies included. Use POST /conversations/send instead.
  • Search counts pages, not results. Each page of results we fetch from LinkedIn counts as 1. A request for 25 results that needs 3 pages counts as 3.
  • Group members count per member returned. Fetching 50 members counts as 50.
  • Fetching latest posts is not a profile view. POST /posts/latest has no daily limit. Only the per-minute limit applies.
  • A profile we already have a recent copy of doesn't count. When POST /profile is answered from our saved copy, it doesn't use a profile view.
  • Failed calls don't count. The count goes up only after LinkedIn accepts the action.

Pauses after a warning from LinkedIn

Sometimes LinkedIn itself pushes back, even when you are inside our limits. When that happens we pause that one action on that one account, so you don't keep pushing against a warning:

What LinkedIn didWhat we pauseFor how long
Refused a connection request with its own rate limitConnection requestsAt least 24 hours, and until the Monday reset
Refused another action with its own rate limitThat actionUntil the daily reset at 00:00 UTC
Accepted a comment but didn't publish itComments2 hours
Accepted a reaction but didn't apply itReactions2 hours

When LinkedIn refuses an action with its own rate limit, we mark that action as used up for the current day or week. That's why it stays paused until the reset.

Everything else on the account keeps working during a pause. Reaching your own limit never starts a pause. It only stops calls until the reset or until you raise the limit.

Setting your own limits

Our defaults are a safe starting point, not a target. You can change the daily and weekly limits for each LinkedIn account on the Rate limits page in your dashboard.

  • Set a lower limit to protect the account if your own system misbehaves. For example: 80 connection requests per week, 20 comments per day. The API will refuse anything above it.
  • A raised limit applies on the very next call. There is a fixed maximum per action that no account can go above.
  • You can reset any action back to our recommended default at any time.
  • Per-minute limits are fixed. If you have a real need for more, contact support with details of what you're running.

Checking how much is left

Response headers

Responses include these headers:

HeaderMeaning
X-RateLimit-LimitThe limit that applies to this call
X-RateLimit-RemainingHow many calls or actions are left
X-RateLimit-ResetWhen the count resets (ISO 8601, UTC)
Retry-AfterOn a 429 from spacing or a per-minute limit: seconds to wait before retrying

On endpoints with a daily or weekly limit (the table in layer 3), a successful response shows the daily or weekly count in these headers. On other endpoints, they show the per-minute count.

Quota endpoint

GET /account/{accountId}/quota returns how much of each daily and weekly limit the account has used, its limit and when it resets. It doesn't call LinkedIn and doesn't use up any limit, so it's safe to poll. See Quota usage for one account.

Errors you may see

Every rate-limit error is HTTP 429 with this body:

{
  "success": false,
  "error": "Human-readable explanation"
}
Message starts withWhat it meansWhat to do
Too many requests for this LinkedIn account. Calls are spaced ~3s apartToo many calls for one account at the same time (layer 1)Wait for Retry-After, then send calls one at a time
Rate limit exceeded: 15 calls per minute for WRITE on this LinkedIn account (number and type vary)Per-minute limit reached (layer 2)Wait for Retry-After. Spread calls out
Rate limit exceeded for MESSAGE: 150/150 used. Resets at ... (action and numbers vary)Daily or weekly limit reached (layer 3)Wait until the reset time, or raise the account's limit
Connection request limit exceeded: ... blocked for 24 hoursConnection requests are paused after LinkedIn refused oneWait until holdUntil in the response
LinkedIn rate limit reached. Connection requests blocked for 24 hoursLinkedIn refused a connection request just nowWait until holdUntil. The body also has weeklyReset
LinkedIn rate limit reached. Please try again later.LinkedIn refused another action with its own rate limitSlow down and try again later
Commenting is paused for this account ...Comment pause (2 hours)Wait until holdUntil
Reactions are paused for this account ...Reaction pause (2 hours)Wait until the time in the message

Some tools, such as n8n or Zapier, replace our message with their own generic text, for example "The service is receiving too many requests from you". The status code is still 429. Open the raw response to see our message and the Retry-After header.

Handling 429 in your code

  1. When you get a 429, read Retry-After. If it's there, wait that many seconds and send the same call once more.
  2. If there is no Retry-After, it's a daily or weekly limit or a pause. Don't retry in a loop. Wait until X-RateLimit-Reset or holdUntil.
  3. Send calls for one account one after another, not in parallel.
  4. For actions such as connection requests, messages and comments, leave 30 to 90 seconds between calls, and vary the gap. Even, machine-timed gaps are one of the patterns LinkedIn notices.
async function callWithRetry(url, options) {
  const response = await fetch(url, options);
  if (response.status !== 429) return response;

  const retryAfter = Number(response.headers.get('Retry-After'));
  if (!retryAfter) return response; // daily/weekly limit or pause: don't loop

  await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
  return fetch(url, options);
}

Common questions

Is my account blocked when I get a 429? No. A 429 from ConnectSafely means we stopped the call before it reached LinkedIn. The account is fine.

Do limits add up across my accounts? No. Each LinkedIn account has its own limits. Ten accounts can each send 90 connection requests a week.

Why did I hit a limit when I haven't used the API much today? The count is shared with everything ConnectSafely runs for that account, such as campaigns and auto-commenting. Use the quota endpoint or the Rate limits page to see where it went.

Are LinkedIn's own limits the same as yours? No. LinkedIn has its own limits, which it doesn't publish, and they count everything the account does, including manual activity. Our defaults sit below what LinkedIn usually allows, so in normal use you reach ours first.

On this page