Delete (recall) a message
Recall a message you sent. The message is first recalled on LinkedIn (source of truth); only on success is it soft-deleted locally so a later sync never re-surfaces the recalled tombstone. Other connected clients/tabs are notified via WebSocket. Matching is by the prefix-independent normalized message id, so the stored row is removed even if it was synced under a different mailbox prefix.
Send message (with channel selection)
Send a LinkedIn message. By default, messagingChannel is "auto" which auto-detects whether to use Sales Navigator or standard LinkedIn inbox based on the account premium status. Users can explicitly control the messaging channel by setting messagingChannel to: "sales_navigator" — forces the message through the Sales Navigator API (returns a 400 error if the account does not have an active Sales Navigator subscription), or "linkedin_inbox" — forces standard LinkedIn messaging even if the account has Sales Navigator. Example: to send via standard inbox on a Sales Nav account, pass { "messagingChannel": "linkedin_inbox" }. To explicitly use Sales Navigator, pass { "messagingChannel": "sales_navigator" }. If omitted or set to "auto", the system decides automatically. File attachments: first upload each file via POST /conversations/upload-attachment, then pass each returned attachment object in the `attachments` array, each wrapped in a `file` key — `{ "attachments": [{ "file": { "assetUrn": "...", "byteSize": 123, "mediaType": "image/png", "name": "photo.png" } }] }`. An attachment whose file was uploaded with an image/* content type renders inline as a photo, and one uploaded with a video/* content type (e.g. video/mp4) renders as a playable video; anything else renders as a downloadable file. Rate limit: 150 NEW conversations per day per LinkedIn account (resets at midnight UTC). The quota applies to cold outreach only — a message that starts a conversation with someone this account has no existing thread with. Replying inside an existing conversation is unlimited, whether you pass `conversationUrn` or a recipient this account has already messaged. Over-quota cold sends return 429 with `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` headers, and are rejected before any LinkedIn request is made. Do not read the rate-limit headers on a reply as the daily quota. An exempt reply never touches the daily counter, so the headers it carries come from the general per-minute API throttle instead (write endpoints: 15 requests/minute per user, reset under a minute). A `X-RateLimit-Limit` of 15 with a reset about a minute out therefore means the request was NOT counted against the 150/day.