openapi: 3.2.0 info: title: Gtm Linkedin Conversations API version: '1.0' contact: name: GTM API url: https://gtm-api.com email: support@gtm-api.com license: name: Proprietary url: https://gtm-api.com/license description: 'Operations tagged linkedin_conversations across 2 of this provider''s published API definitions: gtm-api-openapi-openapi.yml, gtm-api-linkedin-openapi.yaml. Each path carries the servers of the definition it was published in.' servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway security: - BearerJwt: [] TeamSid: [] tags: - name: linkedin_conversations description: Registry package `mcp.linkedin/linkedin_conversations`, served on MCP mount `linkedin.messaging`. paths: /api/linkedin-conversations/get-my-latest: post: operationId: get_my_latest_linkedin_conversations summary: Get my latest LinkedIn conversations description: 'Always-fresh head read of the basic-LinkedIn-messenger thread list for one account (§5.8 foreground refresh, then the last N threads from the refreshed DB, last_activity_at DESC). Never serves stale data: it 429s with bucket_saturated / sync_in_progress instead. Use before an inbox decision; use sync_my_linkedin_conversations for full backfill. Runs through the account''s browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account''s overdue syncs. Contract: - MCP tool `get_my_latest_linkedin_conversations`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `action`, response envelope `search`. - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.' tags: - linkedin_conversations requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GetMyLatestLinkedinConversationsRequest' responses: '200': description: '`search` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetMyLatestLinkedinConversationsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_my_latest_linkedin_conversations x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: search x-gtm-availability: ga x-gtm-dangerous: false x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical x-gtm-paced-bucket: self_account_sync servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/get-my-latest-recruiter: post: operationId: get_my_latest_linkedin_conversations_recruiter summary: Get my latest Recruiter conversations description: 'LinkedIn Recruiter variant of get_my_latest_linkedin_conversations: always-fresh head read of the recruiter inbox for one account (§5.8 refresh-then-return over the talent wire, page size fixed at 15 by that wire). Same hard-429 guards; returns messenger_type=''recruiter'' rows whose recruiter_id is the candidate. Needs a Recruiter seat and its stamped seat number (422 recruiter_required / recruiter_seat_unresolvable). Runs through the account''s browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account''s overdue syncs. Contract: - MCP tool `get_my_latest_linkedin_conversations_recruiter`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.recruiter`. - Operation `action`, response envelope `search`. - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.' tags: - linkedin_conversations requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GetMyLatestLinkedinConversationsRecruiterRequest' responses: '200': description: '`search` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetMyLatestLinkedinConversationsRecruiterResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_my_latest_linkedin_conversations_recruiter x-gtm-mcp-mount: linkedin.recruiter x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: search x-gtm-availability: ga x-gtm-dangerous: false x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical x-gtm-paced-bucket: self_account_sync servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/get-my-latest-sales-nav: post: operationId: get_my_latest_linkedin_conversations_sales_nav summary: Get my latest Sales Navigator conversations description: 'Sales Navigator variant of get_my_latest_linkedin_conversations: always-fresh head read of the SN thread list for one account (§5.8 refresh-then-return). Same hard-429 guards; returns messenger_type=''sales_navigator'' rows. Runs through the account''s browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account''s overdue syncs. Contract: - MCP tool `get_my_latest_linkedin_conversations_sales_nav`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `action`, response envelope `search`. - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.' tags: - linkedin_conversations requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GetMyLatestLinkedinConversationsSalesNavRequest' responses: '200': description: '`search` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetMyLatestLinkedinConversationsSalesNavResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_my_latest_linkedin_conversations_sales_nav x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: search x-gtm-availability: ga x-gtm-dangerous: false x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical x-gtm-paced-bucket: self_account_sync servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/metrics: post: operationId: get_linkedin_conversations_metrics summary: Get LinkedIn conversations metrics description: 'Period-bound conversation aggregates for one account (new_conversations_count, active_count) with an optional group_by axis. Requires period {from,to} (≤ 90 days) and filter.linkedin_account_sid - that is the ONLY filter axis the aggregation applies, unlike search. Returns the counts block alongside. Contract: - MCP tool `get_linkedin_conversations_metrics`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `metrics`, response envelope `metrics`. - Flags: read only.' tags: - linkedin_conversations requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GetLinkedinConversationsMetricsRequest' responses: '200': description: '`metrics` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinConversationsMetricsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_conversations_metrics x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: metrics x-gtm-envelope: metrics x-gtm-availability: ga x-gtm-dangerous: false x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/search: post: operationId: search_linkedin_conversations summary: Search LinkedIn conversations description: 'List LinkedIn message threads for the team across both messenger surfaces (basic LinkedIn + Sales Navigator) with operator-object filters (account, contact ids, conversation_hash = LinkedIn''s own 2-…== thread id, messenger_type, event-count, activity / message-sync clock ranges), sort, cursor pagination, and include[] for the parent account and the last 50 messages. Live rows by default; page_size:0 for count-only. Given a thread id by the user, look it up with filter.filter {"conversation_hash": {"eq": ""}}: q is a nickname LIKE and will not find it. Contract: - MCP tool `search_linkedin_conversations`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `search`, response envelope `search`. - Flags: read only.' tags: - linkedin_conversations requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/SearchLinkedinConversationsRequest' responses: '200': description: '`search` success envelope.' content: application/json: schema: $ref: '#/components/schemas/SearchLinkedinConversationsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: search_linkedin_conversations x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: search x-gtm-envelope: search x-gtm-availability: ga x-gtm-dangerous: false x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/sync-my-linkedin-conversations: post: operationId: sync_my_linkedin_conversations summary: Sync my LinkedIn conversations description: 'Start a background sync run that reconciles the full basic-LinkedIn-messenger thread directory for one account. ASYNC: returns a pending ref (sync_run_sid) to poll; changed threads have their messages pulled inline. Use for initial backfill / full reconciliation; for a fresh inbox head use get_my_latest_linkedin_conversations. Contract: - MCP tool `sync_my_linkedin_conversations`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `action`, response envelope `action_async`. - Flags: none.' tags: - linkedin_conversations requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SyncMyLinkedinConversationsRequest' responses: '200': description: '`action_async` success envelope.' content: application/json: schema: $ref: '#/components/schemas/SyncMyLinkedinConversationsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: sync_my_linkedin_conversations x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: action_async x-gtm-availability: ga x-gtm-dangerous: false x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/sync-my-recruiter-conversations: post: operationId: sync_my_recruiter_conversations summary: Sync my Recruiter conversations description: 'Start a background sync run that reconciles the LinkedIn Recruiter inbox (the talent mailbox a recruiter seat owns) for one account: messenger_type=''recruiter'' threads with the candidate''s recruiter_id, their messages drained inline. ASYNC: returns a pending ref to poll. Needs a Recruiter seat on the account AND its stamped seat number (422 recruiter_required / recruiter_seat_unresolvable otherwise; check_linkedin_account_premium_subscription with checks: [''recruiter''] refreshes both). Walks the INBOX tab and then UNRESOLVED (a thread this seat opened sits there until the candidate replies), never ARCHIVED or SCHEDULED. Separate sync_type and cadence from the two other messengers. Contract: - MCP tool `sync_my_recruiter_conversations`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.recruiter`. - Operation `action`, response envelope `action_async`. - Flags: none.' tags: - linkedin_conversations requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SyncMyRecruiterConversationsRequest' responses: '200': description: '`action_async` success envelope.' content: application/json: schema: $ref: '#/components/schemas/SyncMyRecruiterConversationsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: sync_my_recruiter_conversations x-gtm-mcp-mount: linkedin.recruiter x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: action_async x-gtm-availability: ga x-gtm-dangerous: false x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/sync-my-sales-navigator-conversations: post: operationId: sync_my_sales_navigator_conversations summary: Sync my Sales Navigator conversations description: 'Start a background sync run that reconciles the full Sales Navigator thread directory for one account. ASYNC: returns a pending ref to poll. Separate sync_type and cadence from the basic-LinkedIn sync so SN-only lanes never touch basic-messenger rate limits. Contract: - MCP tool `sync_my_sales_navigator_conversations`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `action`, response envelope `action_async`. - Flags: none.' tags: - linkedin_conversations requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SyncMySalesNavigatorConversationsRequest' responses: '200': description: '`action_async` success envelope.' content: application/json: schema: $ref: '#/components/schemas/SyncMySalesNavigatorConversationsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: sync_my_sales_navigator_conversations x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: action_async x-gtm-availability: ga x-gtm-dangerous: false x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/{sid}: get: operationId: get_linkedin_conversation summary: Get LinkedIn conversation description: 'Fetch one conversation by sid: the stored row including the denormalized participants list. Stored-DB read: no plugin call, no limit spend. Contract: - MCP tool `get_linkedin_conversation`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `get`, response envelope `get`. - Flags: read only.' tags: - linkedin_conversations parameters: - name: sid in: path required: true description: Path segment `{sid}`. schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_cv_ - name: include[] in: query required: false description: Query parameter `include`. style: form explode: true schema: type: array items: type: string enum: - linkedin_account - last_messages responses: '200': description: '`get` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinConversationResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_conversation x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: get x-gtm-envelope: get x-gtm-availability: ga x-gtm-dangerous: false x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: trivial servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/{sid}/add-participants: post: operationId: add_linkedin_conversation_participants summary: Add conversation participants description: 'Add one or more members to an existing thread on LinkedIn (outward action). Pass the conversation sid + participant_ln_ids (1..20 bare LinkedIn profile ids, the ACoA... ln_id of a connection or conversation participant; never a urn: string, the SDK wraps the id itself and a URN is wrapped twice and refused); a 1:1 thread is promoted to a group. item is the stored thread as it was before the call (the participant list follows on the next inbox sync); result carries status success and the activity_log_sid of the call. A LinkedIn refusal is a typed error (409 linkedin_refused, or the account-level 409 / 422 codes), never a success with a failed status. Contract: - MCP tool `add_linkedin_conversation_participants`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `action`, response envelope `action`. - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.' tags: - linkedin_conversations parameters: - name: sid in: path required: true description: LinkedIn conversation sid (ln_cv_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_cv_ description: LinkedIn conversation sid (ln_cv_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AddLinkedinConversationParticipantsRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/AddLinkedinConversationParticipantsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: add_linkedin_conversation_participants x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: action x-gtm-availability: ga x-gtm-dangerous: true x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical x-gtm-paced-bucket: messaging_general servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/{sid}/delete-on-linkedin: post: operationId: delete_linkedin_conversation_on_linkedin summary: Delete conversation on LinkedIn description: 'Delete one thread from this account''s OWN LinkedIn mailbox (wire delete-conversation, matrix row 110). Counterpart mailboxes keep their full copies and no message is recalled: the opposite blast radius of delete_linkedin_message_on_linkedin, which recalls ONE message for everyone. Irreversible on the wire (LinkedIn resurrects the thread only when a counterpart writes again), so not a mass action. Pass the conversation sid; the LinkedIn-side delete runs first and the stored row is soft-deleted only on a confirmed success (the next sync converges to the same state). Voyager basic messenger only: a Sales Navigator thread is refused 422 messenger_type_mismatch, a thread not yet synced to its real 2-... hash is refused 422 conversation_not_deletable, an already deleted one 422 conversation_deleted. Spends the messaging_general bucket. Contract: - MCP tool `delete_linkedin_conversation_on_linkedin`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `action`, response envelope `action`. - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.' tags: - linkedin_conversations parameters: - name: sid in: path required: true description: LinkedIn conversation sid (ln_cv_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_cv_ description: LinkedIn conversation sid (ln_cv_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/DeleteLinkedinConversationOnLinkedinResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: delete_linkedin_conversation_on_linkedin x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: action x-gtm-availability: ga x-gtm-dangerous: true x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical x-gtm-paced-bucket: messaging_general servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/{sid}/mark-read: post: operationId: mark_linkedin_conversation_read summary: Mark conversation read description: 'Mark a conversation thread as read on LinkedIn''s side (outward action). LinkedIn-side effect only, no stored read-state changes; the audit rides an activity-log row. Idempotent; safe to retry. Contract: - MCP tool `mark_linkedin_conversation_read`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `action`, response envelope `action`. - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.' tags: - linkedin_conversations parameters: - name: sid in: path required: true description: LinkedIn conversation sid (ln_cv_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_cv_ description: LinkedIn conversation sid (ln_cv_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/MarkLinkedinConversationReadResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: mark_linkedin_conversation_read x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: action x-gtm-availability: ga x-gtm-dangerous: true x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical x-gtm-paced-bucket: messaging_general servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/{sid}/mark-unread: post: operationId: mark_linkedin_conversation_unread summary: Mark conversation unread description: 'Mark a conversation thread as unread on LinkedIn''s side (outward action), the hand-back-to-human signal after an agent triaged a thread. LinkedIn-side effect only; no stored read-state changes. Contract: - MCP tool `mark_linkedin_conversation_unread`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `action`, response envelope `action`. - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.' tags: - linkedin_conversations parameters: - name: sid in: path required: true description: LinkedIn conversation sid (ln_cv_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_cv_ description: LinkedIn conversation sid (ln_cv_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/MarkLinkedinConversationUnreadResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: mark_linkedin_conversation_unread x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: action x-gtm-availability: ga x-gtm-dangerous: true x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical x-gtm-paced-bucket: messaging_general servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/{sid}/mute: post: operationId: mute_linkedin_conversation summary: Mute conversation description: 'Mute or unmute one thread''s notifications on LinkedIn (outward action). Pass the conversation sid + mute (true = mute, default; false = unmute); the change is dispatched to LinkedIn and mirrored on the stored row. Contract: - MCP tool `mute_linkedin_conversation`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `action`, response envelope `action`. - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.' tags: - linkedin_conversations parameters: - name: sid in: path required: true description: LinkedIn conversation sid (ln_cv_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_cv_ description: LinkedIn conversation sid (ln_cv_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/MuteLinkedinConversationRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/MuteLinkedinConversationResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: mute_linkedin_conversation x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: action x-gtm-availability: ga x-gtm-dangerous: true x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical x-gtm-paced-bucket: messaging_general servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/{sid}/remove-participants: post: operationId: remove_linkedin_conversation_participants summary: Remove conversation participants description: 'Remove one or more members from a group thread on LinkedIn (outward action). Pass the conversation sid + participant_ln_ids (1..20 bare LinkedIn profile ids, the ACoA... ln_id; never a urn: string, the SDK wraps the id itself). item is the stored thread as it was before the call (the participant list follows on the next inbox sync); result carries status success and the activity_log_sid of the call. A LinkedIn refusal is a typed error (409 linkedin_refused, or the account-level 409 / 422 codes), never a success with a failed status. Contract: - MCP tool `remove_linkedin_conversation_participants`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `action`, response envelope `action`. - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.' tags: - linkedin_conversations parameters: - name: sid in: path required: true description: LinkedIn conversation sid (ln_cv_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_cv_ description: LinkedIn conversation sid (ln_cv_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RemoveLinkedinConversationParticipantsRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/RemoveLinkedinConversationParticipantsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: remove_linkedin_conversation_participants x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: action x-gtm-availability: ga x-gtm-dangerous: true x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical x-gtm-paced-bucket: messaging_general servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-conversations/{sid}/rename: post: operationId: rename_linkedin_conversation summary: Rename conversation description: 'Rename a group thread on LinkedIn (outward action). Pass the conversation sid + the new title (1..256 chars). Group threads only: LinkedIn refuses a 1:1 thread, and that refusal is a typed error (409 linkedin_refused), never a success with a failed status. item is the stored thread as it was before the call (the title follows on the next inbox sync); result carries status success and the activity_log_sid of the call. Contract: - MCP tool `rename_linkedin_conversation`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`. - Operation `action`, response envelope `action`. - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.' tags: - linkedin_conversations parameters: - name: sid in: path required: true description: LinkedIn conversation sid (ln_cv_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_cv_ description: LinkedIn conversation sid (ln_cv_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RenameLinkedinConversationRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/RenameLinkedinConversationResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: rename_linkedin_conversation x-gtm-mcp-mount: linkedin.messaging x-gtm-entity: linkedin_conversations x-gtm-operation: action x-gtm-envelope: action x-gtm-availability: ga x-gtm-dangerous: true x-gtm-mass-action: false x-gtm-step-eligible: false x-gtm-schedule-required: false x-gtm-tool-class: typical x-gtm-paced-bucket: messaging_general servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway components: schemas: GetLinkedinConversationResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - get item: type: object properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at included: type: object additionalProperties: {} includes: type: array items: type: string meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms required: - success - operation - item - included - includes - meta RenameLinkedinConversationResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - action action: type: string description: kebab-case verb; matches the route segment. item: type: - object - 'null' properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at result: type: object properties: status: type: string enum: - success description: 'The only value this verb answers with: a refusal is a typed error, never a status.' activity_log_sid: type: - string - 'null' description: The linkedin-account-activity-log row of the call (ln_al_). required: - status - activity_log_sid meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta SearchLinkedinConversationsRequest: type: object description: Request body of `search_linkedin_conversations`. properties: filter: type: object properties: q: type: string description: Full-text LIKE over nickname (the only free-text column). sid: type: object properties: eq: type: string in: type: array items: type: string additionalProperties: false linkedin_account_sid: type: object properties: eq: type: string in: type: array items: type: string additionalProperties: false messenger_type: type: object properties: eq: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ne: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' in: type: array items: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' nin: type: array items: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' additionalProperties: false conversation_hash: type: object properties: eq: type: string in: type: array items: type: string additionalProperties: false description: 'Exact match on LinkedIn''s own thread id (the 2-…== value from a messaging URL or a raw payload). THE way to resolve a thread the user named by id into its sid: filter.conversation_hash.eq, never q (which only LIKEs nickname) and never sid (our ln_cv_ space). Unique per (linkedin_account_sid, messenger_type), so pass the account too when the same thread could exist on both surfaces.' ln_id: type: object properties: eq: type: string ne: type: string in: type: array items: type: string nin: type: array items: type: string is_null: type: boolean additionalProperties: false ln_member_id: type: object properties: eq: type: string ne: type: string in: type: array items: type: string nin: type: array items: type: string is_null: type: boolean additionalProperties: false sn_id: type: object properties: eq: type: string ne: type: string in: type: array items: type: string nin: type: array items: type: string is_null: type: boolean additionalProperties: false recruiter_id: type: object properties: eq: type: string ne: type: string in: type: array items: type: string nin: type: array items: type: string is_null: type: boolean additionalProperties: false recruiter_contract_id: type: object properties: eq: type: string ne: type: string in: type: array items: type: string nin: type: array items: type: string is_null: type: boolean additionalProperties: false description: The Recruiter contract the thread was synced or sent under (a seat holder with several contracts switches with select_recruiter_contract; each contract is its own inbox). Null off the recruiter surface and on rows synced before 2026-09-19. nickname: type: object properties: eq: type: string in: type: array items: type: string is_null: type: boolean additionalProperties: false is_muted: type: object properties: eq: type: boolean ne: type: boolean is_null: type: boolean additionalProperties: false is_group: type: object properties: eq: type: boolean ne: type: boolean is_null: type: boolean additionalProperties: false description: A group chat (2026-09-24). is_null:true finds threads synced before the flag existed, which read as 1:1 until their next sync. unread_count: type: object properties: eq: type: integer ne: type: integer gte: type: integer lte: type: integer gt: type: integer lt: type: integer is_null: type: boolean additionalProperties: false description: The unread-only inbox view is unread_count gt 0. is_null:true finds threads that have never synced the counter. event_count: type: object properties: eq: type: integer ne: type: integer gte: type: integer lte: type: integer gt: type: integer lt: type: integer additionalProperties: false last_activity_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false last_stored_message_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false last_message_sync_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false created_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string additionalProperties: false updated_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string additionalProperties: false deleted_at: type: object properties: gte: type: string lte: type: string is_null: type: boolean additionalProperties: false include: type: array items: type: string enum: - linkedin_account - last_messages description: Relations to eager-load (see entity Includes). sort: type: object properties: field: type: string enum: - last_activity_at - event_count - last_message_sync_at direction: type: string enum: - asc - desc description: Default desc. required: - field page_size: type: integer minimum: 0 maximum: 200 description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst. cursor: type: - string - 'null' description: Opaque forward cursor from a previous response pagination.next_cursor. RenameLinkedinConversationRequest: type: object description: Request body of `rename_linkedin_conversation`. properties: title: type: string minLength: 1 maxLength: 256 description: New group thread title (1..256 chars). required: - title GetMyLatestLinkedinConversationsRecruiterResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - search items: type: array items: type: object properties: item: type: object properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at included: type: object additionalProperties: {} required: - item - included pagination: type: object properties: next_cursor: type: - string - 'null' has_more: type: boolean total_count: type: - integer - 'null' required: - next_cursor - has_more - total_count applied_filters: type: object additionalProperties: {} includes: type: array items: type: string meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms counts: type: object additionalProperties: {} pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - items - pagination - applied_filters - includes - meta SyncMySalesNavigatorConversationsRequest: type: object description: Request body of `sync_my_sales_navigator_conversations`. properties: linkedin_account_sid: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). required: - linkedin_account_sid SearchLinkedinConversationsResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - search items: type: array items: type: object properties: item: type: object properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at included: type: object additionalProperties: {} required: - item - included pagination: type: object properties: next_cursor: type: - string - 'null' has_more: type: boolean total_count: type: - integer - 'null' required: - next_cursor - has_more - total_count applied_filters: type: object additionalProperties: {} includes: type: array items: type: string meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms counts: type: object additionalProperties: {} required: - success - operation - items - pagination - applied_filters - includes - meta SyncMyRecruiterConversationsRequest: type: object description: Request body of `sync_my_recruiter_conversations`. properties: linkedin_account_sid: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). required: - linkedin_account_sid GetLinkedinConversationsMetricsRequest: type: object description: Request body of `get_linkedin_conversations_metrics`. properties: filter: type: object properties: linkedin_account_sid: type: object properties: eq: type: string in: type: array items: type: string additionalProperties: false description: Row scope; linkedin_account_sid is REQUIRED (422 without it). period: type: object properties: from: type: string format: date-time description: ISO 8601 UTC start (inclusive). to: type: string format: date-time description: ISO 8601 UTC end (exclusive); must be after from; window ≤ 90 days. required: - from - to description: Metrics time window. group_by: type: string enum: - messenger_type - linkedin_account_sid description: Optional single split axis. required: - filter - period SyncMyLinkedinConversationsResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - action action: type: string async: type: boolean enum: - true item: type: - object - 'null' properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at pending: type: array items: type: object properties: activity_log_sid: type: string expected_completion_seconds: type: integer minimum: 0 webhook_events: type: array items: type: string required: - expected_completion_seconds - webhook_events result: type: object additionalProperties: {} meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms required: - success - operation - action - async - item - pending - result - meta MarkLinkedinConversationReadResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - action action: type: string description: kebab-case verb; matches the route segment. item: type: - object - 'null' properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at result: type: object additionalProperties: {} meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta SyncMySalesNavigatorConversationsResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - action action: type: string async: type: boolean enum: - true item: type: - object - 'null' properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at pending: type: array items: type: object properties: activity_log_sid: type: string expected_completion_seconds: type: integer minimum: 0 webhook_events: type: array items: type: string required: - expected_completion_seconds - webhook_events result: type: object additionalProperties: {} meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms required: - success - operation - action - async - item - pending - result - meta GetMyLatestLinkedinConversationsResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - search items: type: array items: type: object properties: item: type: object properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at included: type: object additionalProperties: {} required: - item - included pagination: type: object properties: next_cursor: type: - string - 'null' has_more: type: boolean total_count: type: - integer - 'null' required: - next_cursor - has_more - total_count applied_filters: type: object additionalProperties: {} includes: type: array items: type: string meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms counts: type: object additionalProperties: {} pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - items - pagination - applied_filters - includes - meta MarkLinkedinConversationUnreadResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - action action: type: string description: kebab-case verb; matches the route segment. item: type: - object - 'null' properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at result: type: object additionalProperties: {} meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta GetLinkedinConversationsMetricsResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - metrics metrics: type: object properties: filter: type: object additionalProperties: {} period: type: object properties: from: type: string to: type: string required: - from - to aggregated: type: object properties: counts: type: object additionalProperties: {} metrics: type: object properties: new_conversations_count: type: integer active_count: type: integer required: - new_conversations_count - active_count metrics: type: object properties: new_conversations_count: type: integer active_count: type: integer required: - new_conversations_count - active_count applied_filters: type: object additionalProperties: {} meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms required: - success - operation - metrics - meta GetMyLatestLinkedinConversationsSalesNavResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - search items: type: array items: type: object properties: item: type: object properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at included: type: object additionalProperties: {} required: - item - included pagination: type: object properties: next_cursor: type: - string - 'null' has_more: type: boolean total_count: type: - integer - 'null' required: - next_cursor - has_more - total_count applied_filters: type: object additionalProperties: {} includes: type: array items: type: string meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms counts: type: object additionalProperties: {} pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - items - pagination - applied_filters - includes - meta RemoveLinkedinConversationParticipantsResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - action action: type: string description: kebab-case verb; matches the route segment. item: type: - object - 'null' properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at result: type: object properties: status: type: string enum: - success description: 'The only value this verb answers with: a refusal is a typed error, never a status.' activity_log_sid: type: - string - 'null' description: The linkedin-account-activity-log row of the call (ln_al_). required: - status - activity_log_sid meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta SyncMyRecruiterConversationsResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - action action: type: string async: type: boolean enum: - true item: type: - object - 'null' properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at pending: type: array items: type: object properties: activity_log_sid: type: string expected_completion_seconds: type: integer minimum: 0 webhook_events: type: array items: type: string required: - expected_completion_seconds - webhook_events result: type: object additionalProperties: {} meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms required: - success - operation - action - async - item - pending - result - meta AddLinkedinConversationParticipantsResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - action action: type: string description: kebab-case verb; matches the route segment. item: type: - object - 'null' properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at result: type: object properties: status: type: string enum: - success description: 'The only value this verb answers with: a refusal is a typed error, never a status.' activity_log_sid: type: - string - 'null' description: The linkedin-account-activity-log row of the call (ln_al_). required: - status - activity_log_sid meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta McpError: type: object properties: success: type: boolean enum: - false error: type: object properties: code: type: string enum: - validation_failed - nothing_to_update - not_found - relation_not_found - invalid_transition - limit_exceeded - payment_required - duplicate_rejected - conflict - delete_blocked - unauthorized - forbidden - rate_limited - internal_error - service_unavailable - not_implemented message: type: string recoverable: type: boolean suggestion: type: string field_errors: type: object additionalProperties: type: array items: type: object properties: rule: type: string message: type: string required: - rule - message blockers: type: array items: type: object properties: type: type: string description: Machine-readable blocker type (active_flow, pending_tasks, …). severity: type: string enum: - hard - soft description: hard = external action required; soft = acknowledge is enough. description: type: string entity_sid: type: - string - 'null' count: type: integer resolution: type: string description: 'Hard: tool name to call. Soft: code for acknowledge[].' resolution_hint: type: string required: - type - severity - description - entity_sid - resolution - resolution_hint context: type: object additionalProperties: {} required: - code - message - recoverable meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms required: - success - error GetMyLatestLinkedinConversationsSalesNavRequest: type: object description: Request body of `get_my_latest_linkedin_conversations_sales_nav`. properties: linkedin_account_sid: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). page_size: type: integer minimum: 1 maximum: 100 description: N returned, 1..100, default 50. cursor: type: - string - 'null' description: Opaque; pagination over the refreshed head. required: - linkedin_account_sid GetMyLatestLinkedinConversationsRequest: type: object description: Request body of `get_my_latest_linkedin_conversations`. properties: linkedin_account_sid: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). page_size: type: integer minimum: 1 maximum: 100 description: N returned, 1..100, default 50. cursor: type: - string - 'null' description: Opaque; pagination over the refreshed head. required: - linkedin_account_sid SyncMyLinkedinConversationsRequest: type: object description: Request body of `sync_my_linkedin_conversations`. properties: linkedin_account_sid: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). required: - linkedin_account_sid RemoveLinkedinConversationParticipantsRequest: type: object description: Request body of `remove_linkedin_conversation_participants`. properties: participant_ln_ids: type: array items: type: string minLength: 1 maxLength: 64 minItems: 1 maxItems: 20 description: 'Bare LinkedIn profile ids (ACoA...) to remove, 1..20; not urn: strings.' required: - participant_ln_ids AddLinkedinConversationParticipantsRequest: type: object description: Request body of `add_linkedin_conversation_participants`. properties: participant_ln_ids: type: array items: type: string minLength: 1 maxLength: 64 minItems: 1 maxItems: 20 description: 'Bare LinkedIn profile ids (ACoA...) to add, 1..20; not urn: strings.' required: - participant_ln_ids GetMyLatestLinkedinConversationsRecruiterRequest: type: object description: Request body of `get_my_latest_linkedin_conversations_recruiter`. properties: linkedin_account_sid: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). page_size: type: integer minimum: 1 maximum: 100 description: N returned, 1..100, default 50 (the wire refresh itself pages 15 at a time). cursor: type: - string - 'null' description: Opaque; pagination over the refreshed head. required: - linkedin_account_sid DeleteLinkedinConversationOnLinkedinResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - action action: type: string description: kebab-case verb; matches the route segment. item: type: - object - 'null' properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at result: type: object properties: status: type: string description: 'The browser task''s terminal status: success when the thread is gone from the mailbox.' required: - status meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta MuteLinkedinConversationRequest: type: object description: Request body of `mute_linkedin_conversation`. properties: mute: type: boolean description: true = mute (default), false = unmute. MuteLinkedinConversationResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - action action: type: string description: kebab-case verb; matches the route segment. item: type: - object - 'null' properties: sid: type: string team_sid: type: string linkedin_account_sid: type: string conversation_hash: type: string description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid. messenger_type: type: string enum: - linkedin - sales_navigator - recruiter description: 'Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id).' ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' description: 'The counterpart''s LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type=''recruiter'' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces.' nickname: type: - string - 'null' participants: type: - array - 'null' items: type: object properties: ln_member_id: type: - string - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' recruiter_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' picture_url: type: - string - 'null' is_muted: type: - boolean - 'null' unread_count: type: - integer - 'null' description: 'LinkedIn''s own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is "more than zero").' event_count: type: number last_activity_at: type: - string - 'null' last_stored_message_at: type: - string - 'null' last_message_sync_at: type: - string - 'null' created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - linkedin_account_sid - conversation_hash - messenger_type - ln_member_id - ln_id - sn_id - recruiter_id - nickname - participants - is_muted - unread_count - event_count - last_activity_at - last_stored_message_at - last_message_sync_at - created_at - updated_at - deleted_at result: type: object additionalProperties: {} meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta responses: McpServerError: description: MCP error envelope with `error.code` internal_error or service_unavailable. content: application/json: schema: $ref: '#/components/schemas/McpError' McpClientError: description: MCP error envelope. `error.code` is one of validation_failed, nothing_to_update, not_found, relation_not_found, invalid_transition, limit_exceeded, payment_required, duplicate_rejected, conflict, delete_blocked, unauthorized, forbidden, rate_limited, not_implemented. content: application/json: schema: $ref: '#/components/schemas/McpError' securitySchemes: BearerJwt: type: http scheme: bearer bearerFormat: JWT description: Access token issued by gtm.service.id. Its `access_identity` claim carries `team_sid`, `actor_sid` and `actor_type`, and that team scope is authoritative. TeamSid: type: apiKey in: header name: Team-SID description: Team scope for tokens that do not carry one. Ignored when the token already names a team. x-refined-from: - gtm-api-openapi-openapi.yml - gtm-api-linkedin-openapi.yaml