---
title: "Send Linkedin Action"
method: POST
path: "/api/linkedin/send"
tags: ["linkedin"]
---

# Send Linkedin Action

`POST /api/linkedin/send`

## Request

- Base URL: `https://platform.verbiflow.com/api/bridge`
- URL: `https://platform.verbiflow.com/api/bridge/api/linkedin/send`
- Auth: one of:
  - HTTP bearer and API key in header `x-flage-org-id`
  - HTTP bearer and API key in header `x-flage-org-slug`

Queue a manual LinkedIn connect / message.

The endpoint never calls Unipile directly. It validates the request,
resolves the sender, and writes a `pending` row to
`outbound_send_intents`. Its durable Temporal workflow performs the actual
send after shared pacing and quota checks, then updates the intent to
`sent` or `failed`. Callers can poll the intent for status.

## Request body

- LinkedInSendRequest
  - `action` 'connect' | 'message', required: `connect` for a connection request, `message` for a chat message.
  - `idempotency_key` string, required: Stable identity for this exact sender, recipient, action, content, and requested schedule. Exact retries adopt the existing intent; changing any of those inputs with the same key returns a conflict.
  - `message` string, nullable: Body for `message`, optional invite note for `connect` (connection notes are validated against the sender account cap before send).
  - `recipient_provider_id` string, nullable: Optional LinkedIn provider-internal member id when the client already has one. This is addressable identity only; messages still require relationship or replyability proof in the send workflow.
  - `recipient_public_id` string, required: The recipient's LinkedIn public identifier (the `in/<id>` slug). The durable send workflow resolves it to the provider recipient id at send time.
  - `respect_sender_window` boolean: Optional. When true, defer to the sender account send window.
  - `scheduled_at` string, date-time, nullable: Optional timezone-aware ISO 8601 timestamp. Omit to queue immediately.
  - `sender_account_id` string, nullable: Optional. Specific connected LinkedIn sender_account.id. Defaults to the org's only connected LinkedIn account when one exists.
  - `sequence_effect` 'manual_hold', nullable: Deprecated compatibility field; manual sends imply manual_hold.
  - `sequence_id` string, nullable: Deprecated compatibility field. Manual holds are derived from the resolved person across active sequence instances in the org.

## Response `200`

Successful Response

- LinkedInSendResponse
  - `accepted_at` string, date-time, nullable, required: Observed connection-acceptance time for a connect action; null for direct messages and unaccepted requests.
  - `action` 'connect' | 'message', required: Normalized action discriminator: connect for a connection request or message for a new direct message.
  - `detail` string, nullable, required: Sanitized blocking or terminal failure detail, or null when the action has no diagnostic detail. Read this with status; it is not provider raw data.
  - `id` string, required: Durable outbound intent id. Pass this exact value to linkedin.get_send_status; it is not a provider message id.
  - `next_eligible_at` string, date-time, nullable, required: Next time schedule, sender-window, pacing, identity, and relationship policy permits the queued action to run; null outside a deferred queued state.
  - `replied_at` string, date-time, nullable, required: First observed recipient reply time, or null until one is observed.
  - `request_digest` string, nullable, required: Lowercase SHA-256 of the payload-bound sender, recipient, action, content, and schedule contract; null only for a legacy intent.
  - `requested_at` string, date-time, required: ISO 8601 time when the durable action was admitted.
  - `scheduled_at` string, date-time, nullable, required: Exact caller-requested future send time before sender-window adjustment, or null when no future time was requested.
  - `sender_account_id` string, required: Exact connected LinkedIn account selected for this action.
  - `sent_at` string, date-time, nullable, required: Provider-confirmed submission time when status is sent; null before send or after failure.
  - `status` 'queued' | 'sent' | 'failed', required: Current durable lifecycle state: queued proves admission but not delivery, sent proves provider-confirmed submission, and failed is terminal without successful submission.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract.md) - [All operations](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract/llms.txt) - [OpenAPI document](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract/revisions/c80e903ef8f3?raw)
