Send LinkedIn message
Input
dry_run optionalWhen true, everything runs — the recipient is resolved, the attachment is staged and confirmed in the composer, and the text is typed — then the run stops before the Send click. Nothing is delivered: sent comes back false and dry_run true. Use it to verify a recipient, a message and an attachment are accepted without messaging a real person.
message optionalThe message text to send. Optional if an attachment or fileBase64 is given; required (non-empty) otherwise.
filename optionalFilename to attach it as, e.g. photo.png. Required when fileBase64 is set; not used by the attachment input, which is stored under its own name.
mimeType optionalMIME type of the attachment. Inferred from the filename extension when omitted. Applies to fileBase64 only.
recipient optionalStart/continue a conversation by the person's display name (e.g. "Jane Doe"). Every match the compose typeahead offers is checked against this name token-by-token (accent/case-insensitive) and the first one that matches is used, so a group conversation or another person ranked above your target does not block the send. A multi-word name must be contained in the match, and a single-word name only passes on an exact full-name match: "Chris" resolving to "Chris Anderson" is refused rather than messaging the wrong person. A name that matches nobody messageable (a misspelling, someone who is not a 1st-degree connection, or your own name) is refused as such. Prefer profileUrl when you have it. Pass exactly one of threadUrl, profileUrl or recipient.
threadUrl optionalReply in an existing conversation: its /messaging/thread/<id>/ URL (from list_inbox). LinkedIn thread ids can rotate over time, so fetch this fresh via list_inbox immediately before use rather than caching it long-term. Pass exactly one of threadUrl, profileUrl or recipient.
attachment optionalA file to attach (image or document), supplied as a file rather than base64. Preferred over fileBase64: it carries no payload size ceiling. The file is attached under the name 'attachment', since a file input's key is its stored filename.
fileBase64 optionalFile contents to attach, base64-encoded (no data: prefix). Fallback for callers that cannot bind a file; prefer the attachment input. Combine with message for accompanying text.
profileUrl optionalStart/continue a conversation by the person's LinkedIn profile URL (from list_inbox's participants[].profileUrl, search_people, or get_profile), e.g. https://www.linkedin.com/in/<id>. Preferred over recipient: resolves the exact person directly with no name-search ambiguity. Pass exactly one of threadUrl, profileUrl or recipient.
Output
sent requiredFalse on a dry run, where nothing was delivered.
dry_run optionalTrue when this run stopped before the Send click. The attachment was still staged and confirmed, and the text still typed.
message optionalfilename optionalrecipient optionalThe conversation counterpart LinkedIn actually resolved. Confirm it's who you meant.
threadUrl optionalThe conversation's /messaging/thread/<id>/ URL when the page landed on one; null in compose-overlay flows (never a compose URL).
attachmentVisible optionalTrue when the newly sent message renders an image or the filename, confirming the attachment landed rather than only that a message was sent. Null when no attachment was requested, and null on a dry run, where nothing was sent to inspect — the composer preview check is what proves staging there.
