openapi: 3.2.0 info: title: Gtm Linkedin Accounts 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_accounts 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_accounts description: Registry package `mcp.linkedin/linkedin_accounts`, served on MCP mount `linkedin.accounts`. paths: /api/linkedin-accounts/search: post: operationId: search_linkedin_accounts summary: Search LinkedIn accounts description: 'List LinkedIn accounts (senders) on the team with operator filters, sort and cursor pagination, plus an always-present counts block (total, premium / SN / Recruiter, active_today, stale, signed_out). Also the way to find an account sid before calling account-scoped tools. For ANY health or availability question, request include antidetect_browser: login state lives on the bound browser row, whose status login_issue means the sender is signed out of LinkedIn. The item status field is platform lifecycle and stays active through a logout, so never read it as health. counts.signed_out_count flags signed-out senders even without the include; per-row attribution needs it. A full sender health summary combines antidetect_browser with linkedin_account_smart_limits, linkedin_account_snapshot (warmup score) and linkedin_account_block_log_counts. Items with includes are large: page a fleet with page_size 10 or less and follow next_cursor instead of asking for one big page. Contract: - MCP tool `search_linkedin_accounts`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `search`, response envelope `search`. - Flags: read only.' tags: - linkedin_accounts requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/SearchLinkedinAccountsRequest' responses: '200': description: '`search` success envelope.' content: application/json: schema: $ref: '#/components/schemas/SearchLinkedinAccountsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: search_linkedin_accounts x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts 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-accounts/{sid}: get: operationId: get_linkedin_account summary: Get LinkedIn account description: 'Fetch a single LinkedIn account by sid, with optional eager-loaded relations. For login or health state add include antidetect_browser: browser status login_issue means the sender is signed out of LinkedIn, while the item status field is platform lifecycle, not login state. Contract: - MCP tool `get_linkedin_account`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `get`, response envelope `get`. - Flags: read only.' tags: - linkedin_accounts parameters: - name: sid in: path required: true description: Path segment `{sid}`. schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ - name: include[] in: query required: false description: Query parameter `include`. style: form explode: true schema: type: array items: type: string enum: - antidetect_browser - linkedin_account_smart_limits - linkedin_account_snapshot - linkedin_account_quota_hits - linkedin_account_block_log - linkedin_account_block_log_counts - linkedin_connections_counts - linkedin_connection_requests_counts - linkedin_connection_invitations_counts - linkedin_conversations_counts - linkedin_followers_counts description: 'antidetect_browser carries the sender LOGIN and runtime state (browser status login_issue means signed out of LinkedIn, restricted means signed out and the public profile is gone, a LinkedIn restriction; also error_reason, logout_count, last_logout_at). The account item alone cannot answer "is this sender signed in": its status field is lifecycle. Health data: linkedin_account_smart_limits (budgets and holds), linkedin_account_snapshot (latest warmup score), linkedin_account_quota_hits / linkedin_account_block_log (last 50 incident rows each), *_counts (child tallies).' responses: '200': description: '`get` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts 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 patch: operationId: set_linkedin_account_label summary: Set account label description: 'Set the private operator tag on one sender. `label` is team-authored free text (pod, campaign, owner) stored on the account row and visible only inside the owning workspace: LinkedIn never sees it and no recipient sees it. It is not the sender''s name, which is LinkedIn''s own (full_name) and is not editable by any tool. Send label to replace the tag, null to clear it; the key is required, so an empty call is a schema error. Filter on it with search_linkedin_accounts filter.label. Contract: - MCP tool `set_linkedin_account_label`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `update`, response envelope `update`. - Flags: none.' tags: - linkedin_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SetLinkedinAccountLabelRequest' responses: '200': description: '`update` success envelope.' content: application/json: schema: $ref: '#/components/schemas/SetLinkedinAccountLabelResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: set_linkedin_account_label x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: update x-gtm-envelope: update 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-accounts/{sid}/check-premium: post: operationId: check_linkedin_account_premium_subscription summary: Check premium subscription description: 'Refresh the account''s subscription state and persist it: Premium, the Sales Navigator and Recruiter seats, and the InMail balances (self-probe, no target, no credits). `checks` picks which of those four to run and omitting it runs all four, which is the call you want when you just need the picture. Ask for a subset when you need one answer cheaply: `recruiter` reads a marker in the already-open tab, while the full run opens a background tab for the profile. Each result is written to the account record, and a probe that fails leaves the previous value alone rather than clearing it, so a failure never reads as "seat lost". On the full run a false Premium settles both seats without probing them, because each includes Premium. A Recruiter seat whose member holds several contracts is bound to the only corporate contract on offer by this check itself; with several on offer the seat stays unstamped until the seat holder picks one in the account''s browser. Contract: - MCP tool `check_linkedin_account_premium_subscription`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/CheckLinkedinAccountPremiumSubscriptionRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/CheckLinkedinAccountPremiumSubscriptionResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: check_linkedin_account_premium_subscription x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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-accounts/{sid}/check-target-block: post: operationId: check_linkedin_account_target_block summary: Check target reachability description: 'Check whether a target person can be reached from this account (not blocked / out of network). Probes from the account itself; when the platform cannot obtain an independent second viewpoint the outcome is `inconclusive` rather than a guess. Contract: - MCP tool `check_linkedin_account_target_block`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CheckLinkedinAccountTargetBlockRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/CheckLinkedinAccountTargetBlockResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: check_linkedin_account_target_block x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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-accounts/{sid}/endorse-skill: post: operationId: endorse_linkedin_account_skill summary: Endorse skills description: 'Endorse a target person''s skills from this account (warm-up / engagement action). Outward action on LinkedIn. Contract: - MCP tool `endorse_linkedin_account_skill`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - 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 `endorse_skills` 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EndorseLinkedinAccountSkillRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/EndorseLinkedinAccountSkillResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: endorse_linkedin_account_skill x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts 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: endorse_skills servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-accounts/{sid}/endorse-skill-by-id: post: operationId: endorse_linkedin_account_skill_by_id summary: Endorse skill by id description: 'Endorse ONE explicit skill on a 1st-degree connection as this account (wire endorse-skill, ?action=endorse). Unlike endorse_linkedin_account_skill there is no discovery read and no auto-pick: you supply skill_id, exactly one dispatch. Skill ids exist only on skills that already carry at least one endorsement (a zero-endorsement skill is not addressable), so take them from the enrichment person-skills read. Requires a 1st-degree connection (409 not_connected). Spends the endorse_skills bucket (30/day, paced; the undo waits only 2 s, so an endorse and its undo fit back to back). Returns the echoed skill urn, endorsed_by_viewer (true after endorse) and the global endorsement_count, plus the activity-log row. Re-endorsing is a LinkedIn-side no-op; undo with unendorse_linkedin_account_skill. Contract: - MCP tool `endorse_linkedin_account_skill_by_id`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.content`. - 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 `endorse_skills` 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EndorseLinkedinAccountSkillByIdRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/EndorseLinkedinAccountSkillByIdResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: endorse_linkedin_account_skill_by_id x-gtm-mcp-mount: linkedin.content x-gtm-entity: linkedin_accounts 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: endorse_skills servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-accounts/{sid}/get-my-analytics: post: operationId: get_linkedin_account_my_analytics summary: Get my analytics description: 'Read the connected account''s creator content analytics over a date window: per metric (impressions, engagements) the daily series, the period total, and the percentage change against the prior period. Omit both dates to get the trailing 28 days, which is what the LinkedIn dashboard itself opens on. Supplying one date without the other is refused rather than half-defaulted, and a window running into the future is refused too (LinkedIn has no data there and would answer with zeroes that read like a collapse in reach). Identity-bound: this is the account''s own dashboard, not a competitor read. The metrics map is open: new cards LinkedIn adds show up as extra keys. The ''Discovery'' card (in-network vs out-of-network reach) is a separate component and is NOT included. Contract: - MCP tool `get_linkedin_account_my_analytics`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyAnalyticsRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyAnalyticsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_analytics x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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 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-accounts/{sid}/get-my-catch-up: post: operationId: get_linkedin_account_my_catch_up summary: Get my catch-up cards description: 'The nurture cards on this account''s My Network catch-up tab (linkedin.com/mynetwork/catch-up/all): birthdays, job changes and work anniversaries among its connections, each with the one-click message LinkedIn printed on the card''s button. The "who is worth congratulating today" feed. READ ONLY: it lists prompts and sends nothing. message_sent means this account already answered that card, and null means LinkedIn said nothing, not no. NO page_size, deliberately: LinkedIn''s own request carries no count knob, so the page is server-fixed at 10. Page with `cursor` instead, passing paging.next_page_cursor back until it is absent; an empty page is the end. Key a card by card_urn, which identifies the PROMPT rather than the person, since `position` is our own count and shifts whenever a card fails to parse. NOT profile views (get_linkedin_account_my_profile_views) and NOT Sales Navigator alerts (get_linkedin_account_my_sales_nav_notifications). Contract: - MCP tool `get_linkedin_account_my_catch_up`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyCatchUpRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyCatchUpResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_catch_up x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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-accounts/{sid}/get-my-credits: post: operationId: get_linkedin_account_my_credits summary: Get my credits description: 'Return the Sales Navigator InMail credit balance (the LSS_INMAIL grant) for the connected account. Requires a Sales Navigator seat: the balance is read from the Sales Navigator credits API, so an account without a seat is refused with 422 `sales_nav_required` instead of being dispatched into a guaranteed LinkedIn 403. Contract: - MCP tool `get_linkedin_account_my_credits`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyCreditsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_credits x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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 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-accounts/{sid}/get-my-following: post: operationId: get_linkedin_account_my_following summary: Get my following description: 'List who the connected account follows, newest-first: the follow-edge twin of get-my-followers (§5.8 latest-*). A null cursor refreshes then returns the head page; a non-null cursor is a read-only continuation over the already-refreshed head (no limit spend). Cursor-paginated. Contract: - MCP tool `get_linkedin_account_my_following`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyFollowingRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyFollowingResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_following x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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 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-accounts/{sid}/get-my-full-profile: post: operationId: get_linkedin_account_my_full_profile summary: Get my full profile description: 'Fetch the full self-profile of the connected LinkedIn account. Contract: - MCP tool `get_linkedin_account_my_full_profile`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyFullProfileResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_full_profile x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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 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-accounts/{sid}/get-my-hiring-projects: post: operationId: get_linkedin_account_my_hiring_projects summary: Get my Recruiter hiring projects description: 'One page of this account''s own LinkedIn Recruiter hiring projects, most recently accessed first, optionally filtered by a name keyword. NEEDS A RECRUITER SEAT (422 recruiter_required otherwise). The one recruiter list with an exact paging.total. Omit page_size to get the wire default of 10; pass paging.next_page_cursor back as `cursor` for the next page. Read-only, persists nothing, one self_account_sync unit. Contract: - MCP tool `get_linkedin_account_my_hiring_projects`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.recruiter`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyHiringProjectsRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyHiringProjectsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_hiring_projects x-gtm-mcp-mount: linkedin.recruiter x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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-accounts/{sid}/get-my-lite-profile: post: operationId: get_linkedin_account_my_lite_profile summary: Get my lite profile description: 'Fetch the lite self-profile (name, headline, avatar) of the connected account. Contract: - MCP tool `get_linkedin_account_my_lite_profile`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyLiteProfileResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_lite_profile x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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 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-accounts/{sid}/get-my-profile-views: post: operationId: get_linkedin_account_my_profile_views summary: Get my profile views description: 'Who viewed this account''s profile over the LAST 90 DAYS, newest first: the list behind linkedin.com/me/profile-views. Window and sort are fixed by LinkedIn and there is no filter, so "who viewed me today" means reading the top of the feed. Rows carry rendered text only ("Viewed 1w ago"), never a parseable date. An ANONYMIZED viewer arrives with is_anonymous true, a descriptor where the name goes, a people-search url instead of a profile, and no member ids, so branch on that flag before opening or keying a row. Served by the Premium viewer screen, so what a non-premium account gets back is unverified. Cursor-paginated, no total: pass paging.next_page_cursor back as `cursor` until it is absent. A short page is usually the end but can also be one card we could not read, so do not call the list complete. NOT the catch-up prompts (get_linkedin_account_my_catch_up) and NOT Sales Navigator alerts (get_linkedin_account_my_sales_nav_notifications). Contract: - MCP tool `get_linkedin_account_my_profile_views`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyProfileViewsRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyProfileViewsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_profile_views x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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-accounts/{sid}/get-my-recruiter-contracts: post: operationId: get_linkedin_account_my_recruiter_contracts summary: Get my Recruiter contracts description: 'The Recruiter contracts this account''s member can act under (LinkedIn''s contract chooser, wire get-recruiter-contract-options), with current_contract_id = the contract the account''s seat is stamped under. NEEDS A RECRUITER SEAT on the account (422 recruiter_required otherwise). Read it when recruiter_status is set but recruiter_seat_id is null: a member on several contracts holds no seat until the browser is bound to one. The premium check does not bind one by itself: from the platform''s browser this list answers LinkedIn 401 on every account so far, a live session included, and the refusal comes back verbatim as result.status failed without touching recruiter_status. The working way to a bound seat is the seat holder''s Sign in to Recruiter: the cloud browser opens on Recruiter, LinkedIn shows its own contract chooser, and the confirmed start re-reads the seat. CORPORATE rows are Recruiter seats; the INDIVIDUAL row is a Job Posting contract on the personal account. Not gated on the Recruiter session clock. Contract: - MCP tool `get_linkedin_account_my_recruiter_contracts`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.recruiter`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyRecruiterContractsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_recruiter_contracts x-gtm-mcp-mount: linkedin.recruiter x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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-accounts/{sid}/get-my-recruiter-seat: post: operationId: get_linkedin_account_my_recruiter_seat summary: Get my Recruiter seat description: 'This account''s own LinkedIn Recruiter seat, contract, profile and entitlements (the talentMe read). NEEDS A RECRUITER SEAT on the account (422 recruiter_required otherwise). Every field can be null: the wire may omit any of them. owner_seat_id is the seat number the recruiter sync and thread tools dispatch with; the premium check stamps it onto the account itself (recruiter_seat_id), this read persists nothing. Call it to check can_send_paid_inmail and credits before send_linkedin_recruiter_message, or to see using_multiple_contracts. Spends one self_account_sync unit. Contract: - MCP tool `get_linkedin_account_my_recruiter_seat`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.recruiter`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyRecruiterSeatResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_recruiter_seat x-gtm-mcp-mount: linkedin.recruiter x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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-accounts/{sid}/get-my-sales-nav-notifications: post: operationId: get_linkedin_account_my_sales_nav_notifications summary: Get my Sales Navigator alerts description: 'This account''s Sales Navigator alert feed, the bell on linkedin.com/sales/home: saved leads and accounts posting, changing job, accepting an invitation, or turning up in a profile-view signal. NEEDS A SALES NAVIGATOR SEAT on the account; without one we refuse up front rather than spend a run on a likely refusal. Ordered by LinkedIn''s own RELEVANCE score, NOT reverse-chronological, so sort by published_at yourself before calling anything new. That field is epoch milliseconds and is the only machine-readable timestamp across the three self feeds. metadata.num_unseen counts unseen alerts feed-wide, not on this page, and is not a row total. Cursor-paginated, no total: pass paging.next_page_cursor back as `cursor` until it is absent. Alerts sent without an id are dropped, so a page can be shorter than page_size while the feed continues; never read a short page as the end here. NOT profile views (get_linkedin_account_my_profile_views) and NOT the catch-up prompts (get_linkedin_account_my_catch_up). Contract: - MCP tool `get_linkedin_account_my_sales_nav_notifications`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMySalesNavNotificationsRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMySalesNavNotificationsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_sales_nav_notifications x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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-accounts/{sid}/get-my-services: post: operationId: get_linkedin_account_my_services summary: Get my services page description: 'Read the connected account''s OWN LinkedIn services page ("Providing services") as its edit form: status (ACTIVE or UNPUBLISHED), description, the offered services with their standardized-skill ids, the location and messaging flags, review visibility, pricing, the currencies LinkedIn offers and the 16 top-level service categories (valid service ids, though sub-skills exist too: lookup_linkedin_param_id with type service_category finds them by name). result.page is null when the account has no page. The public page of any member is enrich_linkedin_person_services; this is the owner''s view, read live. Contract: - MCP tool `get_linkedin_account_my_services`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMyServicesResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_services x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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 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-accounts/{sid}/get-my-sessions: post: operationId: get_linkedin_account_my_sessions summary: Get my sessions description: 'List the active LinkedIn sessions for the connected account. Contract: - MCP tool `get_linkedin_account_my_sessions`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMySessionsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_sessions x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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 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-accounts/{sid}/get-my-ssi: post: operationId: get_linkedin_account_my_ssi summary: Get my SSI description: 'Read the connected account''s Social Selling Index: the overall score, the four pillars it is the sum of (professional brand, finding the right people, engaging with insights, building relationships), and where the account stands inside its industry and its own network. Answers WITHOUT a Sales Navigator seat, reporting that as active_seat: false with the scores still filled in, so it is a health signal for any account rather than a premium-only read. Identity-bound: the sid names the account whose own dashboard is read; there is no way to read someone else''s SSI. Every score is FRACTIONAL (a real reading is 53.496, not 53), so do not round before comparing runs, the week-over-week movement is usually under a point. Contract: - MCP tool `get_linkedin_account_my_ssi`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: read only; 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/GetLinkedinAccountMySsiResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: get_linkedin_account_my_ssi x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action 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 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-accounts/{sid}/invite-to-event: post: operationId: invite_linkedin_members_to_event summary: Invite members to event description: 'Invite up to 25 members to a LinkedIn event, in ONE call: one invitation batch from the account''s open LinkedIn tab, one browser round and one networking_general unit (40 a day, 180 s apart; 429 on saturation). event_ln_id is the digits of the event urn, the event_ln_id of a search_linkedin_events row (the number in /events//). A target is a member id (ln_id, preferred) or a nickname; a nickname alone costs one profile read first, and a Sales Navigator id is not an address here. LinkedIn decides who may invite and who may be invited: a member inviting 1st-degree connections to a public event it does not organize went through live, as LinkedIn''s own Invite button allows. The answer is one flag for the batch; a false is 409 event_invite_rejected with the ids sent, without saying which member was refused or whether the others landed. A member already invited counts as success, one who already accepted is skipped. Writes nothing locally. Contract: - MCP tool `invite_linkedin_members_to_event`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.network`. - 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 `networking_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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InviteLinkedinMembersToEventRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/InviteLinkedinMembersToEventResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: invite_linkedin_members_to_event x-gtm-mcp-mount: linkedin.network x-gtm-entity: linkedin_accounts 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: networking_general servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-accounts/{sid}/my-position: post: operationId: set_linkedin_account_my_position summary: Set my position description: 'Add, edit or remove ONE position (work experience entry) on the connected account''s OWN LinkedIn profile. No position_id = add (title, company_name and start_date required, end_date unless is_current). position_id = edit: send only the fields that change, the backend reads the position''s form first and submits it whole (the LinkedIn wire replaces the form); is_current: true drops the end date, an end_date ends a current position. position_id + delete: true = remove it (the backend reads the form and mirrors it into the delete, as LinkedIn''s own editor does). position_id is the numeric id each entry carries on the account''s own experience list (enrich_linkedin_person_experience on its own profile, or the add''s answer). Company, geo and employment-type ids are LinkedIn''s own numeric ids; without them the company is free text and the location display text only. Spends one edit_profile slot per call. Contract: - MCP tool `set_linkedin_account_my_position`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - 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 `edit_profile` 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/SetLinkedinAccountMyPositionRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/SetLinkedinAccountMyPositionResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: set_linkedin_account_my_position x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts 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: edit_profile servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-accounts/{sid}/my-profile: patch: operationId: edit_linkedin_account_my_profile summary: Edit my profile description: 'Edit the connected account''s OWN LinkedIn profile in one call: the intro card (name, headline, additional name, industry, location, the current position/education pins and their visibility, website, pronouns), the About section (`about`, `top_skills`), the profile photo (`photo`) and the background image (`background`). Send only what changes: the intro card is read first and submitted whole (the LinkedIn wire replaces it), the About save is partial (an omitted field keeps its value, about: '''' clears the text, top_skills: [] removes them all), each image replaces one picture. Every section is its own LinkedIn save, run in that order and reported under result.sections; a refused section stops the call and the error names failed_section and applied_sections. One call spends one edit_profile slot however many sections it saves. Positions (work experience) have their own tool, set_linkedin_account_my_position. Contract: - MCP tool `edit_linkedin_account_my_profile`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - 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 `edit_profile` 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/EditLinkedinAccountMyProfileRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/EditLinkedinAccountMyProfileResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: edit_linkedin_account_my_profile x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts 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: edit_profile servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-accounts/{sid}/my-services: post: operationId: set_linkedin_account_my_services summary: Set my services page description: 'Create, update, republish or unpublish the connected account''s OWN LinkedIn services page ("Providing services"): one tool, the page''s state picks the LinkedIn action. No page yet: description and services (1..10 standardized-skill ids; get_linkedin_account_my_services lists the 16 top-level ones) are required and the page is created live with LinkedIn''s onboarding defaults for what you omit. A page exists: send only what changes, the rest keeps its stored value; a page that was unpublished comes back on the profile with any save, and republish: true with no field does just that (LinkedIn has no publish action). unpublish: true takes the page down (page_slug optional; the platform resolves it while the page is still published). pricing is {kind: contact} or {kind: starting_at, currency, amount}; at least one of location_profile / location_remote must stay true. Spends one edit_profile slot. Contract: - MCP tool `set_linkedin_account_my_services`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - 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 `edit_profile` 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/SetLinkedinAccountMyServicesRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/SetLinkedinAccountMyServicesResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: set_linkedin_account_my_services x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts 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: edit_profile servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-accounts/{sid}/reset-sync: post: operationId: reset_linkedin_account_sync summary: Reset account sync description: 'Reset one or more sync tracks for the account and re-run them from scratch. ASYNC: returns pending refs to poll; DESTRUCTIVE: discards sync cursors. Contract: - MCP tool `reset_linkedin_account_sync`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action_async`. - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API.' tags: - linkedin_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ResetLinkedinAccountSyncRequest' responses: '200': description: '`action_async` success envelope.' content: application/json: schema: $ref: '#/components/schemas/ResetLinkedinAccountSyncResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: reset_linkedin_account_sync x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action_async 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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-accounts/{sid}/select-recruiter-contract: post: operationId: select_linkedin_account_recruiter_contract summary: Select my Recruiter contract description: 'Bind the account''s browser to ONE of the member''s Recruiter contracts (the contract chooser''s Select, wire select-recruiter-contract) and stamp the seat that comes with it. contract_id is the ts_contract NUMBER from get_linkedin_account_my_recruiter_contracts, never a urn. Pick a CORPORATE row: the wrong row binds the browser to the wrong inbox, and a member on several contracts is exactly who this is for; the premium check never binds one by itself. A seat in the answer marks recruiter_status active. 422 contract_not_offered lists the rows on offer in context.offered; 422 contract_not_selectable means the row lacks an urn the Select needs. On success recruiter_seat_id and recruiter_contract_id are stamped from LinkedIn''s answer; when it carried no seat the browser is still bound and the next premium check with checks: [''recruiter''] stamps the pair. Switching contracts switches the Recruiter inbox the sync reads: a reset of recruiter_conversations after a switch is the operator''s call. Contract: - MCP tool `select_linkedin_account_recruiter_contract`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.recruiter`. - 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 `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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SelectLinkedinAccountRecruiterContractRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/SelectLinkedinAccountRecruiterContractResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: select_linkedin_account_recruiter_contract x-gtm-mcp-mount: linkedin.recruiter x-gtm-entity: linkedin_accounts 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: self_account_sync servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-accounts/{sid}/set-smart-limits: post: operationId: set_linkedin_account_smart_limits summary: Set account smart limits description: 'Switch smart-limit governance on or off for the WHOLE account, every bucket at once (no per-bucket toggle). The switch remembers nothing: a real flip in EITHER direction first resets every limit row to the platform defaults (daily_limit = the bucket''s platform max, delay_in_seconds = the flat default, target_limit = the platform default, hold cleared). ON: the warmup then sets every row''s daily_limit / delay_in_seconds (re-derived from the latest snapshot) and update_linkedin_account_smart_limit refuses those fields with 409 smart_limits_governed; target_limit and learning_enabled stay yours. The seeded target_limit is a target the warmup climbs toward, never a limit somebody set. OFF: every cap runs exactly as typed and the account loses the warmup ban protection: say so first, read the rows'' recommended_* before typing caps. Idempotent. SINGLE account: a fleet is a mass action with step linkedin-accounts.set-smart-limits (scope objects, args {enabled}), run BEFORE a limit-row run on the same senders. Contract: - MCP tool `set_linkedin_account_smart_limits`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - 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; step eligible: gtm.service.orchestration can run this verb as a mass-action plan step, once per item.' tags: - linkedin_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SetLinkedinAccountSmartLimitsRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/SetLinkedinAccountSmartLimitsResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: set_linkedin_account_smart_limits x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts 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: true 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-accounts/{sid}/unendorse-skill: post: operationId: unendorse_linkedin_account_skill summary: Unendorse skill description: 'Retract ONE skill endorsement this account holds on a 1st-degree connection (wire unendorse-skill, ?action=unendorse): the undo of endorse_linkedin_account_skill / endorse_linkedin_account_skill_by_id, addressed by the same skill_id. Spends the SAME endorse_skills bucket as the endorse it reverses (verb-pair rule; an undo is paced 2 s, not the bucket delay, so a do/undo pair fits back to back). Returns the echoed skill urn, endorsed_by_viewer (false after unendorse) and the global endorsement_count, plus the activity-log row. Retracting the LAST endorsement of a skill collapses its person-skills row to name only (no skill_id, no count). Retracting one this account never made is unverified on the wire. Contract: - MCP tool `unendorse_linkedin_account_skill`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.content`. - 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 `endorse_skills` 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UnendorseLinkedinAccountSkillRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/UnendorseLinkedinAccountSkillResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: unendorse_linkedin_account_skill x-gtm-mcp-mount: linkedin.content x-gtm-entity: linkedin_accounts 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: endorse_skills servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-accounts/{sid}/update-sync-config: post: operationId: update_linkedin_account_sync_config summary: Update account sync config description: 'Set the account''s weekly sync schedule: the timezone, the allowed per-weekday time windows, and per-track cadence entries. Replaces the stored sync_config wholesale (send the full desired config, not a delta). Returns the updated account. SINGLE account: to reschedule a fleet, author a mass action on /mcp/orchestration/mass-actions with the step `linkedin-accounts.update-sync-config` (scope objects) so the whole change rides ONE approval. Contract: - MCP tool `update_linkedin_account_sync_config`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - Operation `action`, response envelope `action`. - Flags: step eligible: gtm.service.orchestration can run this verb as a mass-action plan step, once per item.' tags: - linkedin_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateLinkedinAccountSyncConfigRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/UpdateLinkedinAccountSyncConfigResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: update_linkedin_account_sync_config x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts x-gtm-operation: action x-gtm-envelope: action x-gtm-availability: ga x-gtm-dangerous: false x-gtm-mass-action: false x-gtm-step-eligible: true 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-accounts/{sid}/visit-profile: post: operationId: visit_linkedin_account_profile summary: Visit profile description: 'Visit a target person''s profile from this account (warm-up / signal action). Outward action on LinkedIn. Contract: - MCP tool `visit_linkedin_account_profile`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - 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 `visit_profiles` 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_accounts parameters: - name: sid in: path required: true description: LinkedIn account sid (ln_ac_…). schema: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: LinkedIn account sid (ln_ac_…). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VisitLinkedinAccountProfileRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/VisitLinkedinAccountProfileResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: visit_linkedin_account_profile x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts 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: visit_profiles servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-followings/follow: post: operationId: follow_linkedin_member summary: Follow LinkedIn member description: 'Follow a LinkedIn member as this account, so their posts reach its feed. One-way and needs no relationship: you can follow anyone whose profile allows it, connected or not, which makes it a common warmup step before a connection request. IDEMPOTENT: following someone this account already follows returns 200 with the same terminal state, so a repeat is a success, not an error. The wire cannot tell a fresh follow from a repeat, so read get_linkedin_account_my_following first if you need that answer; either way the call spends one networking_general unit (40 a day, 180 s apart). Pass target.nickname whenever you know it, even alongside ln_id: it saves LinkedIn a member lookup and cuts the action from three wire requests to two. Identity-bound: linkedin_account_sid REQUIRED, 429 on saturation. Writes nothing locally; the follow list catches up on the next get_linkedin_account_my_following refresh. Contract: - MCP tool `follow_linkedin_member`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - 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; step eligible: gtm.service.orchestration can run this verb as a mass-action plan step, once per item; paced: a call spends the `networking_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_accounts requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/FollowLinkedinMemberRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/FollowLinkedinMemberResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: follow_linkedin_member x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts 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: true x-gtm-schedule-required: false x-gtm-tool-class: typical x-gtm-paced-bucket: networking_general servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /api/linkedin-followings/unfollow: post: operationId: unfollow_linkedin_member summary: Unfollow LinkedIn member description: 'Stop following a LinkedIn member as this account, the inverse of follow_linkedin_member. NOT a disconnect: it leaves a 1st-degree connection intact and only stops that member''s posts reaching the feed, so it is how you mute someone you still want to stay connected to. Severing the relationship is remove_linkedin_connection. IDEMPOTENT: unfollowing someone this account does not follow returns 200 with the same terminal state, so a repeat is a success, not an error, and it still spends one networking_general unit (40 a day, 180 s apart). Pass target.nickname whenever you know it, even alongside ln_id: it saves LinkedIn a member lookup and cuts the action from three wire requests to two. Identity-bound: linkedin_account_sid REQUIRED, 429 on saturation. Deletes nothing locally; the follow list catches up on the next get_linkedin_account_my_following refresh. Contract: - MCP tool `unfollow_linkedin_member`, registry package `mcp.linkedin/linkedin_accounts`, mount `linkedin.accounts`. - 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 `networking_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_accounts requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UnfollowLinkedinMemberRequest' responses: '200': description: '`action` success envelope.' content: application/json: schema: $ref: '#/components/schemas/UnfollowLinkedinMemberResponse' 4XX: $ref: '#/components/responses/McpClientError' 5XX: $ref: '#/components/responses/McpServerError' x-gtm-mcp-tool: unfollow_linkedin_member x-gtm-mcp-mount: linkedin.accounts x-gtm-entity: linkedin_accounts 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: networking_general servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway components: schemas: GetLinkedinAccountMyFollowingResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 CheckLinkedinAccountTargetBlockRequest: type: object description: Request body of `check_linkedin_account_target_block`. properties: target: type: object properties: ln_id: type: string description: LinkedIn member id. sn_id: type: string description: Sales Navigator member id. nickname: type: string description: Public profile slug. description: Target person; provide at least one of ln_id / sn_id / nickname. force: type: boolean description: Bypass a cached result and re-probe. required: - target SetLinkedinAccountLabelRequest: type: object description: Request body of `set_linkedin_account_label`. properties: label: type: - string - 'null' maxLength: 255 description: 'The owning team''s private tag on the sender; null clears it. Required: send the field on every call.' required: - label SelectLinkedinAccountRecruiterContractRequest: type: object description: Request body of `select_linkedin_account_recruiter_contract`. properties: contract_id: type: string pattern: ^\d{1,32}$ description: The ts_contract number as get_linkedin_account_my_recruiter_contracts lists it, e.g. "437500276". Never a urn. required: - contract_id GetLinkedinAccountMyRecruiterContractsResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: recruiter_contracts: type: array items: type: object properties: contract_id: type: string description: 'The ts_contract number: what select_linkedin_account_recruiter_contract takes. Never a urn.' contract_urn: type: - string - 'null' description: urn:li:ts_contract:N, verbatim. contract_name: type: - string - 'null' category: type: - string - 'null' description: CORPORATE = a Recruiter seat on a company contract; INDIVIDUAL = a LinkedIn Job Posting contract on the personal account, never a Recruiter seat. Open vocabulary. description: type: - string - 'null' sso_enabled: type: - boolean - 'null' application_instance_urn: type: - string - 'null' enterprise_profile_urn: type: - string - 'null' enterprise_account_id: type: - string - 'null' description: Parsed from enterprise_profile_urn; null when its shape did not match. enterprise_profile_id: type: - string - 'null' required: - contract_id - contract_urn - contract_name - category - description - sso_enabled - application_instance_urn - enterprise_profile_urn - enterprise_account_id - enterprise_profile_id description: The chooser rows, contract_id first. Empty when the chooser offers nothing selectable. current_contract_id: type: - string - 'null' description: 'The contract the account''s seat is stamped under (recruiter_contract_id), null when no seat is stamped: on a member with several contracts that is the row to select.' required: - recruiter_contracts - current_contract_id 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 FollowLinkedinMemberRequest: type: object description: Request body of `follow_linkedin_member`. properties: linkedin_account_sid: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: 'LinkedIn account sid (ln_ac_…): the account that does the following. Identity-bound, so it is REQUIRED: the verbs below act AS this account. Travels in the body; this route group has no /{sid} path.' target: type: object properties: ln_id: type: - string - 'null' maxLength: 128 description: LinkedIn member id (ACoAA…). Dispatched straight through as the wire's profile_id, so a target carrying one needs no member lookup. sn_id: type: - string - 'null' maxLength: 64 description: Sales Navigator member id. nickname: type: - string - 'null' maxLength: 100 description: 'Public profile slug, the vanity name in the profile URL. Pass it whenever you know it, INCLUDING alongside ln_id: it rides the wire as public_identifier and saves LinkedIn a member-resolution round trip, cutting the action from three requests to two. A nickname-ONLY target costs an extra profile read before the action instead.' description: Target person; provide at least one of ln_id / sn_id / nickname. Best case is a member id plus the nickname. required: - linkedin_account_sid - target CheckLinkedinAccountPremiumSubscriptionRequest: type: object description: Request body of `check_linkedin_account_premium_subscription`. properties: checks: type: - array - 'null' items: type: string enum: - premium - sales_nav - recruiter - inmail_credits minItems: 1 maxItems: 4 description: 'Which steps to run. OMIT for all four, which is the normal call. `premium` reads the profile flag and, on a full run, settles both seats when it comes back false. `sales_nav` and `recruiter` probe one seat each and are the cheap ones. `inmail_credits` reads the pool the plan has: the Sales Navigator grant into inmail_credits with a seat, the Premium plan''s own balance into premium_inmail_credits for a Premium account without one, and, next to either, the Recruiter contract''s own balance into recruiter_inmail_credits for an ACTIVE Recruiter seat (LinkedIn keeps the three pools apart; a signed-out seat is not read and keeps its last number). An account with no Premium has no pool: on a full run the step is skipped (last known balances kept), and naming it in `checks` for one is refused with 422 `premium_required`. Asking for a subset skips the rest entirely, so nothing you did not ask for is re-read or re-written.' UnendorseLinkedinAccountSkillResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: activity_log: type: object properties: {} description: The dispatch row (linkedin-account-activity-log), action_type endorse_skills or unendorse_skills. skill_id: type: string description: Echoes the caller's skill_id. endorsed_skill_urn: type: - string - 'null' description: The echoed request skill urn urn:li:fsd_profileEndorsedSkill:(,), read from value.entityUrn; null when LinkedIn omitted it. endorsed_by_viewer: type: - boolean - 'null' description: 'The authoritative post-action state of THIS viewer''s endorsement: true after endorse, false after unendorse; null when absent. A stronger verification signal than the urn echo, needs no cache-busting read.' endorsement_count: type: - integer - 'null' description: The global endorser counter for the skill. Moves with everyone's endorsements, so assert direction not an absolute; null when absent. required: - activity_log - skill_id - endorsed_skill_urn - endorsed_by_viewer - endorsement_count 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 GetLinkedinAccountMyFollowingRequest: type: object description: Request body of `get_linkedin_account_my_following`. properties: page_size: type: integer minimum: 1 maximum: 100 cursor: type: - string - 'null' SelectLinkedinAccountRecruiterContractResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: recruiter_contract: type: - object - 'null' properties: contract_id: type: string description: 'The ts_contract number: what select_linkedin_account_recruiter_contract takes. Never a urn.' contract_urn: type: - string - 'null' description: urn:li:ts_contract:N, verbatim. contract_name: type: - string - 'null' category: type: - string - 'null' description: CORPORATE = a Recruiter seat on a company contract; INDIVIDUAL = a LinkedIn Job Posting contract on the personal account, never a Recruiter seat. Open vocabulary. description: type: - string - 'null' sso_enabled: type: - boolean - 'null' application_instance_urn: type: - string - 'null' enterprise_profile_urn: type: - string - 'null' enterprise_account_id: type: - string - 'null' description: Parsed from enterprise_profile_urn; null when its shape did not match. enterprise_profile_id: type: - string - 'null' required: - contract_id - contract_urn - contract_name - category - description - sso_enabled - application_instance_urn - enterprise_profile_urn - enterprise_account_id - enterprise_profile_id description: The row the browser was bound to. owner_seat_id: type: - string - 'null' description: The ts_seat under the bound contract, off LinkedIn's answer; null when the answer carried none. profile_id: type: - string - 'null' description: The talent (AEMAA…) id of the recruiter under the bound contract. redirect_url: type: - string - 'null' description: Where LinkedIn sends the chooser next. Informational. seat_stamped: type: boolean description: 'True when recruiter_seat_id and recruiter_contract_id were stamped from this answer; false when it carried no seat, in which case the browser is bound and the next premium check (checks: [''recruiter'']) stamps the pair.' required: - recruiter_contract - owner_seat_id - profile_id - redirect_url - seat_stamped 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 ResetLinkedinAccountSyncRequest: type: object description: Request body of `reset_linkedin_account_sync`. properties: types: type: array items: type: string enum: - connections - connection_requests - connection_invitations - conversations - sales_navigator_conversations - recruiter_conversations minItems: 1 description: Sync tracks to reset (LinkedinAccountResetSyncTypeEnum values). required: - types UpdateLinkedinAccountSyncConfigResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 required: - success - operation - action - item - result - meta SetLinkedinAccountMyServicesRequest: type: object description: Request body of `set_linkedin_account_my_services`. properties: unpublish: type: boolean description: Take the page down. Nothing else travels with it. republish: type: boolean description: Put an unpublished page back on the profile without changing it. page_slug: type: string pattern: ^[A-Za-z0-9_-]{1,100}$ description: 'With unpublish: the page slug (the tail of /services/page/) when you have it; needed once the page is already unpublished.' description: type: string maxLength: 500 description: Required for a new page. LinkedIn's cap is 500. services: type: array items: anyOf: - type: string pattern: ^\d+$ - type: object properties: id: type: string pattern: ^\d+$ name: type: string minLength: 1 required: - id minItems: 1 maxItems: 10 description: 1..10 standardized-skill ids (e.g. 220 Consulting, 71 Accounting), no id twice. Required for a new page. On an existing page an id may come with its name. location_profile: type: boolean description: Offer the services at the profile's own location. location_remote: type: boolean description: Offer them remotely. open_messaging: type: boolean description: Let members outside the network message the account for free. review_visibility: type: boolean description: Show ratings and reviews to all members. pricing: type: object properties: kind: type: string enum: - contact - starting_at currency: type: string pattern: ^[A-Z]{3}$ description: ISO 4217, one of the read's available_currencies; with starting_at. amount: type: integer minimum: 1 description: The hourly rate in whole units; with starting_at. required: - kind CheckLinkedinAccountTargetBlockResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 InviteLinkedinMembersToEventResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: activity_log: type: object properties: {} description: The one dispatch row of the batch (linkedin-account-activity-log) per §4.12a; action_type invite_to_event. success: type: boolean description: 'The wire''s own flag, mirrored: true when LinkedIn took the batch and every element it answered was 200 (already invited) or 201 (created). Always true in a 200; a false is the 409 event_invite_rejected.' event_ln_id: type: string description: The event the batch went to, echoed. profile_ids: type: array items: type: string description: 'The member ids LinkedIn was given, resolved and deduped, in the order of the targets: a caller who addressed people by nickname learns the ids here.' required: - activity_log - success - event_ln_id - profile_ids 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 GetLinkedinAccountMyCatchUpRequest: type: object description: Request body of `get_linkedin_account_my_catch_up`. properties: cursor: type: - string - 'null' description: Pass paging.next_page_cursor back verbatim. Omitted or null starts at the top of the feed. UnendorseLinkedinAccountSkillRequest: type: object description: Request body of `unendorse_linkedin_account_skill`. properties: target: type: object properties: ln_id: type: string description: LinkedIn member id. sn_id: type: string description: Sales Navigator member id. nickname: type: string description: Public profile slug. description: Target person; provide at least one of ln_id / sn_id / nickname. skill_id: type: string minLength: 1 maxLength: 64 description: The skill id this account endorsed (from a person-skills read, or the skill_id the endorse answered). required: - target - skill_id SetLinkedinAccountLabelResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - update item: type: object properties: sid: type: string team_sid: type: string antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at updated_fields: type: array items: type: string previous_values: 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 - item - updated_fields - previous_values - meta EditLinkedinAccountMyProfileRequest: type: object description: Request body of `edit_linkedin_account_my_profile`. properties: first_name: type: string minLength: 1 maxLength: 100 last_name: type: string minLength: 1 maxLength: 100 headline: type: string minLength: 1 maxLength: 220 description: LinkedIn's own cap is 220 characters. additional_name: type: string maxLength: 100 industry_id: type: string pattern: ^\d+$ description: LinkedIn industry id, e.g. '96'. location_geo_id: type: integer minimum: 1 sub_location_geo_id: type: integer minimum: 1 city_geo_id: type: string pattern: ^\d+$ location: type: string maxLength: 200 description: Display text for the location, e.g. Buenos Aires. postal_code: type: string maxLength: 20 current_position_id: type: string pattern: ^\d+$ current_education_id: type: string pattern: ^\d+$ show_current_position: type: boolean show_education: type: boolean website: type: string maxLength: 2048 website_label: type: string maxLength: 100 custom_pronouns: type: string maxLength: 50 about: type: - string - 'null' maxLength: 2600 description: The About section text (LinkedIn's cap is 2600). An empty string clears it; omit it to keep it. top_skills: type: array items: type: string minLength: 1 maxLength: 100 maxItems: 5 description: The up-to-5 top skills the About section shows, as skill names (LinkedIn's spelling) or ProfileSkill: ids the previous save reported. An empty array removes them all; omit to keep them. photo: type: object properties: file_base64: type: string minLength: 1 description: 'The image bytes: a data:;base64,<...> URL or bare base64, encoded by a tool (never typed out). Exactly one of file_base64 or url.' url: type: string maxLength: 2048 format: uri description: An https URL of the image file itself (PNG, JPEG, GIF or WEBP), downloaded by us from a public host. Exactly one of file_base64 or url; a request_media_upload file_url works once uploaded. file_name: type: string minLength: 1 maxLength: 255 description: Optional; derived from the type when omitted. file_type: type: string pattern: ^image\/ description: Optional; the real type is read off the bytes. file_byte_size: type: integer minimum: 1 description: A new profile photo (avatar), replacing the current one. LinkedIn's own cap is 8 MB. background: type: object properties: file_base64: type: string minLength: 1 description: 'The image bytes: a data:;base64,<...> URL or bare base64, encoded by a tool (never typed out). Exactly one of file_base64 or url.' url: type: string maxLength: 2048 format: uri description: An https URL of the image file itself (PNG, JPEG, GIF or WEBP), downloaded by us from a public host. Exactly one of file_base64 or url; a request_media_upload file_url works once uploaded. file_name: type: string minLength: 1 maxLength: 255 description: Optional; derived from the type when omitted. file_type: type: string pattern: ^image\/ description: Optional; the real type is read off the bytes. file_byte_size: type: integer minimum: 1 description: A new background (cover) image, replacing the current one. CheckLinkedinAccountPremiumSubscriptionResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 GetLinkedinAccountMyAnalyticsResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: status: type: string description: Plugin dispatch status for this read. analytics: type: object properties: date_from: type: string description: Window start actually reported on, YYYY-MM-DD. date_to: type: string metrics: type: object additionalProperties: type: object properties: total: type: integer description: Period total, equal to the sum of the daily series. change_percent: type: - number - 'null' description: 'Magnitude of the change vs the prior period. UNSIGNED: pair it with change_direction, and when that is null the direction is genuinely unknown.' change_direction: type: - string - 'null' enum: - up - down description: Often null in practice, including when change_percent is present. Treat null as unknown, never as flat or as up. daily: type: array items: type: object properties: date: type: string value: type: integer required: - date - value description: 'One point per day in the window, UTC dates. value is SIGNED: engagements is a daily delta and a retracted reaction shows as a below-zero day; never clamp it, the total is the sum.' required: - total - change_percent - change_direction - daily description: 'Keyed by wire metric name (impressions, engagements today). An OPEN map: new dashboard cards appear as new keys.' required: - date_from - date_to - metrics required: - status - analytics 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 GetLinkedinAccountMyHiringProjectsResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: hiring_projects: type: object properties: elements: type: array items: type: object properties: urn: type: string description: The compound urn:li:ts_hiring_project:(urn:li:ts_contract:,

), verbatim. project_id: type: - string - 'null' description: Parsed from the urn; null when the shape did not match (the urn stays authoritative). contract_id: type: - string - 'null' name: type: string description: 'Free-form project name, verbatim: unicode bold and leading spaces are the recruiter''s own text, never trimmed.' required: - urn - project_id - contract_id - name description: Most recently accessed first. paging: type: object properties: page_size: type: - integer - 'null' description: Rows asked for on this page (the wire default when the call omitted page_size). page_cursor: type: string description: The offset of the page just read, as a string. Treat it as opaque. next_page_cursor: type: string description: Pass back as `cursor` to get the next page. ABSENT means the list is over. total: type: integer description: Exact total of projects. required: - page_size required: - elements - paging required: - hiring_projects 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 GetLinkedinAccountMyProfileViewsResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: status: type: string description: Plugin dispatch status for this read. profile_views: type: object properties: elements: type: array items: type: object properties: position: type: integer description: LinkedIn's own rank for this viewer, read off the card. Server-authored and the sort key, ascending. is_anonymous: type: boolean description: 'True when the viewer browsed in private mode. Branch on this FIRST: an anonymous row has a descriptor instead of a name, a search url instead of a profile, and no member ids at all.' display_name: type: - string - 'null' description: The viewer name. On an ANONYMIZED row this holds the descriptor LinkedIn shows instead, e.g. "Someone at Acme" or "Executive Director in the software industry". headline: type: - string - 'null' network_distance: type: - string - 'null' description: 'Rendered degree: "1st" / "2nd" / "3rd". LinkedIn prefixes the line with punctuation, which is stripped before you see it.' url: type: - string - 'null' description: Profile url for a named viewer. For an ANONYMIZED viewer it is a PEOPLE-SEARCH url instead, so there is nothing to open and it is not an identity key. public_identifier: type: - string - 'null' description: Vanity slug, taken from url. Never present on an anonymized row, because that url is a search rather than a profile. profile_id: type: - string - 'null' description: ACoA member id. Present only when the card offered the MESSAGE action, which depends on network distance. member_urn: type: - string - 'null' description: urn:li:member:N. Present only when the card offered the CONNECT action. A row may carry this, profile_id, both, or neither. image_url: type: - string - 'null' description: Viewer avatar. An anonymized card renders a ghost placeholder and carries none. company_logo_url: type: - string - 'null' viewed_at_text: type: - string - 'null' description: 'RENDERED relative text, exactly as LinkedIn printed it, e.g. "Viewed 1w ago". Locale-bound and not parseable: this feed ships no machine-readable date anywhere.' mutual_connections_text: type: - string - 'null' description: Rendered shared-connections line, e.g. "3 mutual connections". required: - position - is_anonymous description: 'The viewers on this page, newest first. Empty on a page that rendered with nothing on it, and ALSO empty when the read failed: check status.' paging: type: object properties: page_size: type: - integer - 'null' description: Rows on this page as requested (the wire default is 10). It is what we ASKED for, not what came back. page_cursor: type: - string - 'null' description: Absolute offset of the page just read, as a string. It is not an opaque token, but treat it as one. next_page_cursor: type: - string - 'null' description: 'Pass back as `cursor` to get the next page. ABSENT means the feed is over, and that is the ONLY end signal: there is deliberately no total and no has-more flag.' required: - page_size - page_cursor required: - elements - paging required: - status - profile_views 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 SetLinkedinAccountSmartLimitsRequest: type: object description: Request body of `set_linkedin_account_smart_limits`. properties: enabled: type: boolean description: true = the warmup governs every bucket (protection on); false = the caps run as typed (protection off). required: - enabled VisitLinkedinAccountProfileRequest: type: object description: Request body of `visit_linkedin_account_profile`. properties: target: type: object properties: ln_id: type: string description: LinkedIn member id. sn_id: type: string description: Sales Navigator member id. nickname: type: string description: Public profile slug. description: Target person; provide at least one of ln_id / sn_id / nickname. required: - target FollowLinkedinMemberResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: activity_log: type: object properties: {} description: Full dispatch row (linkedin-account-activity-log) per §4.12a. followed: type: boolean description: 'The wire field, mirrored. Always true in a 200, and never the proof on its own: the backend returns 200 only when the terminal following_state confirmed the direction.' following_state: type: string description: The follow button state AFTER the action, read off the wire. Always Following in a 200. message: type: - string - 'null' description: LinkedIn's own toast, when it sent one. is_retryable: type: boolean description: LinkedIn's own retry hint, passed through untouched. required: - activity_log - followed - following_state - message - is_retryable 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 GetLinkedinAccountMySsiResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: status: type: string description: Plugin dispatch status for this read. ssi: type: object properties: active_seat: type: boolean description: Whether the account holds a live Sales Navigator seat. False does NOT mean the scores are absent. overall: type: number description: 0-100, the sum of the four pillars. Fractional. pillars: type: object properties: professional_brand: type: number find_right_people: type: number insight_engagement: type: number strong_relationship: type: number required: - professional_brand - find_right_people - insight_engagement - strong_relationship description: The four SSI components, each 0-25 and fractional. group_ranks: type: array items: type: object properties: group_type: type: string description: 'INDUSTRY or NETWORK. Open string: a group LinkedIn adds must surface, not vanish.' rank: type: integer description: Percentile standing inside the group, lower is better. group_size: type: integer industry: type: - string - 'null' description: Present on the INDUSTRY group only. overall: type: number description: SSI recomputed within this comparison group. required: - group_type - rank - group_size - overall description: Peer-group standings. Empty when the read failed. required: - active_seat - overall - pillars - group_ranks required: - status - ssi 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 GetLinkedinAccountMyRecruiterSeatResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: recruiter_seat: type: object properties: owner_seat_id: type: - string - 'null' description: 'The ts_seat number of this session: what the recruiter sync and thread tools dispatch with. Null when talentMe carried no seat decoration.' contract_id: type: - string - 'null' description: The ts_contract number. contract_seat_urn: type: - string - 'null' description: urn:li:ts_contract_seat:(urn:li:ts_contract:N,urn:li:ts_seat:M), verbatim. profile_id: type: - string - 'null' description: The talent (AEMAA…) id of the logged-in recruiter. first_name: type: - string - 'null' last_name: type: - string - 'null' headline: type: - string - 'null' public_profile_url: type: - string - 'null' picture_url: type: - string - 'null' description: Largest avatar artifact. using_multiple_contracts: type: - boolean - 'null' description: True when the recruiter holds seats on several contracts; the sync uses the session default seat. seat_state: type: - string - 'null' description: '"ACTIVE" observed. Open vocabulary.' contract_name: type: - string - 'null' contract_type: type: - string - 'null' description: '"AGENCY2" observed. Open vocabulary.' account_name: type: - string - 'null' company_name: type: - string - 'null' credits: type: array items: type: object properties: granted: type: integer left: type: integer type: type: string description: The credit kind, e.g. PROFILE_UNLOCK. Open vocabulary. required: - granted - left - type description: Contract credit grants. Empty when the wire carried none. can_access_mailbox: type: - boolean - 'null' description: Seat entitlement. Null when the entitlement list itself was absent, which is not the same as false. can_send_paid_inmail: type: - boolean - 'null' description: 'Seat entitlement: the cheapest pre-flight before send_linkedin_recruiter_message. Null when the entitlement list was absent.' required: - owner_seat_id - contract_id - contract_seat_urn - profile_id - first_name - last_name - headline - public_profile_url - picture_url - using_multiple_contracts - seat_state - contract_name - contract_type - account_name - company_name - credits - can_access_mailbox - can_send_paid_inmail required: - recruiter_seat 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 UnfollowLinkedinMemberRequest: type: object description: Request body of `unfollow_linkedin_member`. properties: linkedin_account_sid: type: string minLength: 18 maxLength: 18 pattern: ^ln_ac_ description: 'LinkedIn account sid (ln_ac_…): the account that does the following. Identity-bound, so it is REQUIRED: the verbs below act AS this account. Travels in the body; this route group has no /{sid} path.' target: type: object properties: ln_id: type: - string - 'null' maxLength: 128 description: LinkedIn member id (ACoAA…). Dispatched straight through as the wire's profile_id, so a target carrying one needs no member lookup. sn_id: type: - string - 'null' maxLength: 64 description: Sales Navigator member id. nickname: type: - string - 'null' maxLength: 100 description: 'Public profile slug, the vanity name in the profile URL. Pass it whenever you know it, INCLUDING alongside ln_id: it rides the wire as public_identifier and saves LinkedIn a member-resolution round trip, cutting the action from three requests to two. A nickname-ONLY target costs an extra profile read before the action instead.' description: Target person; provide at least one of ln_id / sn_id / nickname. Best case is a member id plus the nickname. required: - linkedin_account_sid - target UpdateLinkedinAccountSyncConfigRequest: type: object description: Request body of `update_linkedin_account_sync_config`. properties: sync_config: type: object properties: timezone: type: string description: IANA timezone (e.g. Europe/Amsterdam) the windows/entries are evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 description: 'ISO weekday: 1=Mon … 7=Sun.' start_minute: type: integer minimum: 0 maximum: 1439 description: Window start, minutes from local midnight (0..1439). end_minute: type: integer minimum: 1 maximum: 1440 description: Window end, minutes from local midnight (1..1440); must be after start_minute. required: - day_of_week - start_minute - end_minute description: Allowed sync hours per weekday. Omit it, or send an empty list, to sync around the clock; an empty window never means off. entries: type: object properties: connections: type: object properties: interval_minutes: type: integer minimum: 5 required: - interval_minutes conversations: type: object properties: interval_minutes: type: integer minimum: 5 required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: integer minimum: 5 required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: integer minimum: 5 required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: integer minimum: 5 required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: integer minimum: 5 required: - interval_minutes premium_check: type: object properties: interval_minutes: type: integer minimum: 5 required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: integer minimum: 5 required: - interval_minutes description: Per-track cadence overrides (minutes, ≥5), keyed by sync track. required: - timezone description: Weekly sync schedule for the account (replaces the stored config wholesale). required: - sync_config GetLinkedinAccountMyAnalyticsRequest: type: object description: Request body of `get_linkedin_account_my_analytics`. properties: date_from: type: - string - 'null' pattern: ^\d{4}-\d{2}-\d{2}$ description: Window start, YYYY-MM-DD. Omit BOTH dates for the trailing 28 days; supplying only one is a 422. date_to: type: - string - 'null' pattern: ^\d{4}-\d{2}-\d{2}$ description: Window end, YYYY-MM-DD. Must not precede date_from and must not be in the future. GetLinkedinAccountMyCatchUpResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: status: type: string description: Plugin dispatch status for this read. catch_up: type: object properties: elements: type: array items: type: object properties: position: type: integer description: 'Index in the feed. OURS, not LinkedIn''s: it counts the cards that parsed, so a card we could not read shifts every card after it. Key a card by card_urn.' card_urn: type: - string - 'null' description: 'urn:li:prop:(TYPE,id): the id of the NURTURE PROMPT, not of the member and not of a post. The only stable key on the row.' type: type: - string - 'null' description: 'Prompt type, taken off the urn. Captured so far: BIRTHDAY, JOB_CHANGE, WORK_ANNIVERSARY. OPEN vocabulary, so treat an unseen value as valid rather than as an error.' display_name: type: - string - 'null' description: The person the card is about, as rendered. May carry emoji that a profile field would not. prompt_text: type: - string - 'null' description: The card's second line, e.g. "Celebrate Jane's recent birthday on Aug 6". The date exists ONLY here, as rendered words. suggested_message: type: - string - 'null' description: The label LinkedIn printed on the card's primary button, which for these cards is the one-click message itself, e.g. "Happy birthday!". message_sent: type: - boolean - 'null' description: True when this account already sent that card's message, so the card is spent. NULL means LinkedIn reported nothing for it, which is NOT the same as false. first_name: type: - string - 'null' last_name: type: - string - 'null' url: type: - string - 'null' public_identifier: type: - string - 'null' profile_id: type: - string - 'null' member_urn: type: - string - 'null' image_url: type: - string - 'null' required: - position description: 'The nurture cards on this page. Empty on an exhausted feed, and ALSO empty when the read failed: check status.' paging: type: object properties: page_size: type: - integer - 'null' description: Always 10. LinkedIn's own request carries no count knob, so the page is server-fixed and this number does not track how many rows actually came back. page_cursor: type: - string - 'null' description: Absolute offset of the page just read, as a string. It is not an opaque token, but treat it as one. next_page_cursor: type: - string - 'null' description: 'Pass back as `cursor` to get the next page. ABSENT means the feed is over, and that is the ONLY end signal: there is deliberately no total and no has-more flag.' required: - page_size - page_cursor required: - elements - paging required: - status - catch_up 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 SetLinkedinAccountSmartLimitsResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 required: - success - operation - action - item - result - meta ResetLinkedinAccountSyncResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 EndorseLinkedinAccountSkillByIdResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: activity_log: type: object properties: {} description: The dispatch row (linkedin-account-activity-log), action_type endorse_skills or unendorse_skills. skill_id: type: string description: Echoes the caller's skill_id. endorsed_skill_urn: type: - string - 'null' description: The echoed request skill urn urn:li:fsd_profileEndorsedSkill:(,), read from value.entityUrn; null when LinkedIn omitted it. endorsed_by_viewer: type: - boolean - 'null' description: 'The authoritative post-action state of THIS viewer''s endorsement: true after endorse, false after unendorse; null when absent. A stronger verification signal than the urn echo, needs no cache-busting read.' endorsement_count: type: - integer - 'null' description: The global endorser counter for the skill. Moves with everyone's endorsements, so assert direction not an absolute; null when absent. required: - activity_log - skill_id - endorsed_skill_urn - endorsed_by_viewer - endorsement_count 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 SearchLinkedinAccountsResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 properties: total_count: type: integer description: Rows matching the filter. with_sn_count: type: integer description: Accounts with has_sn = true. with_premium_count: type: integer description: Accounts with has_premium = true. with_recruiter_count: type: integer description: Accounts with a Recruiter seat (recruiter_status active or signed_out). active_today_count: type: integer description: Heartbeat since today 00:00 UTC. Server UTC day boundary, not schedule-aware. stale_count: type: integer description: Heartbeat cold for over 24h or never set. Not schedule-aware, so out-of-window quiet time also counts. signed_out_count: type: integer description: Accounts whose bound live browser sits in login_issue or restricted, meaning SIGNED OUT of LinkedIn. Non-zero says senders need attention even when every item shows status "active" (that field is lifecycle, not login state). Attribute per row via include antidetect_browser. restricted_count: type: integer description: 'The subset of signed_out_count whose browser sits in restricted: right after the logout the platform read the public profile from another account and LinkedIn had none for the member, so the account is restricted (or closed) and a re-login alone will not bring it back. Tell the user to sort it out with LinkedIn first.' required: - total_count - with_sn_count - with_premium_count - with_recruiter_count - active_today_count - stale_count required: - success - operation - items - pagination - applied_filters - includes - meta GetLinkedinAccountMySalesNavNotificationsRequest: type: object description: Request body of `get_linkedin_account_my_sales_nav_notifications`. properties: page_size: type: integer minimum: 1 maximum: 100 description: Rows per page, 1..100 (the wire default is 50, which is what the Sales Navigator web client itself pages with). cursor: type: - string - 'null' description: Pass paging.next_page_cursor back verbatim. Omitted or null starts at the top of the feed. UnfollowLinkedinMemberResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: activity_log: type: object properties: {} description: Full dispatch row (linkedin-account-activity-log) per §4.12a. unfollowed: type: boolean description: 'The wire field, mirrored. Always true in a 200, and never the proof on its own: the backend returns 200 only when the terminal following_state confirmed the direction.' following_state: type: string description: The follow button state AFTER the action, read off the wire. Always Follow in a 200, meaning the button reverted to its pre-follow label. message: type: - string - 'null' description: LinkedIn's own toast, when it sent one. is_retryable: type: boolean description: LinkedIn's own retry hint, passed through untouched. required: - activity_log - unfollowed - following_state - message - is_retryable 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 EndorseLinkedinAccountSkillByIdRequest: type: object description: Request body of `endorse_linkedin_account_skill_by_id`. properties: target: type: object properties: ln_id: type: string description: LinkedIn member id. sn_id: type: string description: Sales Navigator member id. nickname: type: string description: Public profile slug. description: Target person; provide at least one of ln_id / sn_id / nickname. skill_id: type: string minLength: 1 maxLength: 64 description: The skill id from a person-skills read (a numeric string on every proven id; LinkedIn owns the namespace). required: - target - skill_id 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 SetLinkedinAccountMyPositionResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: activity_log: type: object properties: {} description: 'The write''s dispatch row: add_my_position, update_my_position or delete_my_position (an edit or a delete reads the form first, on its own row).' action: type: string description: 'added, updated or deleted: the branch the body picked.' position_id: type: - string - 'null' description: 'The position''s numeric id: yours on an edit or a delete, the new one on an add (null when LinkedIn named none; read the experience list then).' position: type: - object - 'null' properties: {} description: 'On an edit or a delete: the position''s form as read BEFORE the change (every field, the dropdown tables, other_current_positions). Null on an add.' ok: type: boolean description: 'LinkedIn took the save: 2xx, no errors, no error toast.' message: type: - string - 'null' description: The toast LinkedIn showed, when it showed one. position_id_source: type: - string - 'null' description: 'On an add: where position_id came from, ''response'' (LinkedIn named it) or ''experience_diff'' (the one id the experience list gained); null otherwise.' required: - activity_log - action - position_id - position - ok - message - position_id_source 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 EndorseLinkedinAccountSkillRequest: type: object description: Request body of `endorse_linkedin_account_skill`. properties: target: type: object properties: ln_id: type: string description: LinkedIn member id. sn_id: type: string description: Sales Navigator member id. nickname: type: string description: Public profile slug. description: Target person; provide at least one of ln_id / sn_id / nickname. skills_count: type: integer minimum: 1 maximum: 10 description: How many skills to endorse (1..10, default 1). required: - target GetLinkedinAccountMyHiringProjectsRequest: type: object description: Request body of `get_linkedin_account_my_hiring_projects`. properties: keyword: type: string maxLength: 200 description: Project-name search. Omit for every project. page_size: type: integer minimum: 1 maximum: 100 description: Rows per page, 1..100; the wire default is 10. cursor: type: string maxLength: 64 description: Pass paging.next_page_cursor of the previous page back verbatim. Omit to start at the top. VisitLinkedinAccountProfileResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 GetLinkedinAccountMyLiteProfileResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 GetLinkedinAccountMyCreditsResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 SetLinkedinAccountMyServicesResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: activity_log: type: object properties: {} description: 'The write''s dispatch row: create_my_services, update_my_services or unpublish_my_services (the form read before it has its own row).' action: type: string description: created, updated, republished or unpublished. page: type: - object - 'null' properties: {} description: The page's form as read BEFORE the write; null when there was no page. page_url: type: - string - 'null' description: 'What the save answered: the page on a plain update, the marketplace inbox on a republish; null on a create and an unpublish.' page_id: type: - string - 'null' description: The page's vanity slug out of page_url, what an unpublish takes; null when the answer carried none. share_text: type: - string - 'null' description: The share-box text LinkedIn pre-fills after a save, when it offers one. ok: type: boolean message: type: - string - 'null' description: The toast of the onboarding create, when LinkedIn showed one. published: type: boolean description: The page was unpublished and this call put it back. required: - activity_log - action - page - page_url - page_id - share_text - ok - message - published 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 GetLinkedinAccountMySessionsResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 GetLinkedinAccountResponse: type: object properties: success: type: boolean enum: - true operation: type: string enum: - get item: type: object properties: sid: type: string team_sid: type: string antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 GetLinkedinAccountMyProfileViewsRequest: type: object description: Request body of `get_linkedin_account_my_profile_views`. properties: page_size: type: integer minimum: 1 maximum: 100 description: 'Rows per page, 1..100. Prefer omitting it: 10 is the wire default and the only page size with capture evidence behind it, and if LinkedIn caps the page server side a bigger ask returns a short page that stops the loop after one call.' cursor: type: - string - 'null' description: Pass paging.next_page_cursor back verbatim. Omitted or null starts at the top of the feed. GetLinkedinAccountMySalesNavNotificationsResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: status: type: string description: Plugin dispatch status for this read. sales_nav_notifications: type: object properties: elements: type: array items: type: object properties: notification_urn: type: string description: urn:li:notificationV2:(...). The row identity, and the only field always present. type: type: - string - 'null' description: 'Alert kind. Captured so far: ACCOUNT_SHARED_UPDATE, LEAD_SHARED_UPDATE, LEAD_ACCEPTED_INVITATION, LEAD_POSITION_CHANGE_NEW_COMPANY, LEAD_POSITION_CHANGE_SAME_COMPANY, LEAD_PROFILE_VIEW_SIGNAL, EMPLOYEE_AT_ACCOUNT_PROFILE_VIEW. OPEN vocabulary: never validate against that list, LinkedIn adds kinds.' headline: type: - string - 'null' description: 'Rendered headline, e.g. "Suggested lead: Jane shared a post".' body_text: type: - string - 'null' description: The shared post text. Shared-update alerts only. subline: type: - string - 'null' description: Secondary line, e.g. "Acme Corp, Head of Sales". published_at: type: - integer - 'null' description: UNIX epoch MILLISECONDS, passed through exactly as LinkedIn sent it. The ONLY machine-readable timestamp across all three self feeds, and the field to sort on, because the feed itself comes back ordered by relevance. read: type: - boolean - 'null' score: type: - number - 'null' description: LinkedIn's own relevance score for the alert. This is what the feed order is built on. action_target: type: - string - 'null' description: 'Main click-through: the post for a shared update, the sales profile page otherwise.' entity_url: type: - string - 'null' description: The lead or account sales page, present EVEN WHEN action_target points at a post. Use it when you want the person rather than the thing they did. associated_entity_urn: type: - string - 'null' description: urn:li:share:N for a shared update; a member urn or a position-change urn on the person-level alerts. subject_entity_urn: type: - string - 'null' description: urn:li:fs_salesProfile:(...) of the lead the alert is about. company_urn: type: - string - 'null' description: urn:li:fs_salesCompany:N, on account-level alerts. primary_cta: type: - object - 'null' properties: text: type: - string - 'null' type: type: - string - 'null' description: VIEW_UPDATE, MESSAGE, SAVE_LEAD and so on. Open vocabulary, same as the alert type. action_target: type: - string - 'null' description: The action LinkedIn suggests for this alert. Present or null; when present, every field inside it may still be null. lead: type: - object - 'null' properties: entity_urn: type: - string - 'null' first_name: type: - string - 'null' last_name: type: - string - 'null' full_name: type: - string - 'null' degree: type: - integer - 'null' description: Network distance as a NUMBER, so 1 is a 1st-degree connection. Not the rendered "1st" string the profile-views feed uses. saved: type: - boolean - 'null' description: Whether this lead is saved in Sales Navigator. image_url: type: - string - 'null' description: The lead this alert is about. Present or null; when present, every field inside it may still be null. account: type: - object - 'null' properties: entity_urn: type: - string - 'null' name: type: - string - 'null' saved: type: - boolean - 'null' description: Whether this company is saved as an account in Sales Navigator. image_url: type: - string - 'null' description: The company this alert is about, on account-level kinds. Same presence rule as lead. image_url: type: - string - 'null' description: The card image, largest rendition. required: - notification_urn description: The alerts on this page, ordered by LinkedIn relevance rather than by time. Can be SHORTER than page_size while the feed continues, because rows without an id are dropped. metadata: type: - object - 'null' properties: num_unseen: type: integer description: Unseen alerts across the WHOLE feed, not on this page. NOT a row total, and not a count of anything returned here. required: - num_unseen description: Absent whenever LinkedIn did not send a numeric unseen counter. paging: type: object properties: page_size: type: - integer - 'null' description: Rows on this page as requested (the wire default is 50). It is what we ASKED for, and elements can be shorter. page_cursor: type: - string - 'null' description: Absolute offset of the page just read, as a string. It is not an opaque token, but treat it as one. next_page_cursor: type: - string - 'null' description: 'Pass back as `cursor` to get the next page. ABSENT means the feed is over, and that is the ONLY end signal: there is deliberately no total and no has-more flag.' required: - page_size - page_cursor required: - elements - paging required: - status - sales_nav_notifications 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 GetLinkedinAccountMyServicesResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: status: type: string description: Plugin dispatch status for this read. page: type: - object - 'null' properties: page_id: type: string description: The page's NUMERIC id (the form's), not the vanity slug an unpublish takes. status: type: string description: ACTIVE (published) or UNPUBLISHED as LinkedIn answers it. description: type: string services_offered: type: array items: type: object properties: id: type: string name: type: string required: - id - name location_profile: type: boolean location_remote: type: boolean location_label: type: - string - 'null' open_messaging: type: boolean review_visibility: type: - boolean - 'null' description: 'null while the page is unpublished: the form drops the element.' pricing: type: object properties: kind: type: string currency: type: - string - 'null' amount: type: - number - 'null' required: - kind - currency - amount available_currencies: type: array items: type: string top_level_services: type: array items: type: object properties: id: type: string name: type: string required: - id - name required: - page_id - status - description - services_offered - location_profile - location_remote - location_label - open_messaging - review_visibility - pricing - available_currencies - top_level_services description: The form, or null when the account has no services page. required: - status - page 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 SearchLinkedinAccountsRequest: type: object description: Request body of `search_linkedin_accounts`. properties: filter: type: object properties: q: type: string description: Full-text LIKE over full_name + nickname + label, so it is the substring path for the operator tag too. Identity ids (ln_member_id, sn_id) are exact-match fields, not q targets. status: type: object properties: eq: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required ne: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required in: type: array items: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required nin: type: array items: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required additionalProperties: false description: 'Lifecycle state. active = usable; shared_out = lent to another team; subscription_required = plan lapsed. NOT a login-state axis: signed-out senders still match active, filter them by reading the included antidetect_browser per row.' sid: type: object properties: eq: type: string in: type: array items: type: string additionalProperties: false antidetect_browser_sid: type: object properties: eq: type: string in: type: array items: type: string additionalProperties: false account_share_sid: type: object properties: eq: type: string in: type: array items: type: string is_null: type: boolean additionalProperties: false description: is_null:false = the account is currently inside a share. 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_seat_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: is_null:false = the Recruiter seat number is stamped, so the recruiter sync and thread tools can run on this account. 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: Exact match on the Recruiter contract number the stamped seat belongs to. recruiter_session_expires_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false description: lt: = seat holders whose Recruiter session clock has run out (recruiter_status eq:signed_out is the confirmed verdict); is_null:false = the clock was read. nickname: type: object properties: eq: type: string in: type: array items: type: string is_null: type: boolean additionalProperties: false full_name: type: object properties: eq: type: string in: type: array items: type: string is_null: type: boolean additionalProperties: false avatar_url: type: object properties: is_null: type: boolean additionalProperties: false description: Display-completeness predicate only (is_null); the URL value is not a filter axis. label: 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 owning team's private tag on the account (pod, campaign, owner). eq / in for whole-tag matches, is_null:true for the untagged senders and is_null:false for the tagged ones; for a substring use q. has_premium: type: object properties: eq: type: boolean additionalProperties: false has_sn: type: object properties: eq: type: boolean additionalProperties: false recruiter_status: type: object properties: eq: type: string enum: - active - signed_out ne: type: string enum: - active - signed_out in: type: array items: type: string enum: - active - signed_out nin: type: array items: type: string enum: - active - signed_out is_null: type: boolean additionalProperties: false description: null = no Recruiter seat. eq:signed_out = seat holders who have to sign in to Recruiter again (their recruiter sync and Recruiter tools wait); eq:active = seats whose session answers. smart_limits_enabled: type: object properties: eq: type: boolean additionalProperties: false description: The account-wide smart-limit switch. eq:false lists every hand-managed sender (caps typed by hand, no warmup protection). inmail_credits: 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 Sales Navigator seat grant. is_null:true = never read or last parse failed. premium_inmail_credits: 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 Premium plan pool (seatless Premium accounts). gte:1 = senders with Premium InMails left; is_null:true = never read. recruiter_inmail_credits: 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 Recruiter contract pool (accounts with an active Recruiter seat). eq:0 = seats that cannot open a new Recruiter thread until the monthly refresh; is_null:true = never read. last_premium_check_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false last_connections_sync_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false last_conversations_sync_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false last_sales_navigator_conversations_sync_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false last_recruiter_conversations_sync_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false last_connection_requests_sync_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false last_connection_invitations_sync_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false last_snapshot_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false initial_sync_completed_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false initial_sync_held_at: type: object properties: gte: type: string lte: type: string gt: type: string lt: type: string is_null: type: boolean additionalProperties: false description: is_null:false = onboardings that parked on the daily budget part-way initial_sync_hold_reason: 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: Onboarding gate; is_null:true = still onboarding, is_null:false = ready. last_heartbeat_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 description: 'Default scope is { is_null: true } (live accounts).' include: type: array items: type: string enum: - antidetect_browser - linkedin_account_smart_limits - linkedin_account_snapshot - linkedin_account_quota_hits - linkedin_account_block_log - linkedin_account_block_log_counts - linkedin_connections_counts - linkedin_connection_requests_counts - linkedin_connection_invitations_counts - linkedin_conversations_counts - linkedin_followers_counts description: 'antidetect_browser carries the sender LOGIN and runtime state (browser status login_issue means signed out of LinkedIn, restricted means signed out and the public profile is gone, a LinkedIn restriction; also error_reason, logout_count, last_logout_at). The account item alone cannot answer "is this sender signed in": its status field is lifecycle. Health data: linkedin_account_smart_limits (budgets and holds), linkedin_account_snapshot (latest warmup score), linkedin_account_quota_hits / linkedin_account_block_log (last 50 incident rows each), *_counts (child tallies).' description: Relations to eager-load (see entity Includes). sort: type: object properties: field: type: string enum: - created_at - updated_at - last_premium_check_at - last_snapshot_at - last_heartbeat_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - recruiter_session_expires_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - initial_sync_completed_at - inmail_credits - full_name direction: type: string enum: - asc - desc description: Default desc. required: - field page_size: type: integer minimum: 0 maximum: 500 description: 0..500, 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. GetLinkedinAccountMyFullProfileResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 EditLinkedinAccountMyProfileResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - created_at - updated_at - deleted_at result: type: object properties: activity_log: type: object properties: {} description: 'The dispatch row (linkedin-account-activity-log) of the call''s FIRST save: the intro card when it was edited (action_type edit_my_profile), else the first section''s.' updated_fields: type: array items: type: string description: 'The fields the caller asked to change, sections included (about, top_skills, photo, background). NOT a confirmation: LinkedIn answers a save with a bare ok and does not echo the saved profile.' sections: type: object additionalProperties: type: object properties: activity_log: type: object properties: {} description: 'The section''s own dispatch row: edit_my_profile, update_my_about, update_my_photo or update_my_background.' message: type: - string - 'null' description: The toast LinkedIn showed on the save, when it showed one. previous_about: type: - string - 'null' description: 'About only: the text before the save.' previous_top_skills: type: array items: type: object properties: id: type: string name: type: string required: - id - name description: 'About only: the top skills before the save, with the ProfileSkill ids a later call can pass.' profile_skills_suggested: type: array items: type: string description: 'About only: profile skills that are not top skills yet, by name, as the form suggests them.' original_asset_urn: type: - string - 'null' description: 'photo / background only: the digitalmediaAsset urn of the full-size original.' display_asset_urn: type: - string - 'null' description: 'photo / background only: the digitalmediaAsset urn of the displayed crop.' required: - activity_log description: 'One entry per section saved, in save order: intro_card, about, photo, background.' required: - activity_log - updated_fields - sections 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 SetLinkedinAccountMyPositionRequest: type: object description: Request body of `set_linkedin_account_my_position`. properties: position_id: type: string pattern: ^\d+$ description: The position to edit or remove. Omit to add a new one. delete: type: boolean description: 'With position_id: remove the position instead of editing it.' title: type: string minLength: 1 maxLength: 100 description: Required on an add. LinkedIn's cap is 100. company_name: type: string minLength: 1 maxLength: 100 description: Required on an add. Free text unless company_id names a LinkedIn company. company_id: type: string pattern: ^\d+$ description: LinkedIn's numeric company id (lookup_linkedin_param_id with type company gives it). employment_type_id: type: string pattern: ^\d+$ description: 'The form''s employment type code: 12 Full-time, 11 Part-time, 3 Self-employed, 20 Freelance, 2 Contract, 18 Internship, 19 Apprenticeship, 21 Seasonal.' start_date: type: object properties: month: type: integer minimum: 1 maximum: 12 year: type: integer minimum: 1900 maximum: 2100 required: - month - year description: Required on an add. end_date: type: - object - 'null' properties: month: type: integer minimum: 1 maximum: 12 year: type: integer minimum: 1900 maximum: 2100 required: - month - year description: Required on an add unless is_current is true. is_current: type: boolean description: 'The position is ongoing: no end date.' end_current_position_ids: type: array items: type: string pattern: ^\d+$ description: Other current positions to end when this one becomes current. location: type: - string - 'null' maxLength: 200 description: The location as displayed, e.g. Buenos Aires, Argentina. geo_location_id: type: string pattern: ^\d+$ description: LinkedIn's numeric geo id for the location. location_type: type: string enum: - on_site - remote - hybrid description: type: - string - 'null' maxLength: 2000 description: LinkedIn's cap is 2000. skills: type: array items: type: string minLength: 1 maxLength: 100 description: Skill names, or ProfileSkill: ids the position read reports. allow_profile_edit_broadcasts: type: boolean description: Tell the network about the change (LinkedIn's "notify network" toggle). Default false. EndorseLinkedinAccountSkillResponse: 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 antidetect_browser_sid: type: string status: type: string enum: - new - initial_syncing - active - sync_failed - shared_out - subscription_required description: 'Platform lifecycle (onboarding phases and hold states), NOT health and NOT login state: a sender signed out of LinkedIn still reads "active" here. Login state lives on the bound browser, request include antidetect_browser and read its status (login_issue means signed out, restricted means signed out AND the public profile is gone from LinkedIn, so a re-login alone will not fix it).' account_share_sid: type: - string - 'null' share_role: type: - string - 'null' enum: - owner - holder - giver - receiver ln_id: type: - string - 'null' ln_member_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' recruiter_seat_id: type: - string - 'null' description: 'The account''s own LinkedIn Recruiter seat number (the talent ts_seat), stamped by the premium check when the recruiter probe says yes and cleared when it says no. Every recruiter sync / thread read / reply dispatches with it; null with recruiter_status set means the seat is not stamped yet: run check_linkedin_account_premium_subscription with checks: [''recruiter''].' recruiter_contract_id: type: - string - 'null' description: 'The Recruiter contract (talent ts_contract number) the stamped seat belongs to, from the same seat read. A seat only means something inside its contract: hiring-project urns embed it, and a member on several contracts holds a different seat on each.' recruiter_session_expires_at: type: - string - 'null' description: 'When the Recruiter (enterprise) session of the bound browser profile runs out (ISO 8601): the expiry of LinkedIn''s li_a cookie, read by the premium check from the account''s running browser (the plugin''s own cookie jar; the antidetect vendor''s cookie store is consulted only for a platform-owned profile whose browser did not answer), the clock, never the value. LinkedIn issues that session for 30 days when the seat holder enters the LinkedIn password on the Recruiter sign-in page. Past this clock the account''s recruiter_status turns signed_out (the session sweep confirms it in the browser''s cookie jar within 15 minutes) and every recruiter tool answers 409 recruiter_reauth_required, whose context.account_url is the account''s page where the seat holder signs in again through the cloud browser. Null = no clock (not read, or the session cookie was not seen, which is not a verdict; recruiter_status is the verdict).' full_name: type: - string - 'null' avatar_url: type: - string - 'null' label: type: - string - 'null' has_premium: type: boolean has_sn: type: boolean recruiter_status: type: - string - 'null' enum: - active - signed_out description: 'The account''s LinkedIn Recruiter status. null = no Recruiter seat (the premium check''s recruiter probe said no, or never ran). active = the seat''s Recruiter (enterprise) session answers talent calls. signed_out = LinkedIn Recruiter asks the seat holder for the LinkedIn password again (about every 30 days): every recruiter tool answers 409 recruiter_reauth_required and the recruiter sync waits until the seat holder signs in through the cloud browser from the account''s page (the 409''s context.account_url); the status returns to active by itself once they have. Filter on it to find seats that need their holder.' smart_limits_enabled: type: boolean inmail_credits: type: - number - 'null' description: The Sales Navigator seat's InMail balance (the LSS_INMAIL grant), read only while the account holds a seat and cleared when the seat goes. Null = never read, the last read failed, or the seat was just lost; not zero. premium_inmail_credits: type: - number - 'null' description: The Premium plan's own InMail balance (Premium Career / Business), read off LinkedIn's Premium page for a Premium account WITHOUT a Sales Navigator seat (a seat holder's linkedin.com InMail is the seat's grant above) and cleared when the plan goes. Null = never read or the last read could not be parsed; not zero. recruiter_inmail_credits: type: - number - 'null' description: The Recruiter contract's own InMail balance (what Recruiter's Usage Overview shows as InMail credits), read off the talent API for an account with an ACTIVE Recruiter seat and cleared when the seat goes; a signed-out seat keeps its last number. LinkedIn grants Recruiter InMails per contract and moves nothing between its products, so this is the pool send_linkedin_recruiter_message spends, not the two above. Null = never read or the last read could not be parsed; not zero. last_premium_check_at: type: - string - 'null' last_connections_sync_at: type: - string - 'null' last_conversations_sync_at: type: - string - 'null' last_sales_navigator_conversations_sync_at: type: - string - 'null' last_recruiter_conversations_sync_at: type: - string - 'null' last_connection_requests_sync_at: type: - string - 'null' last_connection_invitations_sync_at: type: - string - 'null' last_followers_sync_at: type: - string - 'null' last_snapshot_at: type: - string - 'null' initial_sync_completed_at: type: - string - 'null' initial_sync_held_at: type: - string - 'null' description: When THIS onboarding first parked on a smart-limit budget (the daily self_account_sync allowance ran out before the initial set was done); null = never held. Kept after the latch, cleared by reset-sync. initial_sync_hold_reason: type: - string - 'null' description: 'The run''s park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit.' last_heartbeat_at: type: - string - 'null' sync_config: type: - object - 'null' properties: entries: type: object properties: connections: type: object properties: interval_minutes: type: number required: - interval_minutes conversations: type: object properties: interval_minutes: type: number required: - interval_minutes sales_navigator_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes recruiter_conversations: type: object properties: interval_minutes: type: number required: - interval_minutes connection_requests: type: object properties: interval_minutes: type: number required: - interval_minutes connection_invitations: type: object properties: interval_minutes: type: number required: - interval_minutes premium_check: type: object properties: interval_minutes: type: number required: - interval_minutes snapshot_check: type: object properties: interval_minutes: type: number required: - interval_minutes description: Per-track sync-interval overrides, keyed by sync track. timezone: type: string description: IANA timezone the window is evaluated in. window: type: array items: type: object properties: day_of_week: type: integer minimum: 1 maximum: 7 start_minute: type: integer minimum: 0 maximum: 1439 end_minute: type: integer minimum: 1 maximum: 1440 required: - day_of_week - start_minute - end_minute description: Weekly sync-activity window blocks; empty = always open. webhook_config: type: - object - 'null' properties: connections: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_requests: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since connection_invitations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since sales_navigator_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since recruiter_conversations: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since messages: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since followers: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since snapshot: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since strike_log: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since limits: type: object properties: enabled: type: boolean since: type: - string - 'null' required: - enabled - since created_by: type: object properties: actor_type: type: string enum: - user - support - api_key - system - agent actor_sid: type: - string - 'null' team_sid: type: string permissions: type: object additionalProperties: {} request_sid: type: - string - 'null' reason: type: - string - 'null' required: - actor_type - actor_sid - team_sid - permissions - reason created_at: type: string updated_at: type: string deleted_at: type: - string - 'null' required: - sid - team_sid - antidetect_browser_sid - status - account_share_sid - share_role - ln_id - ln_member_id - sn_id - nickname - recruiter_seat_id - recruiter_contract_id - recruiter_session_expires_at - full_name - avatar_url - label - has_premium - has_sn - recruiter_status - smart_limits_enabled - inmail_credits - premium_inmail_credits - recruiter_inmail_credits - last_premium_check_at - last_connections_sync_at - last_conversations_sync_at - last_sales_navigator_conversations_sync_at - last_recruiter_conversations_sync_at - last_connection_requests_sync_at - last_connection_invitations_sync_at - last_followers_sync_at - last_snapshot_at - initial_sync_completed_at - initial_sync_held_at - initial_sync_hold_reason - last_heartbeat_at - sync_config - webhook_config - created_by - 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 InviteLinkedinMembersToEventRequest: type: object description: Request body of `invite_linkedin_members_to_event`. properties: event_ln_id: type: string pattern: ^[0-9]{1,32}$ description: 'The event''s numeric id: the digits of urn:li:fsd_professionalEvent:, the event_ln_id of a search_linkedin_events row, the number in https://www.linkedin.com/events// .' targets: type: array items: type: object properties: ln_id: type: - string - 'null' maxLength: 128 description: 'LinkedIn member id (ACoAA...), sent as is in the batch. The address to prefer: it costs no lookup.' nickname: type: - string - 'null' maxLength: 100 description: Public profile slug, the vanity name in the profile URL. A nickname-ONLY target costs one profile read (self_account_sync) before the batch; next to ln_id it is ignored, the id is the address. description: One person to invite; ln_id or nickname (a Sales Navigator id is not an address for an event invitation). minItems: 1 maxItems: 25 description: 1 to 25 people, one batch. A member named twice is sent once. required: - event_ln_id - targets 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