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:
- Spacing. Calls to the same account are spaced about 3 seconds apart. You don't need to do anything for this.
- Per-minute limits. How many calls of one type an account can make in any 60 seconds.
- 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
429with aRetry-Afterheader 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 call | Examples | Limit per account |
|---|---|---|
| Actions | Send connection request, send message, comment, react, follow, visit profile, publish or schedule a post, withdraw or answer an invitation, endorse a skill | 15 per minute |
| Search | People, post, company and job search | 30 per minute |
| Profile reads | Get profile, check relationship | 30 per minute |
| Content reads | Latest posts, post comments and reactions, connections, invitations, groups, analytics, feed | 30 per minute |
| Account | Account status, quota, activity | 10 per minute |
| Inbox reads | List conversations, read messages, sync inbox | No per-minute limit |
| Anything else | Any endpoint not listed above | 30 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).
| Action | Default limit | Resets | Endpoints that count |
|---|---|---|---|
| Connection requests | 90 per week | Monday 00:00 UTC | POST /connect |
| Messages (opening messages only, see below) | 150 per day | Daily | POST /conversations/send, POST /messaging/send and its variants, POST /sales-nav/send, POST /message |
| Comments | 100 per day | Daily | POST /posts/comment |
| Reactions | 120 per day | Daily | POST /posts/react |
| Follows | 100 per day | Daily | POST /follow with action: follow |
| Unfollows | 100 per day | Daily | POST /follow with action: unfollow |
| Profile views | 120 per day | Daily | GET /profile, POST /profile, POST /profile/visit |
| Relationship checks | 150 per day | Daily | GET /relationship/... |
| Author country lookups | 100 per day | Daily | POST /profile/geo |
| People search | 1,000 per day | Daily | POST /search/people, POST /search/people/v2, POST /people/search |
| Post search | 1,000 per day | Daily | POST /search/posts/v2, POST /posts/search |
| Company search | 1,000 per day | Daily | POST /search/companies |
| Job search | 1,000 per day | Daily | POST /search/jobs |
| Sales Navigator search | 2,500 per day | Daily | People or company search with a Sales Navigator search URL |
| Group members | 1,000 per day | Daily | POST /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 /messageendpoint counts every message, replies included. UsePOST /conversations/sendinstead.
- 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/latesthas no daily limit. Only the per-minute limit applies. - A profile we already have a recent copy of doesn't count. When
POST /profileis 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 did | What we pause | For how long |
|---|---|---|
| Refused a connection request with its own rate limit | Connection requests | At least 24 hours, and until the Monday reset |
| Refused another action with its own rate limit | That action | Until the daily reset at 00:00 UTC |
| Accepted a comment but didn't publish it | Comments | 2 hours |
| Accepted a reaction but didn't apply it | Reactions | 2 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:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | The limit that applies to this call |
X-RateLimit-Remaining | How many calls or actions are left |
X-RateLimit-Reset | When the count resets (ISO 8601, UTC) |
Retry-After | On 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 with | What it means | What to do |
|---|---|---|
Too many requests for this LinkedIn account. Calls are spaced ~3s apart | Too 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 hours | Connection requests are paused after LinkedIn refused one | Wait until holdUntil in the response |
LinkedIn rate limit reached. Connection requests blocked for 24 hours | LinkedIn refused a connection request just now | Wait until holdUntil. The body also has weeklyReset |
LinkedIn rate limit reached. Please try again later. | LinkedIn refused another action with its own rate limit | Slow 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
- When you get a
429, readRetry-After. If it's there, wait that many seconds and send the same call once more. - If there is no
Retry-After, it's a daily or weekly limit or a pause. Don't retry in a loop. Wait untilX-RateLimit-ResetorholdUntil. - Send calls for one account one after another, not in parallel.
- 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.
API Overview
Complete guide to the ConnectSafely API including authentication, rate limits, error handling, and endpoint groups for LinkedIn automation and data retrieval.
LinkedIn Account API
Manage LinkedIn account status via API. Monitor account health, check premium status, and track activity history for safe automation.
