Write safety

The breakers Swarmhit keeps against a runaway client.

Your application paces: warm-up, daily limits and schedules are yours. Swarmhit only refuses what a runaway client would do. Every refusal happens before anything reaches LinkedIn or WhatsApp, so retrying it can never send twice.

LinkedIn, per account

  • One write at a time. A write waits at most 15 seconds for the account, then answers 429 account-busy.
  • A minimum gap between two writes, 20 seconds. A write too soon answers 429 account-busy at once, with retry_after_ms; the gap counts from the last attempt, accepted or not.
  • Daily caps per kind (UTC day): invitations 100, messages 300, InMail 100, reactions 100, comments 100, follows 100, withdrawals 300, accepts 100, profile visits 300. Over a cap: 429 safety-floor, with retry_after_ms until the next UTC midnight. The caps sit well above any sane pacing: meeting one means your pacing is broken.
  • LinkedIn's own limit. After LinkedIn answers 429 or 999, the account rests 20 minutes (doubling on repeats within a day, up to 6 hours); every call meanwhile answers 429 rate-limited with retry_after_ms. Five writes in a row that LinkedIn rejects for no known reason cool it down the same way.

WhatsApp, per number

  • Daily caps of 40 new chats, 500 messages and 300 "is this number on WhatsApp" checks (429 safety-floor).
  • At least 60 seconds between two new chats (429 account-busy, with retry_after_ms).
  • WhatsApp's own limits come back as 403 whatsapp-new-chats-blocked and 422 whatsapp-quota-reached.

Two guards worth using

  • unless_replied_since (ISO date or epoch ms) on a send: if the recipient wrote after that time, nothing is sent and the call answers 409 recipient-replied. Use it on every automated follow-up.
  • client_id on a WhatsApp send: your id for that send. A retry with the same id within 24 hours returns the first answer instead of sending again.

On this page