# GENERATED FILE. Do not edit.
#
# Projected from the Zod MCP tool registry in product/mcp/gtm.mcp.
# Regenerate:  cd product/mcp/gtm.mcp && pnpm openapi:public
# Verify:      cd product/mcp/gtm.mcp && pnpm openapi:public:check
openapi: 3.0.3
info:
  title: "GTM API public contract: gtm.service.linkedin"
  description: |-
    Connected LinkedIn accounts and everything driven through them: account health and smart limits, conversations and messages, the connection graph, outbound posting, scraping, profile and company enrichment, and the antidetect browsers that execute it all.

    GENERATED. This document is projected from the Zod MCP tool registry in `product/mcp/gtm.mcp` (one tool per public endpoint, 1:1). Do not edit it by hand; edit the tool definition and regenerate with `pnpm openapi:public`.

    Surface: the public `/api` contract of `gtm.service.linkedin`, 191 operations. This is the only OpenAPI document the platform publishes. Internal (`/internal`) and health endpoints are deliberately absent: they are not part of any contract, they can change without notice, and the service source is their only description.

    Conventions:
    - Auth is a bearer JWT, optionally narrowed by the `Team-SID` header.
    - Every success body is an MCP envelope: `success: true` plus one typed `operation` shape (`search`, `get`, `create`, `update`, `delete`, `metrics`, `group_by`, `action`), and a `meta` block with `trace_id` for support.
    - Every failure is the same `McpError` envelope with a code from a fixed 16-code taxonomy, so a client maps errors once.
    - Lists page with `page_size` (0 to 500, default 50) plus an opaque forward `cursor`; `page_size: 0` returns counts only.
    - On `GET` and `DELETE`, object-valued query parameters (`filter`, `sort`) travel as JSON text and array-valued ones repeat as `name[]=value`.
    - The MCP-only `_meta` field (usage analytics) never reaches the backend and is not part of this contract.
  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
servers:
  - url: https://app.gtm-api.com/linkedin/v4
    description: Production, through the app.gtm-api.com gateway
security:
  - BearerJwt: []
    TeamSid: []
tags:
  - name: antidetect_browser_logs
    description: Registry package `mcp.linkedin/antidetect_browser_logs`, served on MCP mount `linkedin.browsers`.
  - name: antidetect_browser_proxies
    description: Registry package `mcp.linkedin/antidetect_browser_proxies`, served on MCP mount `linkedin.browsers`.
  - name: antidetect_browsers
    description: Registry package `mcp.linkedin/antidetect_browsers`, served on MCP mount `linkedin.browsers`.
  - name: cloud_browser_sessions
    description: Registry package `mcp.linkedin/cloud_browser_sessions`, served on MCP mount `linkedin.browsers`.
  - name: cloud_browsers
    description: Registry package `mcp.linkedin/cloud_browsers`, served on MCP mount `linkedin.browsers`.
  - name: data_requests
    description: Registry package `mcp.linkedin/data_requests`, served on MCP mount `linkedin.data`.
  - name: linkedin_account_activity_log
    description: Registry package `mcp.linkedin/linkedin_account_activity_log`, served on MCP mount `linkedin.account-monitor`.
  - name: linkedin_account_block_log
    description: Registry package `mcp.linkedin/linkedin_account_block_log`, served on MCP mount `linkedin.account-monitor`.
  - name: linkedin_account_quota_hits
    description: Registry package `mcp.linkedin/linkedin_account_quota_hits`, served on MCP mount `linkedin.account-monitor`.
  - name: linkedin_account_smart_limits
    description: Registry package `mcp.linkedin/linkedin_account_smart_limits`, served on MCP mount `linkedin.accounts`.
  - name: linkedin_account_snapshots
    description: Registry package `mcp.linkedin/linkedin_account_snapshots`, served on MCP mount `linkedin.account-monitor`.
  - name: linkedin_account_sync_runs
    description: Registry package `mcp.linkedin/linkedin_account_sync_runs`, served on MCP mount `linkedin.account-monitor`.
  - name: linkedin_accounts
    description: Registry package `mcp.linkedin/linkedin_accounts`, served on MCP mount `linkedin.accounts`.
  - name: linkedin_auto_scrape_results
    description: Registry package `mcp.linkedin/linkedin_auto_scrape_results`, served on MCP mount `linkedin.auto-scrapes`.
  - name: linkedin_auto_scrape_runs
    description: Registry package `mcp.linkedin/linkedin_auto_scrape_runs`, served on MCP mount `linkedin.auto-scrapes`.
  - name: linkedin_auto_scrapes
    description: Registry package `mcp.linkedin/linkedin_auto_scrapes`, served on MCP mount `linkedin.auto-scrapes`.
  - name: linkedin_benchmarks
    description: Registry package `mcp.linkedin/linkedin_benchmarks`, served on MCP mount `linkedin.account-monitor`.
  - name: linkedin_connection_invitations
    description: Registry package `mcp.linkedin/linkedin_connection_invitations`, served on MCP mount `linkedin.network`.
  - name: linkedin_connection_requests
    description: Registry package `mcp.linkedin/linkedin_connection_requests`, served on MCP mount `linkedin.network`.
  - name: linkedin_connections
    description: Registry package `mcp.linkedin/linkedin_connections`, served on MCP mount `linkedin.network`.
  - name: linkedin_conversations
    description: Registry package `mcp.linkedin/linkedin_conversations`, served on MCP mount `linkedin.messaging`.
  - name: linkedin_custom_requests
    description: Registry package `mcp.linkedin/linkedin_custom_requests`, served on MCP mount `linkedin.platform`.
  - name: linkedin_enrichment
    description: Registry package `mcp.linkedin/linkedin_enrichment`, served on MCP mount `linkedin.enrichment`.
  - name: linkedin_followers
    description: Registry package `mcp.linkedin/linkedin_followers`, served on MCP mount `linkedin.network`.
  - name: linkedin_messages
    description: Registry package `mcp.linkedin/linkedin_messages`, served on MCP mount `linkedin.messaging`.
  - name: linkedin_posting
    description: Registry package `mcp.linkedin/linkedin_posting`, served on MCP mount `linkedin.content`.
  - name: linkedin_scraping
    description: Registry package `mcp.linkedin/linkedin_scraping`, served on MCP mount `linkedin.scraping`.
paths:
  /api/antidetect-browser-logs/search:
    post:
      operationId: search_antidetect_browser_logs
      summary: Search antidetect browser logs
      description: |-
        List antidetect-browser runtime log rows for the team with filters, sorting and cursor pagination. This is the operational trail behind a browser's status (start/stop, runtime errors, proxy issues, logouts). Returns a counts block of predicate tallies; include[] can eager-load the antidetect_browser. Scope to one browser with antidetect_browser_sid.

        Contract:
        - MCP tool `search_antidetect_browser_logs`, registry package `mcp.linkedin/antidetect_browser_logs`, mount `linkedin.browsers`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - antidetect_browser_logs
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchAntidetectBrowserLogsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchAntidetectBrowserLogsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_antidetect_browser_logs
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browser_logs
      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
  /api/antidetect-browser-proxies/check-proxy-connectivity:
    post:
      operationId: check_antidetect_browser_proxy_connectivity
      summary: Check proxy connectivity
      description: |-
        Probe connectivity + latency for one or many proxies. Target EXACTLY ONE of sid (ab_px_) or filter; filter mode checks up to an inline cap and reports total_matched (truncated:true when the cap was hit). Read-only probe, no row mutation.

        Contract:
        - MCP tool `check_antidetect_browser_proxy_connectivity`, registry package `mcp.linkedin/antidetect_browser_proxies`, mount `linkedin.browsers`.
        - Operation `action`, response envelope `action`.
        - Flags: mass action: this verb's own request accepts a filter or targets[] set, which the owning service drains.
      tags:
        - antidetect_browser_proxies
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CheckAntidetectBrowserProxyConnectivityRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CheckAntidetectBrowserProxyConnectivityResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: check_antidetect_browser_proxy_connectivity
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browser_proxies
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: true
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/antidetect-browser-proxies/check-proxy-location:
    post:
      operationId: check_antidetect_browser_proxy_location
      summary: Check proxy location
      description: |-
        Run a multi-vendor geo + fraud check on one or many proxies. Target EXACTLY ONE of sid (ab_px_) or filter; filter mode checks up to an inline cap and reports total_matched (truncated:true when the cap was hit). A verdict moves the row: an exit country that disagrees with country_code flips it to country_mismatch, a fraud score over the threshold to fraud_flagged (each emits its event). Rows the vendors could not settle are listed in inconclusive with a reason (no_ip_port / exit_unreachable / no_corroboration) and left untouched, so total_checked counts only rows that got a verdict.

        Contract:
        - MCP tool `check_antidetect_browser_proxy_location`, registry package `mcp.linkedin/antidetect_browser_proxies`, mount `linkedin.browsers`.
        - Operation `action`, response envelope `action`.
        - Flags: mass action: this verb's own request accepts a filter or targets[] set, which the owning service drains.
      tags:
        - antidetect_browser_proxies
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CheckAntidetectBrowserProxyLocationRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CheckAntidetectBrowserProxyLocationResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: check_antidetect_browser_proxy_location
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browser_proxies
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: true
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/antidetect-browser-proxies/search:
    post:
      operationId: search_antidetect_browser_proxies
      summary: Search antidetect browser proxies
      description: |-
        List antidetect browser proxies (platform-wide pool) with filters, sorting and cursor pagination. Live proxies by default (filter {"deleted_at": {"is_null": true}}). Credentials (ip / port / username / password) are masked to null on this public read surface.

        Contract:
        - MCP tool `search_antidetect_browser_proxies`, registry package `mcp.linkedin/antidetect_browser_proxies`, mount `linkedin.browsers`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - antidetect_browser_proxies
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchAntidetectBrowserProxiesRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchAntidetectBrowserProxiesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_antidetect_browser_proxies
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browser_proxies
      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
  /api/antidetect-browsers:
    post:
      operationId: create_antidetect_browser
      summary: Create antidetect browser
      description: |-
        Provision ONE antidetect browser for the team. The main flow mints a fresh vendor (GoLogin) profile and pushes the resolved proxy into it, so supply exactly one proxy source: proxy_country_code is the default, custom_proxy_config routes that minted profile through a proxy the caller supplies (probed first, 422 custom_proxy_unreachable_* when dead, never with proxy_5g). Pick the branch yourself, never ask an end user for a sid. Bind an existing vendor_profile_id for the BYO-PROFILE path instead, with no proxy source: that profile carries its own. If no LinkedIn account signs in on it for 30 days, it is deleted and its seat freed. DANGEROUS: creates real vendor + proxy infrastructure. For SEVERAL browsers under ONE approval, do not call this per browser: author a mass action on /mcp/orchestration/mass-actions with scope {kind:"generate", count:N} and a plan of antidetect-browsers.create (+ antidetect-browsers.generate-cloud-browser-access-key), then read the connect links off each row when it finishes.

        Contract:
        - MCP tool `create_antidetect_browser`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - Operation `create`, response envelope `create`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API.
      tags:
        - antidetect_browsers
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateAntidetectBrowserRequest"
      responses:
        "200":
          description: "`create` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreateAntidetectBrowserResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: create_antidetect_browser
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      x-gtm-operation: create
      x-gtm-envelope: create
      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
  /api/antidetect-browsers/check-proxy:
    post:
      operationId: check_antidetect_browser_proxy
      summary: Check custom proxy
      description: |-
        Probe a customer-supplied proxy tuple and report the exit it reaches: country, IP and round-trip latency. Nothing is written: call it for a proxy you are about to pass as custom_proxy_config, on create or on update-proxy. A proxy that refuses is a SUCCESSFUL call with ok:false plus error_kind (timeout | tls | network | http_error); only a malformed tuple is a 422. The write paths run the same probe themselves, so this verb is for showing the operator what a tuple resolves to BEFORE committing to it. Checking an edit of a browser that already rides its own proxy? Pass its sid and leave the password out: the stored one is probed, as update-proxy keeps it, for the same ip and username only.

        Contract:
        - MCP tool `check_antidetect_browser_proxy`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - Operation `action`, response envelope `action`.
        - Flags: read only.
      tags:
        - antidetect_browsers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CheckAntidetectBrowserProxyRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CheckAntidetectBrowserProxyResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: check_antidetect_browser_proxy
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      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
  /api/antidetect-browsers/generate-cloud-browser-access-key:
    post:
      operationId: generate_cloud_browser_access_key
      summary: Generate cloud-browser access key
      description: |-
        Mint a cloud-browser access key (smart-link) on a browser. Returns the whole minted entry in result.access_key, whose `key` field is the raw cb_ak_ token (shown once), AND result.public_connect_url, the ready-to-share link to hand to whoever opens it (no platform account needed on their side). Pass result.access_key.key, never result.access_key, to revoke_cloud_browser_access_key. `purpose` decides what the page behind the link does: `relogin` walks them through signing the LinkedIn session back in and re-binds the browser once they confirm, `share` just hands them the browser to drive. Optional ttl_hours / max_connects / allowed_ips / allowed_countries scope the key; send_to_email also mails the link to whoever holds the LinkedIn password (a fixed mail, no text to supply). DANGEROUS: both the key and the link are bearer secrets granting remote browser access.

        Contract:
        - MCP tool `generate_cloud_browser_access_key`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - 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.
      tags:
        - antidetect_browsers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GenerateCloudBrowserAccessKeyRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GenerateCloudBrowserAccessKeyResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: generate_cloud_browser_access_key
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      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
  /api/antidetect-browsers/proxy-countries:
    post:
      operationId: list_antidetect_browser_proxy_countries
      summary: List proxy countries
      description: |-
        Proxy countries a new browser can be given right now, with how many active proxies back each. Empty list = the pool is dry; create refuses a country with no stock (422 proxy_pool_empty).

        Contract:
        - MCP tool `list_antidetect_browser_proxy_countries`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - Operation `action`, response envelope `action`.
        - Flags: read only.
      tags:
        - antidetect_browsers
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ListAntidetectBrowserProxyCountriesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: list_antidetect_browser_proxy_countries
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      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
  /api/antidetect-browsers/replace-proxy:
    post:
      operationId: replace_antidetect_browser_proxy
      summary: Rotate antidetect browser proxy
      description: |-
        Rotate an antidetect browser onto another MANAGED proxy of the SAME country. Geo-binding is preserved, so this is the safe way to drop a flagged IP. Omit antidetect_browser_proxy_sid to take the least-loaded active proxy of that country, or pin one (a pin from another country is refused, 422 proxy_country_mismatch). Platform-owned browsers only, 422 managed_proxy_forbidden_for_owner; a platform row that never got a proxy is 422 proxy_not_managed; a country with no other active proxy is 422 proxy_replacement_unavailable. A running browser is stopped and started again so the new IP takes effect; result.restarted reports whether it came back.

        Contract:
        - MCP tool `replace_antidetect_browser_proxy`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - 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.
      tags:
        - antidetect_browsers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReplaceAntidetectBrowserProxyRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReplaceAntidetectBrowserProxyResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: replace_antidetect_browser_proxy
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      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
  /api/antidetect-browsers/revoke-cloud-browser-access-key:
    post:
      operationId: revoke_cloud_browser_access_key
      summary: Revoke cloud-browser access key
      description: |-
        Revoke a cloud-browser access key on a browser. Pass the cb_ak_ key to revoke one; omit key to revoke EVERY key on the row. Only removes the key; live cloud-browser sessions are not force-disconnected. DANGEROUS: cuts off remote access.

        Contract:
        - MCP tool `revoke_cloud_browser_access_key`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - 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.
      tags:
        - antidetect_browsers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RevokeCloudBrowserAccessKeyRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RevokeCloudBrowserAccessKeyResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: revoke_cloud_browser_access_key
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      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
  /api/antidetect-browsers/run:
    post:
      operationId: run_antidetect_browser
      summary: Run antidetect browser
      description: |-
        Start an antidetect browser session by sid. Two-phase: transitions to queued_to_start, dispatches to an automation server, then settles into initializing / running / start_issue. Identify the browser by its ab_br_ sid in the body.

        Contract:
        - MCP tool `run_antidetect_browser`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - 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.
      tags:
        - antidetect_browsers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RunAntidetectBrowserRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RunAntidetectBrowserResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: run_antidetect_browser
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      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
  /api/antidetect-browsers/search:
    post:
      operationId: search_antidetect_browsers
      summary: Search antidetect browsers
      description: |-
        List antidetect browsers on the team with filters (name lookup via the vendor_name filter, eq/in), sorting and cursor pagination. Live browsers by default (filter {"deleted_at": {"is_null": true}}). Returns a counts block of predicate tallies; include[] can eager-load linkedin_account, antidetect_browser_proxy and antidetect_browser_logs. Use this to find a browser sid before run / stop / delete.

        Contract:
        - MCP tool `search_antidetect_browsers`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - antidetect_browsers
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchAntidetectBrowsersRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchAntidetectBrowsersResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_antidetect_browsers
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      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
  /api/antidetect-browsers/seat-usage:
    post:
      operationId: get_antidetect_browser_seat_usage
      summary: Get seat usage
      description: |-
        Seats and 5G proxy slots the workspace occupies: every live browser row, whatever its status and whether a LinkedIn account is bound. Team-wide; compare against limits.accounts and limits.proxy_5g.

        Contract:
        - MCP tool `get_antidetect_browser_seat_usage`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - Operation `action`, response envelope `action`.
        - Flags: read only.
      tags:
        - antidetect_browsers
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetAntidetectBrowserSeatUsageResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_antidetect_browser_seat_usage
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      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
  /api/antidetect-browsers/stop:
    post:
      operationId: stop_antidetect_browser
      summary: Stop antidetect browser
      description: |-
        Stop an antidetect browser session by sid. Default is graceful (queued_to_stop → stopped on the node teardown confirmation); now:true commits stopped immediately and dispatches a best-effort teardown. Identify the browser by its ab_br_ sid in the body.

        Contract:
        - MCP tool `stop_antidetect_browser`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - 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.
      tags:
        - antidetect_browsers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/StopAntidetectBrowserRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/StopAntidetectBrowserResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: stop_antidetect_browser
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      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
  /api/antidetect-browsers/update-proxy:
    post:
      operationId: update_antidetect_browser_proxy
      summary: Change antidetect browser proxy
      description: |-
        Change the proxy of an existing antidetect browser, country included. Supply EXACTLY ONE source: antidetect_browser_proxy_sid, proxy_country_code or custom_proxy_config. EVERY arm needs browser_owner=platform: a profile bound by id keeps its proxy in the vendor (422 managed_proxy_forbidden_for_owner / 422 custom_proxy_forbidden_for_owner). custom_proxy_config is probed first (422 custom_proxy_unreachable_* changes nothing), takes the exit country measured there, and RELEASES any armed 5G slot. Zero sources 422 proxy_assignment_missing, more than one 422 proxy_assignment_conflict, empty pool 422 proxy_pool_empty, 5G on a BYO proxy 422 proxy_5g_requires_managed_proxy. proxy_5g alone is a valid body: it moves the add-on binding only. DANGEROUS twice over: a location flip mid-campaign can trip a LinkedIn risk check, and a running browser is restarted, since a live session keeps the old proxy until it respawns. Read result.restarted. To rotate the IP in place, use replace_antidetect_browser_proxy.

        Contract:
        - MCP tool `update_antidetect_browser_proxy`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - 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.
      tags:
        - antidetect_browsers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateAntidetectBrowserProxyRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UpdateAntidetectBrowserProxyResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: update_antidetect_browser_proxy
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      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: complex
  /api/antidetect-browsers/{sid}:
    get:
      operationId: get_antidetect_browser
      summary: Get antidetect browser
      description: |-
        Fetch a single antidetect browser by sid, with optional eager-loaded relations.

        Contract:
        - MCP tool `get_antidetect_browser`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - Operation `get`, response envelope `get`.
        - Flags: read only.
      tags:
        - antidetect_browsers
      parameters:
        - name: sid
          in: path
          required: true
          description: Path segment `{sid}`.
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ab_br_
        - name: include[]
          in: query
          required: false
          description: Query parameter `include`.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - linkedin_account
                - antidetect_browser_proxy
                - antidetect_browser_logs
      responses:
        "200":
          description: "`get` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetAntidetectBrowserResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_antidetect_browser
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      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
    delete:
      operationId: delete_antidetect_browser
      summary: Delete antidetect browser
      description: |-
        Decommission (soft-delete) a single antidetect browser by sid: outward, destructive, one-way through MCP. A browser in an active-run status is stopped FIRST and the node must confirm: the call can take up to ~20s waiting for that confirm, and if it does not arrive the delete is refused with 409 conflict (context.reason=browser_stop_unconfirmed) and NOTHING is deleted - retry in a minute rather than assuming success. Variant B cascade: the bound linkedin-account is soft-deleted and pending plugin tasks transition to failed; the cascade block reports the counts. A platform-minted GoLogin profile is reclaimed (deleted) at the vendor unless another live browser row still holds it; customer BYO vendor profiles are left intact.

        Contract:
        - MCP tool `delete_antidetect_browser`, registry package `mcp.linkedin/antidetect_browsers`, mount `linkedin.browsers`.
        - Operation `delete`, response envelope `delete_cascade`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API.
      tags:
        - antidetect_browsers
      parameters:
        - name: sid
          in: path
          required: true
          description: Path segment `{sid}`.
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ab_br_
        - name: acknowledge[]
          in: query
          required: false
          description: Resolution codes for soft blockers the user confirmed.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
            description: Resolution codes for soft blockers the user confirmed.
      responses:
        "200":
          description: "`delete_cascade` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeleteAntidetectBrowserResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: delete_antidetect_browser
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: antidetect_browsers
      x-gtm-operation: delete
      x-gtm-envelope: delete_cascade
      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
  /api/cloud-browser-sessions/metrics:
    post:
      operationId: get_cloud_browser_sessions_metrics
      summary: Cloud browser sessions metrics
      description: |-
        Period-bound aggregates over a filtered cloud-browser-session set. Requires period {from,to}. Returns total_count, active_count, avg_session_duration_seconds, login_success_rate, unique_devices_count and unique_ips_count. Optional filter and a single group_by axis (access_type / login_result / ip_country / antidetect_browser_sid / …).

        Contract:
        - MCP tool `get_cloud_browser_sessions_metrics`, registry package `mcp.linkedin/cloud_browser_sessions`, mount `linkedin.browsers`.
        - Operation `metrics`, response envelope `metrics`.
        - Flags: read only.
      tags:
        - cloud_browser_sessions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetCloudBrowserSessionsMetricsRequest"
      responses:
        "200":
          description: "`metrics` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetCloudBrowserSessionsMetricsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_cloud_browser_sessions_metrics
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: cloud_browser_sessions
      x-gtm-operation: metrics
      x-gtm-envelope: metrics
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/cloud-browser-sessions/search:
    post:
      operationId: search_cloud_browser_sessions
      summary: Search cloud browser sessions
      description: |-
        List cloud-browser sessions on the team with filters, sorting and cursor pagination. This is the audit trail of who connected to which browser, from where, and how each login attempt resolved. The smart-link access_key is redacted to cb_ak_ followed by asterisks and the key's last 4 characters, so a session can be attributed to one of the browser's access keys without exposing a redeemable token; it is null only when there was no key at all (an internal session). It is not a public filter.

        Contract:
        - MCP tool `search_cloud_browser_sessions`, registry package `mcp.linkedin/cloud_browser_sessions`, mount `linkedin.browsers`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - cloud_browser_sessions
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchCloudBrowserSessionsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchCloudBrowserSessionsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_cloud_browser_sessions
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: cloud_browser_sessions
      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
  /api/cloud-browsers/list-team-occupancy:
    post:
      operationId: list_cloud_browser_team_occupancy
      summary: List cloud-browser team occupancy
      description: |-
        List the cloud-browser slots the team currently occupies. Each slot carries the connected antidetect_browser sid, the connected user, and the connect / expiry timestamps. Read-only snapshot returned in result.items.

        Contract:
        - MCP tool `list_cloud_browser_team_occupancy`, registry package `mcp.linkedin/cloud_browsers`, mount `linkedin.browsers`.
        - Operation `action`, response envelope `action`.
        - Flags: read only.
      tags:
        - cloud_browsers
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ListCloudBrowserTeamOccupancyResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: list_cloud_browser_team_occupancy
      x-gtm-mcp-mount: linkedin.browsers
      x-gtm-entity: cloud_browsers
      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
  /api/data-requests/search:
    post:
      operationId: search_data_requests
      summary: Search data requests
      description: |-
        List/filter the request history: what was asked, where it ran, what came from cache. The go-to tool for retry forensics (idempotency_key:{eq}), per-person request history (ln_member_id:{eq}) and mid-flight visibility (status:{in:["pending","running"]}). This is a read-only ledger. To RUN scraping/enrichment call the linkedin-scraping / linkedin-enrichment surfaces instead.

        Contract:
        - MCP tool `search_data_requests`, registry package `mcp.linkedin/data_requests`, mount `linkedin.data`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - data_requests
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchDataRequestsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchDataRequestsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_data_requests
      x-gtm-mcp-mount: linkedin.data
      x-gtm-entity: data_requests
      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
  /api/data-requests/{sid}:
    get:
      operationId: get_data_request
      summary: Get data request
      description: |-
        Fetch a single ledger row by sid to inspect one request referenced from a data-requests.* webhook or another row's cached_from_sid pointer.

        Contract:
        - MCP tool `get_data_request`, registry package `mcp.linkedin/data_requests`, mount `linkedin.data`.
        - Operation `get`, response envelope `get`.
        - Flags: read only.
      tags:
        - data_requests
      parameters:
        - name: sid
          in: path
          required: true
          description: Path segment `{sid}`.
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^er_rq_
        - name: include[]
          in: query
          required: false
          description: Query parameter `include`.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - linkedin_account
                - cached_from
      responses:
        "200":
          description: "`get` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetDataRequestResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_data_request
      x-gtm-mcp-mount: linkedin.data
      x-gtm-entity: data_requests
      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
  /api/linkedin-account-activity-log/metrics:
    post:
      operationId: get_linkedin_account_activity_log_metrics
      summary: LinkedIn account activity-log metrics
      description: |-
        Period-bound aggregates over a filtered activity-log set (avg plugin duration, avg pending age) plus the counts block and an optional group_by axis (action_type | status | linkedin_account_sid). Use for: "what was done today/this week grouped by action_type", at-a-glance fail rate (group_by status). Guardrail (high-write table): period {from,to} is REQUIRED and filter must include linkedin_account_sid.eq/.in. Unbounded scans are rejected; window may not exceed 90 days. The filter here is NARROWER than search: linkedin_account_sid and status are the only axes the aggregation applies. Slice any other dimension with group_by, or use search.

        Contract:
        - MCP tool `get_linkedin_account_activity_log_metrics`, registry package `mcp.linkedin/linkedin_account_activity_log`, mount `linkedin.account-monitor`.
        - Operation `metrics`, response envelope `metrics`.
        - Flags: read only.
      tags:
        - linkedin_account_activity_log
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetLinkedinAccountActivityLogMetricsRequest"
      responses:
        "200":
          description: "`metrics` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinAccountActivityLogMetricsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_account_activity_log_metrics
      x-gtm-mcp-mount: linkedin.account-monitor
      x-gtm-entity: linkedin_account_activity_log
      x-gtm-operation: metrics
      x-gtm-envelope: metrics
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-account-activity-log/search:
    post:
      operationId: search_linkedin_account_activity_log
      summary: Search LinkedIn account activity log
      description: |-
        List activity-log rows, one per plugin call (Task↔Result cycle): pending on dispatch, then success / failed / skipped. Use for: "why is account X failing" (status:failed + created_at window, read error_message/error_code), inspecting in-flight pending tasks, cross-referencing a Grafana trace_id, and polling an MCP-triggered async action by sid until status flips terminal. NOT for LinkedIn quota hits (linkedin-account-quota-hits), the rolling limit count (linkedin-account-smart-limits), or account state (linkedin-accounts). No q. Sort: created_at (default desc) | duration_ms. include[]: linkedin_account, linkedin_account_smart_limit, sync_run. page_size: 0 is count mode: no rows, and the counts block over the filter (total_count, the per-status scalars, groups by action_type / status / linkedin_account_sid); a page fetch carries no counts and a null pagination.total_count.

        Contract:
        - MCP tool `search_linkedin_account_activity_log`, registry package `mcp.linkedin/linkedin_account_activity_log`, mount `linkedin.account-monitor`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_account_activity_log
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinAccountActivityLogRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinAccountActivityLogResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_account_activity_log
      x-gtm-mcp-mount: linkedin.account-monitor
      x-gtm-entity: linkedin_account_activity_log
      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
  /api/linkedin-account-block-log/search:
    post:
      operationId: search_linkedin_account_block_log
      summary: Search LinkedIn account block log
      description: |-
        List per-target block observations for the team: one permanently-deduplicated row per (account, target) whenever a target profile blocked one of our accounts (established by the §5.6 check-target-block). Use for: "did target X block any of our accounts" (filter target_ln_member_id, no account filter → crosses the team), churn caused by blocks (include linkedin_connection), a hostile-segment trend (created_at window + total_count), reverse-lookup from a failed activity_log row or a soft-deleted connection. NOT for platform-wide locks (weekly cap / InMail rate-limit → linkedin-account-quota-hits) or raw plugin error text (linkedin-account-activity-log). No q; target_nickname is exact-match. Sort: created_at (default desc). include[]: linkedin_account, linkedin_account_activity_log, linkedin_connection.

        Contract:
        - MCP tool `search_linkedin_account_block_log`, registry package `mcp.linkedin/linkedin_account_block_log`, mount `linkedin.account-monitor`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_account_block_log
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinAccountBlockLogRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinAccountBlockLogResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_account_block_log
      x-gtm-mcp-mount: linkedin.account-monitor
      x-gtm-entity: linkedin_account_block_log
      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
  /api/linkedin-account-quota-hits/search:
    post:
      operationId: search_linkedin_account_quota_hits
      summary: Search LinkedIn account quota hits
      description: |-
        List LinkedIn-side block events (weekly connection-request cap, InMail rate-limit, a 429 on any action bucket, …) for the team: immutable, append-only, one row per (account, reason, bucket) per 12h dedup window. Use for: "is this account currently locked" (linkedin_quota_hit_till: { gt: "<now>" }), block-frequency trend, and "at what action volumes do blocks happen" (read the daily_count distribution). include[] linkedin_account / linkedin_account_snapshot correlate the block with account state at hit time. NOT for setting/clearing a lock (that lives on linkedin-account-smart-limits.linkedin_quota_hit_till) or per-target blocks (linkedin-account-block-log). No q. Sort: created_at (default desc) | linkedin_quota_hit_till.

        Contract:
        - MCP tool `search_linkedin_account_quota_hits`, registry package `mcp.linkedin/linkedin_account_quota_hits`, mount `linkedin.account-monitor`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_account_quota_hits
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinAccountQuotaHitsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinAccountQuotaHitsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_account_quota_hits
      x-gtm-mcp-mount: linkedin.account-monitor
      x-gtm-entity: linkedin_account_quota_hits
      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
  /api/linkedin-account-smart-limits/search:
    post:
      operationId: search_linkedin_account_smart_limits
      summary: Search LinkedIn account smart limits
      description: |-
        List per-limit_type policy rows (one account owns 15 public buckets: send_connection_requests, send_messages, send_inmails, scraping, enrichment, custom_request, …) with filters, sorting, cursor pagination and a counts block (status / limit_type breakdowns). Whether the warmup governs a row is the ACCOUNT's smart_limits_enabled, not a row field. Use for: "which limits are at their daily cap / held / blocked by LinkedIn" (status filter; held means the daily budget is spent), "can account X still send InMails today" (filter linkedin_account_sid + limit_type, read status + daily_limit − done_today_count), fleet capacity, smart-limit adoption rate. Every row also carries recommended_daily_limit / recommended_delay_in_seconds (what the platform would run this bucket at for THIS account) and risk_level (none | elevated | ban_likely) for the values currently set. Single-row case = search(filter:{linkedin_account_sid, limit_type}, page_size:1). No q. include[]: linkedin_account, linkedin_account_quota_hits.

        Contract:
        - MCP tool `search_linkedin_account_smart_limits`, registry package `mcp.linkedin/linkedin_account_smart_limits`, mount `linkedin.accounts`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_account_smart_limits
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinAccountSmartLimitsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinAccountSmartLimitsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_account_smart_limits
      x-gtm-mcp-mount: linkedin.accounts
      x-gtm-entity: linkedin_account_smart_limits
      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
  /api/linkedin-account-smart-limits/{sid}:
    patch:
      operationId: update_linkedin_account_smart_limit
      summary: Update LinkedIn account smart limit
      description: |-
        GATE: on a governed account (smart_limits_enabled true, the default) daily_limit / delay_in_seconds belong to the warmup; moving either is 409 smart_limits_governed: never promise a raised cap there. target_limit only BOUNDS (the row follows min(smart_limit, target_limit)): a target above the warmup ceiling changes nothing today; a young or dormant account sits at 1..2 for weeks (see warmup_breakdown). The other way: set_linkedin_account_smart_limits({enabled:false}), said out loud as removing ban protection. One row (daily_limit / target_limit / delay_in_seconds / learning_enabled; one field OR reset_hold:true). Switch off: nothing refused; read the row's recommended_* first, 2x (or half the delay) is "elevated", beyond that "ban_likely", warn so. A spent budget is "held": raising daily_limit alone does not clear it, pass reset_hold:true too; it resumes once the cap exceeds done_today_count (governed rows re-hold at once). System fields are rejected; a LinkedIn lock is not resettable.

        Contract:
        - MCP tool `update_linkedin_account_smart_limit`, registry package `mcp.linkedin/linkedin_account_smart_limits`, mount `linkedin.accounts`.
        - Operation `update`, response envelope `update`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API.
      tags:
        - linkedin_account_smart_limits
      parameters:
        - name: sid
          in: path
          required: true
          description: Smart-limit row sid (ln_sm_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_sm_
            description: Smart-limit row sid (ln_sm_…).
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateLinkedinAccountSmartLimitRequest"
      responses:
        "200":
          description: "`update` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UpdateLinkedinAccountSmartLimitResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: update_linkedin_account_smart_limit
      x-gtm-mcp-mount: linkedin.accounts
      x-gtm-entity: linkedin_account_smart_limits
      x-gtm-operation: update
      x-gtm-envelope: update
      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: complex
  /api/linkedin-account-smart-limits/{sid}/reset-hold:
    post:
      operationId: reset_linkedin_account_smart_limit_hold
      summary: Reset LinkedIn account smart-limit hold
      description: |-
        Clear OUR platform-side pause (hold_till = null) on one row. On a spent budget (done_today_count >= daily_limit) the saturation latch re-holds at once, so this is a no-op that stays held: the cap has to grow first. On a HAND-MANAGED account (smart_limits_enabled false) prefer update({daily_limit:<higher>, reset_hold:true}), which raises the cap and resumes atomically. On a GOVERNED account (the default) daily_limit is the warmup's and cannot be raised by hand: target_limit only bounds the cap, the warmup ceiling grows with account age and sent activity across snapshots, and the ramp lifts the latch by itself once its recomputed cap outgrows done_today_count, so nothing resumes today. This action resumes WITHOUT changing the limit (meaningful only when done_today_count < daily_limit, e.g. a systemic hold). Idempotent. Does NOT touch done_today_count or linkedin_quota_hit_till: a LinkedIn-side hard lock cannot be reset from the public surface (result.new_status stays linkedin_blocked while that clock runs).

        Contract:
        - MCP tool `reset_linkedin_account_smart_limit_hold`, registry package `mcp.linkedin/linkedin_account_smart_limits`, 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.
      tags:
        - linkedin_account_smart_limits
      parameters:
        - name: sid
          in: path
          required: true
          description: Smart-limit row sid (ln_sm_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_sm_
            description: Smart-limit row sid (ln_sm_…).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ResetLinkedinAccountSmartLimitHoldResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: reset_linkedin_account_smart_limit_hold
      x-gtm-mcp-mount: linkedin.accounts
      x-gtm-entity: linkedin_account_smart_limits
      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
  /api/linkedin-account-snapshots/search:
    post:
      operationId: search_linkedin_account_snapshots
      summary: Search LinkedIn account snapshots
      description: |-
        Per-account warmup snapshots over time (immutable, append-only, captured ~every 22h by the scheduler). Use for: a warmup trend over N days (filter linkedin_account_sid + created_at range), before/after compare (paused automation, rotated proxy/nickname), and reading warmup_breakdown + tips to explain WHY a warmup_score is what it is (score = round(100 × ∏(1 − penalty_pct/100)) over 6 compounding drivers). For the LATEST snapshot per account use linkedin-accounts.search with include[]=linkedin_account_snapshot (1:1); searching here for the latest is more expensive. No q (no text-searchable fields). Sort: created_at (default desc) | warmup_score. include[]: linkedin_account.

        Contract:
        - MCP tool `search_linkedin_account_snapshots`, registry package `mcp.linkedin/linkedin_account_snapshots`, mount `linkedin.account-monitor`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_account_snapshots
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinAccountSnapshotsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinAccountSnapshotsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_account_snapshots
      x-gtm-mcp-mount: linkedin.account-monitor
      x-gtm-entity: linkedin_account_snapshots
      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
  /api/linkedin-account-sync-runs/metrics:
    post:
      operationId: get_linkedin_account_sync_runs_metrics
      summary: LinkedIn account sync-run metrics
      description: |-
        Aggregate sync-run counters for dashboards: a counts block (total + per-status: pending, in_progress, completed, cancelled) plus avg_completed_duration_seconds, with an optional group_by axis (status | sync_type | triggered_by) that repeats the same block per group. Required period {from,to} bounds the window.

        Contract:
        - MCP tool `get_linkedin_account_sync_runs_metrics`, registry package `mcp.linkedin/linkedin_account_sync_runs`, mount `linkedin.account-monitor`.
        - Operation `metrics`, response envelope `metrics`.
        - Flags: read only.
      tags:
        - linkedin_account_sync_runs
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetLinkedinAccountSyncRunsMetricsRequest"
      responses:
        "200":
          description: "`metrics` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinAccountSyncRunsMetricsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_account_sync_runs_metrics
      x-gtm-mcp-mount: linkedin.account-monitor
      x-gtm-entity: linkedin_account_sync_runs
      x-gtm-operation: metrics
      x-gtm-envelope: metrics
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-account-sync-runs/search:
    post:
      operationId: search_linkedin_account_sync_runs
      summary: Search LinkedIn account sync runs
      description: |-
        List sync runs: the backend-owned progress tracker for one paginated sync of one data surface (connections, connection_requests, connection_invitations, conversations, sales_navigator_conversations, followers) or a §5.7 composition (snapshot, premium_check). Use for: "is account X fully synced / how far along" (filter linkedin_account_sid + status in [pending, in_progress]), "which accounts are stuck mid-sync" (status in_progress, sort last_progress_at), "how fresh is the connection data" (latest completed connections run → finished_at). Runs are not created here; the write surface is linkedin-accounts.reset-sync / .sync. No q. Sort: created_at (default desc) | started_at | finished_at | last_progress_at | next_attempt_at | items_saved. include[]: linkedin_account, activity_log_pages, limit (default).

        Contract:
        - MCP tool `search_linkedin_account_sync_runs`, registry package `mcp.linkedin/linkedin_account_sync_runs`, mount `linkedin.account-monitor`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_account_sync_runs
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinAccountSyncRunsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinAccountSyncRunsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_account_sync_runs
      x-gtm-mcp-mount: linkedin.account-monitor
      x-gtm-entity: linkedin_account_sync_runs
      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
  /api/linkedin-account-sync-runs/{sid}:
    get:
      operationId: get_linkedin_account_sync_run
      summary: Get LinkedIn account sync run
      description: |-
        Fetch one sync run by sid, with includes (linkedin_account; activity_log_pages for the per-page fetch log; limit for the gating smart-limit bucket, always resolved). Use to drill into a single run's progress, resume-cursor state, and per-page audit.

        Contract:
        - MCP tool `get_linkedin_account_sync_run`, registry package `mcp.linkedin/linkedin_account_sync_runs`, mount `linkedin.account-monitor`.
        - Operation `get`, response envelope `get`.
        - Flags: read only.
      tags:
        - linkedin_account_sync_runs
      parameters:
        - name: sid
          in: path
          required: true
          description: Path segment `{sid}`.
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_sy_
        - name: include[]
          in: query
          required: false
          description: Query parameter `include`.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - linkedin_account
                - activity_log_pages
                - limit
      responses:
        "200":
          description: "`get` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinAccountSyncRunResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_account_sync_run
      x-gtm-mcp-mount: linkedin.account-monitor
      x-gtm-entity: linkedin_account_sync_runs
      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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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/<id>/). 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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /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
  /api/linkedin-auto-scrape-results/search:
    post:
      operationId: search_linkedin_auto_scrape_results
      summary: Search LinkedIn auto-scrape results
      description: |-
        Read the leads a collector has captured: one row per unique person or company, deduped across every run, each carrying flat identifiers plus the latest payload (name, headline, location, industry). Use for: the whole registry of a job (filter linkedin_auto_scrape_sid), the fresh delta of one run (first_seen_run_sid, the ingest path once a run completes), is this person already collected (parent sid plus ln_member_id or company_ln_id), and which leads keep re-appearing (seen_runs_count gte 3). page_size 0 returns counts.total_count, which IS the unique-lead count because dedup is built into the row. NOT for how a run went (search_linkedin_auto_scrape_runs), NOT for managing the job (search_linkedin_auto_scrapes), and NOT for outreach state: this registry records who was collected, never what was done to them. No q; include first_seen_run / last_seen_run for the run number behind the sid; nickname is exact match; dedup_key needs its parent partner. Sort: created_at (default desc) | updated_at | seen_runs_count.

        Contract:
        - MCP tool `search_linkedin_auto_scrape_results`, registry package `mcp.linkedin/linkedin_auto_scrape_results`, mount `linkedin.auto-scrapes`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_auto_scrape_results
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinAutoScrapeResultsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinAutoScrapeResultsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_auto_scrape_results
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrape_results
      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
  /api/linkedin-auto-scrape-runs/search:
    post:
      operationId: search_linkedin_auto_scrape_runs
      summary: Search LinkedIn auto-scrape runs
      description: |-
        List executions of the collectors: one row per pass of one auto-scrape page loop, with its page progress and its delta (new_count, seen_count, enrolled_count). Use for: the history of one job (filter linkedin_auto_scrape_sid, sort run_number desc, page_size 1 for the latest), why collection stopped (status failed, then read error_message), which runs produced (sort new_count desc), and which fed a mass-action (mass_action_sid). NOT for the leads themselves (search_linkedin_auto_scrape_results on first_seen_run_sid) and NOT for starting a run (run_linkedin_auto_scrape_now): runs are server-minted and immutable. No q, no include[]. run_number needs its parent partner (422 bounded_scan_required). Sort: created_at (default desc) | run_number | completed_at | new_count.

        Contract:
        - MCP tool `search_linkedin_auto_scrape_runs`, registry package `mcp.linkedin/linkedin_auto_scrape_runs`, mount `linkedin.auto-scrapes`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_auto_scrape_runs
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinAutoScrapeRunsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinAutoScrapeRunsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_auto_scrape_runs
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrape_runs
      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
  /api/linkedin-auto-scrape-runs/{sid}:
    get:
      operationId: get_linkedin_auto_scrape_run
      summary: Get LinkedIn auto-scrape run
      description: |-
        Fetch one run by sid: the poll handle after run_linkedin_auto_scrape_now. Read status, page_cursor and pages_applied for progress, new_count against enrolled_count for how much of the delta reached the linked mass-action, and error_message for why a failed run failed. The leads it discovered come from search_linkedin_auto_scrape_results filtered on first_seen_run_sid, which is the authoritative delta (new_count is a best-effort rollup under crash retry).

        Contract:
        - MCP tool `get_linkedin_auto_scrape_run`, registry package `mcp.linkedin/linkedin_auto_scrape_runs`, mount `linkedin.auto-scrapes`.
        - Operation `get`, response envelope `get`.
        - Flags: read only.
      tags:
        - linkedin_auto_scrape_runs
      parameters:
        - name: sid
          in: path
          required: true
          description: Path segment `{sid}`.
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_ar_
        - name: include[]
          in: query
          required: false
          description: Query parameter `include`.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
      responses:
        "200":
          description: "`get` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinAutoScrapeRunResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_auto_scrape_run
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrape_runs
      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
  /api/linkedin-auto-scrapes:
    post:
      operationId: create_linkedin_auto_scrape
      summary: Create LinkedIn auto-scrape
      description: |-
        Save a scraping source as a collector and start it. Give the source EXACTLY one way: a bare url (people and company searches only) or the pair source_method plus source_input. Anything else is 422.

        Use for the standing ask, "keep pulling everyone behind this link". To wire outreach, author the plan FIRST on the mass-actions mount (preview_mass_action, then create_mass_action with scope kind none) and pass its ma_ac_ sid here: every new lead is appended to that run as one item. Omit mass_action_sid to collect only, omit replay_frequency for a one-shot.

        Run 1 dispatches AT ONCE: real LinkedIn automation starts, and a linked run begins enrolling. Watch it with search_linkedin_auto_scrape_runs, read the leads with search_linkedin_auto_scrape_results. Rejections are all pre-flight 422: invalid_url, invalid_source_method, method_not_available, source_input_incomplete, account_not_in_team, sales_nav_required (sales-nav sources and company-decision-makers need Sales Navigator), mass_action_incompatible.

        Contract:
        - MCP tool `create_linkedin_auto_scrape`, registry package `mcp.linkedin/linkedin_auto_scrapes`, mount `linkedin.auto-scrapes`.
        - Operation `create`, response envelope `create`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API.
      tags:
        - linkedin_auto_scrapes
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateLinkedinAutoScrapeRequest"
      responses:
        "200":
          description: "`create` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreateLinkedinAutoScrapeResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: create_linkedin_auto_scrape
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrapes
      x-gtm-operation: create
      x-gtm-envelope: create
      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: complex
  /api/linkedin-auto-scrapes/search:
    post:
      operationId: search_linkedin_auto_scrapes
      summary: Search LinkedIn auto-scrapes
      description: |-
        List the team's collectors: saved jobs that paginate one LinkedIn or Sales Navigator list surface on a cadence and file deduped leads. Use for: which collectors are live or paused and why (status, paused_reason), what a given account collects (linkedin_account_sid), which ones feed outreach (mass_action_sid, is_null:true = collect-only), what runs next (sort next_run_at asc), and which produce (total_new_results). NOT for the leads themselves (search_linkedin_auto_scrape_results) or for one execution (search_linkedin_auto_scrape_runs). q: substring of the title, the ln_as_ sid or the pasted source URL (not the executor name or the mass-action title). include: linkedin_account (the executor row) and last_run (the newest run, the only place an in-flight run shows up). Sort: created_at (default desc) | updated_at | next_run_at | last_run_at | total_new_results. page_size:0 returns the count alone.

        Contract:
        - MCP tool `search_linkedin_auto_scrapes`, registry package `mcp.linkedin/linkedin_auto_scrapes`, mount `linkedin.auto-scrapes`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_auto_scrapes
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinAutoScrapesRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinAutoScrapesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_auto_scrapes
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrapes
      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
  /api/linkedin-auto-scrapes/{sid}:
    get:
      operationId: get_linkedin_auto_scrape
      summary: Get LinkedIn auto-scrape
      description: |-
        Fetch one collector by sid: status and paused_reason, next_run_at and last_run_at, runs_count and total_new_results, and mass_action_sid (null = collect-only). include: linkedin_account (the executor row), last_run (the newest run, null when the job has never run). Executions and leads are separate reads: search_linkedin_auto_scrape_runs and search_linkedin_auto_scrape_results.

        Contract:
        - MCP tool `get_linkedin_auto_scrape`, registry package `mcp.linkedin/linkedin_auto_scrapes`, mount `linkedin.auto-scrapes`.
        - Operation `get`, response envelope `get`.
        - Flags: read only.
      tags:
        - linkedin_auto_scrapes
      parameters:
        - name: sid
          in: path
          required: true
          description: Path segment `{sid}`.
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_as_
        - name: include[]
          in: query
          required: false
          description: Query parameter `include`.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - linkedin_account
                - last_run
      responses:
        "200":
          description: "`get` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinAutoScrapeResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_auto_scrape
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrapes
      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: update_linkedin_auto_scrape
      summary: Update LinkedIn auto-scrape
      description: |-
        Patch a collector. Only title and replay_frequency are writable, and at least one must be sent (else 422 nothing_to_update). The source is immutable by design: a different source is a different collector, so create a new one. The outreach link moves through set_linkedin_auto_scrape_mass_action / unset_linkedin_auto_scrape_mass_action, and status through pause_linkedin_auto_scrape / resume_linkedin_auto_scrape. A cadence change re-plans next_run_at only when the clock is already armed; a run in flight keeps its claim and picks the new cadence up when it finalizes.

        Contract:
        - MCP tool `update_linkedin_auto_scrape`, registry package `mcp.linkedin/linkedin_auto_scrapes`, mount `linkedin.auto-scrapes`.
        - Operation `update`, response envelope `update`.
        - Flags: none.
      tags:
        - linkedin_auto_scrapes
      parameters:
        - name: sid
          in: path
          required: true
          description: Auto-scrape sid (ln_as_...).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_as_
            description: Auto-scrape sid (ln_as_...).
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateLinkedinAutoScrapeRequest"
      responses:
        "200":
          description: "`update` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UpdateLinkedinAutoScrapeResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: update_linkedin_auto_scrape
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrapes
      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
    delete:
      operationId: delete_linkedin_auto_scrape
      summary: Delete LinkedIn auto-scrape
      description: |-
        Retire a collector for good: soft-delete, so no further run is ever minted and a run in flight abandons at its next page boundary. Runs and collected leads are retained for audit and stay readable by sid. The linked mass-action is INDEPENDENT and keeps draining the leads already enrolled in it: stop that separately with delete_mass_action. To stop collecting for a while without losing the job, use pause_linkedin_auto_scrape instead. No undo through MCP.

        Contract:
        - MCP tool `delete_linkedin_auto_scrape`, registry package `mcp.linkedin/linkedin_auto_scrapes`, mount `linkedin.auto-scrapes`.
        - Operation `delete`, response envelope `delete_simple`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API.
      tags:
        - linkedin_auto_scrapes
      parameters:
        - name: sid
          in: path
          required: true
          description: Path segment `{sid}`.
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_as_
      responses:
        "200":
          description: "`delete_simple` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeleteLinkedinAutoScrapeResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: delete_linkedin_auto_scrape
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrapes
      x-gtm-operation: delete
      x-gtm-envelope: delete_simple
      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
  /api/linkedin-auto-scrapes/{sid}/pause:
    post:
      operationId: pause_linkedin_auto_scrape
      summary: Pause LinkedIn auto-scrape
      description: |-
        Freeze recurrence: status becomes paused with paused_reason 'manual' and next_run_at is cleared, so no new run is minted. A run already in flight FINISHES (pausing never abandons it). Idempotent. Use to stop collecting over a holiday or while an outreach plan is being reworked; use delete_linkedin_auto_scrape to retire the job outright.

        Contract:
        - MCP tool `pause_linkedin_auto_scrape`, registry package `mcp.linkedin/linkedin_auto_scrapes`, mount `linkedin.auto-scrapes`.
        - Operation `action`, response envelope `action`.
        - Flags: none.
      tags:
        - linkedin_auto_scrapes
      parameters:
        - name: sid
          in: path
          required: true
          description: Auto-scrape sid (ln_as_...).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_as_
            description: Auto-scrape sid (ln_as_...).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PauseLinkedinAutoScrapeResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: pause_linkedin_auto_scrape
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrapes
      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
  /api/linkedin-auto-scrapes/{sid}/resume:
    post:
      operationId: resume_linkedin_auto_scrape
      summary: Resume LinkedIn auto-scrape
      description: |-
        Re-arm a paused collector: status becomes active, paused_reason clears, consecutive_failures resets to 0 and next_run_at is set to now, so the next scheduler tick mints a run. Works on any paused job, including a paused one-shot (a repeat pass is cheap because identity dedup makes it near zero new). 409 invalid_status_transition when the job is already active: an exhausted one-shot stays active with a null clock, and resuming it is exactly how you run it again.

        Contract:
        - MCP tool `resume_linkedin_auto_scrape`, registry package `mcp.linkedin/linkedin_auto_scrapes`, mount `linkedin.auto-scrapes`.
        - Operation `action`, response envelope `action`.
        - Flags: none.
      tags:
        - linkedin_auto_scrapes
      parameters:
        - name: sid
          in: path
          required: true
          description: Auto-scrape sid (ln_as_...).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_as_
            description: Auto-scrape sid (ln_as_...).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ResumeLinkedinAutoScrapeResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: resume_linkedin_auto_scrape
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrapes
      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
  /api/linkedin-auto-scrapes/{sid}/run-now:
    post:
      operationId: run_linkedin_auto_scrape_now
      summary: Run LinkedIn auto-scrape now
      description: |-
        Mint a manual run immediately, off schedule, and return its run_sid in result. Asynchronous: a worker drives the page loop, so poll get_linkedin_auto_scrape_run for status, new_count and enrolled_count. Use when the operator will not wait for the next slot. Only one run may be in flight per collector: 409 run_in_progress while one is pending or in_progress, and 409 auto_scrape_not_active on a paused job (resume it first).

        Contract:
        - MCP tool `run_linkedin_auto_scrape_now`, registry package `mcp.linkedin/linkedin_auto_scrapes`, mount `linkedin.auto-scrapes`.
        - 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.
      tags:
        - linkedin_auto_scrapes
      parameters:
        - name: sid
          in: path
          required: true
          description: Auto-scrape sid (ln_as_...).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_as_
            description: Auto-scrape sid (ln_as_...).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RunLinkedinAutoScrapeNowResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: run_linkedin_auto_scrape_now
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrapes
      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
  /api/linkedin-auto-scrapes/{sid}/set-mass-action:
    post:
      operationId: set_linkedin_auto_scrape_mass_action
      summary: Link LinkedIn auto-scrape to a mass-action
      description: |-
        Wire this collector to a mass-action: from the next run on, every newly discovered lead is appended to that run as one item, which is how collection turns into outreach. Author the run FIRST on the mass-actions mount (preview_mass_action, then create_mass_action, normally with scope kind none) and pass its ma_ac_ sid here. Slot semantics: an existing link is replaced and returned as previous_mass_action_sid, and that older run keeps draining what it already holds. A run in flight is unaffected, it keeps the link it was minted with. 422 when the mass-action is missing, foreign, deleted, or its target family cannot accept this collector result_kind.

        Contract:
        - MCP tool `set_linkedin_auto_scrape_mass_action`, registry package `mcp.linkedin/linkedin_auto_scrapes`, mount `linkedin.auto-scrapes`.
        - Operation `action`, response envelope `action`.
        - Flags: none.
      tags:
        - linkedin_auto_scrapes
      parameters:
        - name: sid
          in: path
          required: true
          description: Auto-scrape sid (ln_as_...).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_as_
            description: Auto-scrape sid (ln_as_...).
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SetLinkedinAutoScrapeMassActionRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SetLinkedinAutoScrapeMassActionResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: set_linkedin_auto_scrape_mass_action
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrapes
      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
  /api/linkedin-auto-scrapes/{sid}/unset-mass-action:
    post:
      operationId: unset_linkedin_auto_scrape_mass_action
      summary: Unlink LinkedIn auto-scrape from its mass-action
      description: |-
        Cut the outreach wire: clear mass_action_sid so the collector goes back to collect-only from the next run. This does NOT stop the mass-action. Leads already enrolled keep running, and stopping them is delete_mass_action on the mass-actions mount. A run in flight keeps enrolling into the link it was minted with. 409 no_mass_action_set when nothing is linked. To point the collector at a different plan, call set_linkedin_auto_scrape_mass_action instead: it replaces the slot in one call.

        Contract:
        - MCP tool `unset_linkedin_auto_scrape_mass_action`, registry package `mcp.linkedin/linkedin_auto_scrapes`, mount `linkedin.auto-scrapes`.
        - Operation `action`, response envelope `action`.
        - Flags: none.
      tags:
        - linkedin_auto_scrapes
      parameters:
        - name: sid
          in: path
          required: true
          description: Auto-scrape sid (ln_as_...).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_as_
            description: Auto-scrape sid (ln_as_...).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UnsetLinkedinAutoScrapeMassActionResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: unset_linkedin_auto_scrape_mass_action
      x-gtm-mcp-mount: linkedin.auto-scrapes
      x-gtm-entity: linkedin_auto_scrapes
      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
  /api/linkedin-benchmarks/get-latest-benchmark:
    post:
      operationId: get_latest_linkedin_benchmark
      summary: Get latest LinkedIn benchmark
      description: |-
        Return the most recent platform benchmark row (largest period_start < today). Platform-GLOBAL: every team reads the same weekly row. No parameters. Use to compare an account or fleet against the market (acceptance rate, reply rates) and to calibrate safe daily ceilings by cohort. Pair it with linkedin-account-snapshots / linkedin-accounts / *.metrics for the per-account numbers to compare against. Every metric lives in the group_1 / group_2 / group_3 JSON blobs; dereference the specific path per MARKET_BENCHMARKS.md. NOT for a single account's current numbers (linkedin-accounts / -snapshots), live limit utilisation (linkedin-account-smart-limits), a specific quota hit (linkedin-account-quota-hits), or historical trends (internal-only). Cold start returns 404 no_benchmark_published.

        Contract:
        - MCP tool `get_latest_linkedin_benchmark`, registry package `mcp.linkedin/linkedin_benchmarks`, mount `linkedin.account-monitor`.
        - Operation `action`, response envelope `action`.
        - Flags: read only.
      tags:
        - linkedin_benchmarks
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLatestLinkedinBenchmarkResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_latest_linkedin_benchmark
      x-gtm-mcp-mount: linkedin.account-monitor
      x-gtm-entity: linkedin_benchmarks
      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
  /api/linkedin-connection-invitations/get-my-latest:
    post:
      operationId: get_my_latest_linkedin_connection_invitations
      summary: Get my latest connection invitations
      description: |-
        Always-fresh head read of pending inbound invitations: refresh the newest from LinkedIn in-request (§5.8), then return the last N (received_at DESC). The first page (cursor null) triggers the refresh; continuation pages read the already-refreshed DB. Account-scoped. Runs through the account's browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account's overdue syncs.

        Contract:
        - MCP tool `get_my_latest_linkedin_connection_invitations`, registry package `mcp.linkedin/linkedin_connection_invitations`, mount `linkedin.network`.
        - Operation `action`, response envelope `search`.
        - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_connection_invitations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetMyLatestLinkedinConnectionInvitationsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetMyLatestLinkedinConnectionInvitationsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_my_latest_linkedin_connection_invitations
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_invitations
      x-gtm-operation: action
      x-gtm-envelope: search
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: self_account_sync
  /api/linkedin-connection-invitations/metrics:
    post:
      operationId: get_linkedin_connection_invitations_metrics
      summary: Connection invitations metrics
      description: |-
        Period-bound aggregates over one account's invitations. Requires period {from,to} and filter.linkedin_account_sid (.eq or .in) - that is the ONLY filter axis the aggregation applies, unlike search. Returns avg_time_to_triage_seconds; acceptance / ignore rates are derived client-side from the counts block.

        Contract:
        - MCP tool `get_linkedin_connection_invitations_metrics`, registry package `mcp.linkedin/linkedin_connection_invitations`, mount `linkedin.network`.
        - Operation `metrics`, response envelope `metrics`.
        - Flags: read only.
      tags:
        - linkedin_connection_invitations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetLinkedinConnectionInvitationsMetricsRequest"
      responses:
        "200":
          description: "`metrics` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinConnectionInvitationsMetricsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_connection_invitations_metrics
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_invitations
      x-gtm-operation: metrics
      x-gtm-envelope: metrics
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-connection-invitations/search:
    post:
      operationId: search_linkedin_connection_invitations
      summary: Search connection invitations
      description: |-
        List inbound LinkedIn connection invitations we received, with filters (including an exact-match note filter; there is no free-text q on this entity), sorting and cursor pagination. Pending rows have removal_kind IS NULL; terminal rows are accepted / ignored / expired (deleted_at set). include[] can eager-load linkedin_account.

        Contract:
        - MCP tool `search_linkedin_connection_invitations`, registry package `mcp.linkedin/linkedin_connection_invitations`, mount `linkedin.network`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_connection_invitations
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinConnectionInvitationsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinConnectionInvitationsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_connection_invitations
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_invitations
      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
  /api/linkedin-connection-invitations/sync-my-linkedin-connection-invitations:
    post:
      operationId: sync_my_linkedin_connection_invitations
      summary: Sync connection invitations
      description: |-
        Kick off a fresh inbound-invitations sync for one account by inserting a sync_run. ASYNC: returns pending refs to poll or await the linkedin-connection-invitations.sync-completed webhook.

        Contract:
        - MCP tool `sync_my_linkedin_connection_invitations`, registry package `mcp.linkedin/linkedin_connection_invitations`, mount `linkedin.network`.
        - Operation `action`, response envelope `action_async`.
        - Flags: none.
      tags:
        - linkedin_connection_invitations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SyncMyLinkedinConnectionInvitationsRequest"
      responses:
        "200":
          description: "`action_async` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SyncMyLinkedinConnectionInvitationsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: sync_my_linkedin_connection_invitations
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_invitations
      x-gtm-operation: action
      x-gtm-envelope: action_async
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-connection-invitations/{sid}/accept:
    post:
      operationId: accept_linkedin_connection_invitation
      summary: Accept connection invitation
      description: |-
        Accept one inbound connection invitation (outward action). On terminal success the invitation row is soft-deleted (removal_kind=accepted) and a linkedin-connections row is created for the new 1st-degree edge. Identify the invitation by its ln_ci_ sid.

        Contract:
        - MCP tool `accept_linkedin_connection_invitation`, registry package `mcp.linkedin/linkedin_connection_invitations`, 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_connection_invitations
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn connection-invitation sid (ln_ci_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_ci_
            description: LinkedIn connection-invitation sid (ln_ci_…).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AcceptLinkedinConnectionInvitationResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: accept_linkedin_connection_invitation
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_invitations
      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
  /api/linkedin-connection-invitations/{sid}/ignore:
    post:
      operationId: ignore_linkedin_connection_invitation
      summary: Ignore connection invitation
      description: |-
        Ignore one inbound connection invitation (outward action). On terminal success the invitation row is soft-deleted (removal_kind=ignored); no connection is created. Identify the invitation by its ln_ci_ sid.

        Contract:
        - MCP tool `ignore_linkedin_connection_invitation`, registry package `mcp.linkedin/linkedin_connection_invitations`, 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_connection_invitations
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn connection-invitation sid (ln_ci_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_ci_
            description: LinkedIn connection-invitation sid (ln_ci_…).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/IgnoreLinkedinConnectionInvitationResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: ignore_linkedin_connection_invitation
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_invitations
      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
  /api/linkedin-connection-requests/check-sent:
    post:
      operationId: check_linkedin_connection_request_sent
      summary: Check whether a LinkedIn connection request went out
      description: |-
        Ask what a LinkedIn connection request came to, without sending: by the client_reference it went out under (optionally for one person: profile_id or ln_member_id), or by the activity_log_sid a 409 named. result.outcome: sent (item is the request, or null with reason request_row_pending or caller_confirmed), in_flight, unknown (the answer was lost and the sent invitations have not shown it yet; retry_after, send_decisive_at), or not_sent (no_send_under_key, refused, not_in_invitations, caller_confirmed). Send the same request again only on not_sent, under the same key. result.activity_log_sid is the attempt a person's word names (confirmed_not_sent / confirmed_sent on the send). An invitation in doubt has the sent invitations read now when the last look is old enough, so a call can take as long as a head read. A key sent to several persons is 422 place_required (context.places).

        Contract:
        - MCP tool `check_linkedin_connection_request_sent`, registry package `mcp.linkedin/linkedin_connection_requests`, mount `linkedin.network`.
        - Operation `action`, response envelope `action`.
        - Flags: none.
      tags:
        - linkedin_connection_requests
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CheckLinkedinConnectionRequestSentRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CheckLinkedinConnectionRequestSentResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: check_linkedin_connection_request_sent
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_requests
      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: complex
  /api/linkedin-connection-requests/get-my-latest:
    post:
      operationId: get_my_latest_linkedin_connection_requests
      summary: Get my latest connection requests
      description: |-
        Always-fresh head read of pending outbound requests: refresh the newest from LinkedIn in-request (§5.8), then return the last N (sent_at DESC). The first page (cursor null) triggers the refresh; continuation pages read the already-refreshed DB. Account-scoped. Runs through the account's browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account's overdue syncs.

        Contract:
        - MCP tool `get_my_latest_linkedin_connection_requests`, registry package `mcp.linkedin/linkedin_connection_requests`, mount `linkedin.network`.
        - Operation `action`, response envelope `search`.
        - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_connection_requests
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetMyLatestLinkedinConnectionRequestsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetMyLatestLinkedinConnectionRequestsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_my_latest_linkedin_connection_requests
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_requests
      x-gtm-operation: action
      x-gtm-envelope: search
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: self_account_sync
  /api/linkedin-connection-requests/metrics:
    post:
      operationId: get_linkedin_connection_requests_metrics
      summary: Connection requests metrics
      description: |-
        Period-bound aggregates over one account's sent requests. Requires period {from,to} and filter.linkedin_account_sid (.eq or .in) - that is the ONLY filter axis the aggregation applies, unlike search. Returns avg_note_length_of_accepted and avg_time_to_accept_seconds; acceptance / withdraw / expiry rates are derived client-side from the counts block.

        Contract:
        - MCP tool `get_linkedin_connection_requests_metrics`, registry package `mcp.linkedin/linkedin_connection_requests`, mount `linkedin.network`.
        - Operation `metrics`, response envelope `metrics`.
        - Flags: read only.
      tags:
        - linkedin_connection_requests
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetLinkedinConnectionRequestsMetricsRequest"
      responses:
        "200":
          description: "`metrics` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinConnectionRequestsMetricsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_connection_requests_metrics
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_requests
      x-gtm-operation: metrics
      x-gtm-envelope: metrics
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-connection-requests/search:
    post:
      operationId: search_linkedin_connection_requests
      summary: Search connection requests
      description: |-
        List outbound LinkedIn connection requests (invitations we sent) with filters, sorting, cursor pagination and filter.q, a LIKE (substring) over the note. Pending rows have removal_kind IS NULL; terminal rows are accepted / withdrawn / expired (deleted_at set). include[] can eager-load linkedin_account.

        Contract:
        - MCP tool `search_linkedin_connection_requests`, registry package `mcp.linkedin/linkedin_connection_requests`, mount `linkedin.network`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_connection_requests
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinConnectionRequestsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinConnectionRequestsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_connection_requests
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_requests
      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
  /api/linkedin-connection-requests/send:
    post:
      operationId: send_linkedin_connection_request
      summary: Send connection request
      description: |-
        Send one outbound LinkedIn connection request (outward action). Address the person by profile_id (the URN, ln_id or sn_id) or by public_identifier (slug or /in/ URL). Checks: daily limit, note cap (200 free / 300 premium), 21-day resend cooldown. Fire-on-success: a row only when LinkedIn confirms. Sends once per client_reference and person: a repeat is answered, never sent twice; on a 409 read error.context.send_outcome, never resend under a new key. A request on record under another key or none: 422 resend_not_available, context.cause pending, accepted, cooldown (resend_available_at) or sync_reset; an accepted one is probed on LinkedIn first (context.probe); a person who removed the account, or whom it removed, is invited again. 422 target_blocked: they blocked the account (context.block_log_sid; never retry). 422 target_unavailable: nobody in the team can see their account (retry after context.retry_after). check_linkedin_connection_request_sent asks what an invitation came to without sending.

        Contract:
        - MCP tool `send_linkedin_connection_request`, registry package `mcp.linkedin/linkedin_connection_requests`, 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; step eligible: gtm.service.orchestration can run this verb as a mass-action plan step, once per item; paced: a call spends the `send_connection_requests` 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_connection_requests
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SendLinkedinConnectionRequestRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SendLinkedinConnectionRequestResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: send_linkedin_connection_request
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_requests
      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: complex
      x-gtm-paced-bucket: send_connection_requests
  /api/linkedin-connection-requests/sync-linkedin-connection-requests:
    post:
      operationId: sync_linkedin_connection_requests
      summary: Sync connection requests
      description: |-
        Refresh the outbound sent-invitations snapshot for one account by inserting a sync_run (upsert-only). ASYNC: returns pending refs to poll or await the linkedin-connection-requests.sync-completed webhook.

        Contract:
        - MCP tool `sync_linkedin_connection_requests`, registry package `mcp.linkedin/linkedin_connection_requests`, mount `linkedin.network`.
        - Operation `action`, response envelope `action_async`.
        - Flags: none.
      tags:
        - linkedin_connection_requests
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SyncLinkedinConnectionRequestsRequest"
      responses:
        "200":
          description: "`action_async` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SyncLinkedinConnectionRequestsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: sync_linkedin_connection_requests
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_requests
      x-gtm-operation: action
      x-gtm-envelope: action_async
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-connection-requests/{sid}/withdraw:
    post:
      operationId: withdraw_linkedin_connection_request
      summary: Withdraw connection request
      description: |-
        Withdraw a pending outbound connection request (outward, destructive). Dispatches the withdraw-invitation browser verb (networking_general bucket); on terminal success the row is soft-deleted (removal_kind=withdrawn) and a 21-day resend cooldown begins. Identify the request by its ln_cr_ sid.

        Contract:
        - MCP tool `withdraw_linkedin_connection_request`, registry package `mcp.linkedin/linkedin_connection_requests`, 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_connection_requests
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn connection-request sid (ln_cr_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_cr_
            description: LinkedIn connection-request sid (ln_cr_…).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/WithdrawLinkedinConnectionRequestResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: withdraw_linkedin_connection_request
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connection_requests
      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
  /api/linkedin-connections/check-degree:
    post:
      operationId: check_linkedin_connection_degree
      summary: Check connection degree
      description: |-
        Probe one contact's current connection degree (1st / 2nd / 3rd / 4_plus) from a managed account, and actualize a stale stored row: a live connection whose degree is no longer 1st is soft-deleted (removal_kind=removed) in the same call. Reuses the get-lite-profile getter (owner-only: it runs on the account you name). Supply exactly one target identifier.

        Contract:
        - MCP tool `check_linkedin_connection_degree`, registry package `mcp.linkedin/linkedin_connections`, mount `linkedin.network`.
        - Operation `action`, response envelope `action`.
        - Flags: 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_connections
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CheckLinkedinConnectionDegreeRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CheckLinkedinConnectionDegreeResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: check_linkedin_connection_degree
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connections
      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: networking_general
  /api/linkedin-connections/get-my-latest:
    post:
      operationId: get_my_latest_linkedin_connections
      summary: Get my latest connections
      description: |-
        Always-fresh head read: refresh the newest connections from LinkedIn in-request (§5.8), then return the last N (connected_at DESC) with a counts block. The first page (cursor null) triggers the refresh; continuation pages read the already-refreshed DB. Account-scoped. For richer slicing call search_linkedin_connections right after. Runs through the account's browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account's overdue syncs.

        Contract:
        - MCP tool `get_my_latest_linkedin_connections`, registry package `mcp.linkedin/linkedin_connections`, mount `linkedin.network`.
        - Operation `action`, response envelope `search`.
        - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_connections
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetMyLatestLinkedinConnectionsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetMyLatestLinkedinConnectionsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_my_latest_linkedin_connections
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connections
      x-gtm-operation: action
      x-gtm-envelope: search
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: self_account_sync
  /api/linkedin-connections/metrics:
    post:
      operationId: get_linkedin_connections_metrics
      summary: LinkedIn connections metrics
      description: |-
        Period-bound aggregates over a filtered connection set. Requires period {from,to} (≤ 90 days). Returns connections_growth, connections_removed, net_growth, reply_rate_within_connections, dormant_connections and avg_time_to_first_message. Optional filter and a single group_by axis.

        Contract:
        - MCP tool `get_linkedin_connections_metrics`, registry package `mcp.linkedin/linkedin_connections`, mount `linkedin.network`.
        - Operation `metrics`, response envelope `metrics`.
        - Flags: read only.
      tags:
        - linkedin_connections
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetLinkedinConnectionsMetricsRequest"
      responses:
        "200":
          description: "`metrics` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinConnectionsMetricsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_connections_metrics
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connections
      x-gtm-operation: metrics
      x-gtm-envelope: metrics
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-connections/search:
    post:
      operationId: search_linkedin_connections
      summary: Search LinkedIn connections
      description: |-
        List an account's 1st-degree LinkedIn connections with filters, sorting, cursor pagination and filter.q, a LIKE (substring) over the contact name. Live rows by default (filter {"deleted_at": {"is_null": true}}); pass {"deleted_at": {"is_null": false}} for churn analysis. Returns a counts block of predicate tallies; include[] can eager-load linkedin_account, the source request/invitation, conversations and last_messages.

        Contract:
        - MCP tool `search_linkedin_connections`, registry package `mcp.linkedin/linkedin_connections`, mount `linkedin.network`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_connections
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinConnectionsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinConnectionsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_connections
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connections
      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
  /api/linkedin-connections/sync-my-linkedin-connections:
    post:
      operationId: sync_my_linkedin_connections
      summary: Sync my connections
      description: |-
        Kick off a background connections sync for one account by inserting a sync_run. The pages add and update rows; a live row the run should have listed and did not goes to the check-target-block, whose read removes a severed edge (linkedin-connections.removed lands shortly after the run). ASYNC: returns pending refs to poll or await the linkedin-connections.sync-completed webhook. For an in-request head refresh use get_my_latest_linkedin_connections instead.

        Contract:
        - MCP tool `sync_my_linkedin_connections`, registry package `mcp.linkedin/linkedin_connections`, mount `linkedin.network`.
        - Operation `action`, response envelope `action_async`.
        - Flags: none.
      tags:
        - linkedin_connections
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SyncMyLinkedinConnectionsRequest"
      responses:
        "200":
          description: "`action_async` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SyncMyLinkedinConnectionsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: sync_my_linkedin_connections
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connections
      x-gtm-operation: action
      x-gtm-envelope: action_async
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-connections/{sid}/remove:
    post:
      operationId: remove_linkedin_connection
      summary: Remove connection
      description: |-
        Disconnect a 1st-degree connection on LinkedIn (outward, destructive). Dispatches the remove-connection browser verb (networking_general bucket); on terminal success the local row is soft-deleted (removal_kind=removed) and linkedin-connections.removed is emitted. Identify the connection by its ln_cn_ sid.

        Contract:
        - MCP tool `remove_linkedin_connection`, registry package `mcp.linkedin/linkedin_connections`, 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_connections
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn connection sid (ln_cn_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_cn_
            description: LinkedIn connection sid (ln_cn_…).
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RemoveLinkedinConnectionRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RemoveLinkedinConnectionResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: remove_linkedin_connection
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_connections
      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
  /api/linkedin-conversations/get-my-latest:
    post:
      operationId: get_my_latest_linkedin_conversations
      summary: Get my latest LinkedIn conversations
      description: |-
        Always-fresh head read of the basic-LinkedIn-messenger thread list for one account (§5.8 foreground refresh, then the last N threads from the refreshed DB, last_activity_at DESC). Never serves stale data: it 429s with bucket_saturated / sync_in_progress instead. Use before an inbox decision; use sync_my_linkedin_conversations for full backfill. Runs through the account's browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account's overdue syncs.

        Contract:
        - MCP tool `get_my_latest_linkedin_conversations`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `search`.
        - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_conversations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetMyLatestLinkedinConversationsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetMyLatestLinkedinConversationsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_my_latest_linkedin_conversations
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: search
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: self_account_sync
  /api/linkedin-conversations/get-my-latest-recruiter:
    post:
      operationId: get_my_latest_linkedin_conversations_recruiter
      summary: Get my latest Recruiter conversations
      description: |-
        LinkedIn Recruiter variant of get_my_latest_linkedin_conversations: always-fresh head read of the recruiter inbox for one account (§5.8 refresh-then-return over the talent wire, page size fixed at 15 by that wire). Same hard-429 guards; returns messenger_type='recruiter' rows whose recruiter_id is the candidate. Needs a Recruiter seat and its stamped seat number (422 recruiter_required / recruiter_seat_unresolvable). Runs through the account's browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account's overdue syncs.

        Contract:
        - MCP tool `get_my_latest_linkedin_conversations_recruiter`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.recruiter`.
        - Operation `action`, response envelope `search`.
        - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_conversations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetMyLatestLinkedinConversationsRecruiterRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetMyLatestLinkedinConversationsRecruiterResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_my_latest_linkedin_conversations_recruiter
      x-gtm-mcp-mount: linkedin.recruiter
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: search
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: self_account_sync
  /api/linkedin-conversations/get-my-latest-sales-nav:
    post:
      operationId: get_my_latest_linkedin_conversations_sales_nav
      summary: Get my latest Sales Navigator conversations
      description: |-
        Sales Navigator variant of get_my_latest_linkedin_conversations: always-fresh head read of the SN thread list for one account (§5.8 refresh-then-return). Same hard-429 guards; returns messenger_type='sales_navigator' rows. Runs through the account's browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account's overdue syncs.

        Contract:
        - MCP tool `get_my_latest_linkedin_conversations_sales_nav`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `search`.
        - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_conversations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetMyLatestLinkedinConversationsSalesNavRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetMyLatestLinkedinConversationsSalesNavResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_my_latest_linkedin_conversations_sales_nav
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: search
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: self_account_sync
  /api/linkedin-conversations/metrics:
    post:
      operationId: get_linkedin_conversations_metrics
      summary: Get LinkedIn conversations metrics
      description: |-
        Period-bound conversation aggregates for one account (new_conversations_count, active_count) with an optional group_by axis. Requires period {from,to} (≤ 90 days) and filter.linkedin_account_sid - that is the ONLY filter axis the aggregation applies, unlike search. Returns the counts block alongside.

        Contract:
        - MCP tool `get_linkedin_conversations_metrics`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `metrics`, response envelope `metrics`.
        - Flags: read only.
      tags:
        - linkedin_conversations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetLinkedinConversationsMetricsRequest"
      responses:
        "200":
          description: "`metrics` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinConversationsMetricsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_conversations_metrics
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: metrics
      x-gtm-envelope: metrics
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-conversations/search:
    post:
      operationId: search_linkedin_conversations
      summary: Search LinkedIn conversations
      description: |-
        List LinkedIn message threads for the team across both messenger surfaces (basic LinkedIn + Sales Navigator) with operator-object filters (account, contact ids, conversation_hash = LinkedIn's own 2-…== thread id, messenger_type, event-count, activity / message-sync clock ranges), sort, cursor pagination, and include[] for the parent account and the last 50 messages. Live rows by default; page_size:0 for count-only. Given a thread id by the user, look it up with filter.filter {"conversation_hash": {"eq": "<hash>"}}: q is a nickname LIKE and will not find it.

        Contract:
        - MCP tool `search_linkedin_conversations`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_conversations
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinConversationsRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinConversationsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_conversations
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: search
      x-gtm-envelope: search
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-conversations/sync-my-linkedin-conversations:
    post:
      operationId: sync_my_linkedin_conversations
      summary: Sync my LinkedIn conversations
      description: |-
        Start a background sync run that reconciles the full basic-LinkedIn-messenger thread directory for one account. ASYNC: returns a pending ref (sync_run_sid) to poll; changed threads have their messages pulled inline. Use for initial backfill / full reconciliation; for a fresh inbox head use get_my_latest_linkedin_conversations.

        Contract:
        - MCP tool `sync_my_linkedin_conversations`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action_async`.
        - Flags: none.
      tags:
        - linkedin_conversations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SyncMyLinkedinConversationsRequest"
      responses:
        "200":
          description: "`action_async` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SyncMyLinkedinConversationsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: sync_my_linkedin_conversations
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: action_async
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-conversations/sync-my-recruiter-conversations:
    post:
      operationId: sync_my_recruiter_conversations
      summary: Sync my Recruiter conversations
      description: |-
        Start a background sync run that reconciles the LinkedIn Recruiter inbox (the talent mailbox a recruiter seat owns) for one account: messenger_type='recruiter' threads with the candidate's recruiter_id, their messages drained inline. ASYNC: returns a pending ref to poll. Needs a Recruiter seat on the account AND its stamped seat number (422 recruiter_required / recruiter_seat_unresolvable otherwise; check_linkedin_account_premium_subscription with checks: ['recruiter'] refreshes both). Walks the INBOX tab and then UNRESOLVED (a thread this seat opened sits there until the candidate replies), never ARCHIVED or SCHEDULED. Separate sync_type and cadence from the two other messengers.

        Contract:
        - MCP tool `sync_my_recruiter_conversations`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.recruiter`.
        - Operation `action`, response envelope `action_async`.
        - Flags: none.
      tags:
        - linkedin_conversations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SyncMyRecruiterConversationsRequest"
      responses:
        "200":
          description: "`action_async` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SyncMyRecruiterConversationsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: sync_my_recruiter_conversations
      x-gtm-mcp-mount: linkedin.recruiter
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: action_async
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-conversations/sync-my-sales-navigator-conversations:
    post:
      operationId: sync_my_sales_navigator_conversations
      summary: Sync my Sales Navigator conversations
      description: |-
        Start a background sync run that reconciles the full Sales Navigator thread directory for one account. ASYNC: returns a pending ref to poll. Separate sync_type and cadence from the basic-LinkedIn sync so SN-only lanes never touch basic-messenger rate limits.

        Contract:
        - MCP tool `sync_my_sales_navigator_conversations`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action_async`.
        - Flags: none.
      tags:
        - linkedin_conversations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SyncMySalesNavigatorConversationsRequest"
      responses:
        "200":
          description: "`action_async` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SyncMySalesNavigatorConversationsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: sync_my_sales_navigator_conversations
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: action_async
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-conversations/{sid}:
    get:
      operationId: get_linkedin_conversation
      summary: Get LinkedIn conversation
      description: |-
        Fetch one conversation by sid: the stored row including the denormalized participants list. Stored-DB read: no plugin call, no limit spend.

        Contract:
        - MCP tool `get_linkedin_conversation`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `get`, response envelope `get`.
        - Flags: read only.
      tags:
        - linkedin_conversations
      parameters:
        - name: sid
          in: path
          required: true
          description: Path segment `{sid}`.
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_cv_
        - name: include[]
          in: query
          required: false
          description: Query parameter `include`.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - linkedin_account
                - last_messages
      responses:
        "200":
          description: "`get` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinConversationResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_conversation
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: get
      x-gtm-envelope: get
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: trivial
  /api/linkedin-conversations/{sid}/add-participants:
    post:
      operationId: add_linkedin_conversation_participants
      summary: Add conversation participants
      description: |-
        Add one or more members to an existing thread on LinkedIn (outward action). Pass the conversation sid + participant_ln_ids (1..20 bare LinkedIn profile ids, the ACoA... ln_id of a connection or conversation participant; never a urn: string, the SDK wraps the id itself and a URN is wrapped twice and refused); a 1:1 thread is promoted to a group. item is the stored thread as it was before the call (the participant list follows on the next inbox sync); result carries status success and the activity_log_sid of the call. A LinkedIn refusal is a typed error (409 linkedin_refused, or the account-level 409 / 422 codes), never a success with a failed status.

        Contract:
        - MCP tool `add_linkedin_conversation_participants`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_conversations
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn conversation sid (ln_cv_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_cv_
            description: LinkedIn conversation sid (ln_cv_…).
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AddLinkedinConversationParticipantsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AddLinkedinConversationParticipantsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: add_linkedin_conversation_participants
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: true
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: messaging_general
  /api/linkedin-conversations/{sid}/delete-on-linkedin:
    post:
      operationId: delete_linkedin_conversation_on_linkedin
      summary: Delete conversation on LinkedIn
      description: |-
        Delete one thread from this account's OWN LinkedIn mailbox (wire delete-conversation, matrix row 110). Counterpart mailboxes keep their full copies and no message is recalled: the opposite blast radius of delete_linkedin_message_on_linkedin, which recalls ONE message for everyone. Irreversible on the wire (LinkedIn resurrects the thread only when a counterpart writes again), so not a mass action. Pass the conversation sid; the LinkedIn-side delete runs first and the stored row is soft-deleted only on a confirmed success (the next sync converges to the same state). Voyager basic messenger only: a Sales Navigator thread is refused 422 messenger_type_mismatch, a thread not yet synced to its real 2-... hash is refused 422 conversation_not_deletable, an already deleted one 422 conversation_deleted. Spends the messaging_general bucket.

        Contract:
        - MCP tool `delete_linkedin_conversation_on_linkedin`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_conversations
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn conversation sid (ln_cv_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_cv_
            description: LinkedIn conversation sid (ln_cv_…).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeleteLinkedinConversationOnLinkedinResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: delete_linkedin_conversation_on_linkedin
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: true
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: messaging_general
  /api/linkedin-conversations/{sid}/mark-read:
    post:
      operationId: mark_linkedin_conversation_read
      summary: Mark conversation read
      description: |-
        Mark a conversation thread as read on LinkedIn's side (outward action). LinkedIn-side effect only, no stored read-state changes; the audit rides an activity-log row. Idempotent; safe to retry.

        Contract:
        - MCP tool `mark_linkedin_conversation_read`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_conversations
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn conversation sid (ln_cv_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_cv_
            description: LinkedIn conversation sid (ln_cv_…).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MarkLinkedinConversationReadResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: mark_linkedin_conversation_read
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: true
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: messaging_general
  /api/linkedin-conversations/{sid}/mark-unread:
    post:
      operationId: mark_linkedin_conversation_unread
      summary: Mark conversation unread
      description: |-
        Mark a conversation thread as unread on LinkedIn's side (outward action), the hand-back-to-human signal after an agent triaged a thread. LinkedIn-side effect only; no stored read-state changes.

        Contract:
        - MCP tool `mark_linkedin_conversation_unread`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_conversations
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn conversation sid (ln_cv_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_cv_
            description: LinkedIn conversation sid (ln_cv_…).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MarkLinkedinConversationUnreadResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: mark_linkedin_conversation_unread
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: true
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: messaging_general
  /api/linkedin-conversations/{sid}/mute:
    post:
      operationId: mute_linkedin_conversation
      summary: Mute conversation
      description: |-
        Mute or unmute one thread's notifications on LinkedIn (outward action). Pass the conversation sid + mute (true = mute, default; false = unmute); the change is dispatched to LinkedIn and mirrored on the stored row.

        Contract:
        - MCP tool `mute_linkedin_conversation`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_conversations
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn conversation sid (ln_cv_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_cv_
            description: LinkedIn conversation sid (ln_cv_…).
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/MuteLinkedinConversationRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MuteLinkedinConversationResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: mute_linkedin_conversation
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: true
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: messaging_general
  /api/linkedin-conversations/{sid}/remove-participants:
    post:
      operationId: remove_linkedin_conversation_participants
      summary: Remove conversation participants
      description: |-
        Remove one or more members from a group thread on LinkedIn (outward action). Pass the conversation sid + participant_ln_ids (1..20 bare LinkedIn profile ids, the ACoA... ln_id; never a urn: string, the SDK wraps the id itself). item is the stored thread as it was before the call (the participant list follows on the next inbox sync); result carries status success and the activity_log_sid of the call. A LinkedIn refusal is a typed error (409 linkedin_refused, or the account-level 409 / 422 codes), never a success with a failed status.

        Contract:
        - MCP tool `remove_linkedin_conversation_participants`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_conversations
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn conversation sid (ln_cv_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_cv_
            description: LinkedIn conversation sid (ln_cv_…).
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RemoveLinkedinConversationParticipantsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RemoveLinkedinConversationParticipantsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: remove_linkedin_conversation_participants
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: true
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: messaging_general
  /api/linkedin-conversations/{sid}/rename:
    post:
      operationId: rename_linkedin_conversation
      summary: Rename conversation
      description: |-
        Rename a group thread on LinkedIn (outward action). Pass the conversation sid + the new title (1..256 chars). Group threads only: LinkedIn refuses a 1:1 thread, and that refusal is a typed error (409 linkedin_refused), never a success with a failed status. item is the stored thread as it was before the call (the title follows on the next inbox sync); result carries status success and the activity_log_sid of the call.

        Contract:
        - MCP tool `rename_linkedin_conversation`, registry package `mcp.linkedin/linkedin_conversations`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_conversations
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn conversation sid (ln_cv_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_cv_
            description: LinkedIn conversation sid (ln_cv_…).
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RenameLinkedinConversationRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RenameLinkedinConversationResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: rename_linkedin_conversation
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_conversations
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: true
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: messaging_general
  /api/linkedin-custom/execute:
    post:
      operationId: execute_linkedin_custom_request
      summary: Execute custom LinkedIn request (escape hatch)
      description: |-
        ESCAPE HATCH: issue one arbitrary LinkedIn HTTP call (url + GET/POST + headers/body) under a chosen OWN account, for endpoints the typed methods do not cover. May be a read or an action (apply to a job, attend an event), so you own the semantics. High-risk: admin-gated + feature-flagged; the url must match the server host allowlist (else 403 forbidden_endpoint). OWN-ACCOUNT ONLY: linkedin_account_sid is REQUIRED. It spends the account's custom_request bucket, which returns 429 when saturated. A non-2xx response is still a successful dispatch (ok=false, status_code carries it; never throws). The response comes back inline, NOT stored; the audit is the linkedin-account-activity-log row (action_type=custom_request). PREFER TYPED METHODS FIRST: searches/lists → linkedin-scraping; one profile/company/post's own data → linkedin-enrichment; sends/invites/reactions/comments → messaging & networking. Never use it to route around a rate limit or a missing permission.

        Contract:
        - MCP tool `execute_linkedin_custom_request`, registry package `mcp.linkedin/linkedin_custom_requests`, mount `linkedin.platform`.
        - 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 `custom_request` 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_custom_requests
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ExecuteLinkedinCustomRequestRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ExecuteLinkedinCustomRequestResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: execute_linkedin_custom_request
      x-gtm-mcp-mount: linkedin.platform
      x-gtm-entity: linkedin_custom_requests
      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: complex
      x-gtm-paced-bucket: custom_request
  /api/linkedin-enrichment/company-lite-profile:
    post:
      operationId: enrich_linkedin_company_lite_profile
      summary: Enrich company lite profile
      description: |-
        The cheap company read: id, vanity, name and logo, nothing else. Deliberately sparse, the company twin of the lite person profile. Use it to confirm a company exists and to pin its identifiers before joining data; use enrich_linkedin_company_profile when you actually need industry, size, HQ or the about text. cached 7d. COST NOTE: a /company/<slug>/ URL is ONE small request on LinkedIn's side, while a Sales Navigator /sales/company/<id> URL costs TWO, because the vanity has to be resolved first (measured: 433 ms vs 2479 ms). Prefer the vanity URL, or resolve the id once with enrich_linkedin_company_public_identifier and reuse it.

        Contract:
        - MCP tool `enrich_linkedin_company_lite_profile`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinCompanyLiteProfileRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinCompanyLiteProfileResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_company_lite_profile
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/company-posts:
    post:
      operationId: enrich_linkedin_company_posts
      summary: Enrich company posts
      description: |-
        The company page's own feed, newest-first: the company-side twin of person-posts (author = the company page). Addressed by NUMERIC company id, nested: {company:{company_ln_id}}. If all you have is a company URL or slug, call enrich_linkedin_company_profile first and take company_id off its result; passing {company:{company_url}} here validates and is then refused not_dispatchable, having still opened a ledger row. cached 7d, paginated.

        Contract:
        - MCP tool `enrich_linkedin_company_posts`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinCompanyPostsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinCompanyPostsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_company_posts
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/company-profile:
    post:
      operationId: enrich_linkedin_company_profile
      summary: Enrich company profile
      description: |-
        One company page's own data: name, industry, size, HQ, about, website, followers. URL-addressed (ledgered input_kind='url'). cached 7d. To LIST a company's people use scraping (company-employees / company-decision-makers).

        Contract:
        - MCP tool `enrich_linkedin_company_profile`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinCompanyProfileRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinCompanyProfileResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_company_profile
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/company-public-identifier:
    post:
      operationId: enrich_linkedin_company_public_identifier
      summary: Resolve company vanity
      description: |-
        Resolve a numeric LinkedIn company id to its vanity slug. Its own method because this resolution is the single most expensive company request LinkedIn serves: a ~164KB organizational-page download, the only id-native request that reveals the vanity. Cached 30d, since the mapping does not change. The pattern that keeps company work cheap: resolve the id ONCE here, then call every other company read by vanity.

        Contract:
        - MCP tool `enrich_linkedin_company_public_identifier`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinCompanyPublicIdentifierRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinCompanyPublicIdentifierResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_company_public_identifier
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/get-activity-urn-by-url:
    post:
      operationId: enrich_linkedin_get_activity_urn_by_url
      summary: Enrich activity URN by URL
      description: |-
        Resolve any linkedin.com post URL (feed permalink, /posts/ slug) or lnkd.in shortlink to its stable activity URN (urn:li:activity:…). A shortlink is expanded server-side before the page is opened. The URN never changes, so this is a cacheable enrichment lookup at cached 7d. It is the resolver the get-post-* / tracked-post flows build on. Returns activity_urn (null if the URL could not be resolved - notably a shortlink of a ugcPost-threaded post, whose page exposes no activity urn at all; address such posts by post_urn via enrich_linkedin_post_details instead, which takes the shortlink directly).

        Contract:
        - MCP tool `enrich_linkedin_get_activity_urn_by_url`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinGetActivityUrnByUrlRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinGetActivityUrnByUrlResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_get_activity_urn_by_url
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-basic-profile:
    post:
      operationId: enrich_linkedin_person_basic_profile
      summary: Enrich person basic profile
      description: |-
        The middle person read, between the lite identity stub and the full dossier: name PARTS (first / last, which no other read splits out), headline, country and display location, profile and background imagery, and the premium / influencer / creator / verified flags. One request, cached 24h. Reach for this when you want to know WHO someone is without pulling the experience and education cards you will not read. Addressed by public_identifier ONLY: the underlying query keys on the vanity slug, so a urn-only call is refused before any browser work (resolve the slug with enrich_linkedin_person_lite_profile first). NOTE primary_language and supported_languages are the profile's LOCALE settings, i.e. which language the profile is written in. They are NOT the Languages section and carry no proficiency; do not read them as 'this person speaks these languages'.

        Contract:
        - MCP tool `enrich_linkedin_person_basic_profile`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonBasicProfileRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonBasicProfileResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_basic_profile
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-certifications:
    post:
      operationId: enrich_linkedin_person_certifications
      summary: Enrich person certifications
      description: |-
        Licenses and certifications from the target profile: issuing authority, license number, validity window. A qualification and compliance signal for recruiting and technical ICP fit. cached 7d. Most profiles have NONE, so an empty list is a real answer about the person rather than a failed read. license_number and url are frequently null even on real entries (LinkedIn own certifications carry neither). Address by profile_id XOR public_identifier, the same exactly-one-of rule as every other person read: passing both is a 422, they prohibit each other. The screen behind this one is the exception that needs the vanity slug AND the member urn at once, so the backend resolves whichever half you did not send. Addressing by public_identifier skips even that resolve once this team has enriched the person before, because the urn is then already on an earlier ledger row.

        Contract:
        - MCP tool `enrich_linkedin_person_certifications`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonCertificationsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonCertificationsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_certifications
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-comment-activity:
    post:
      operationId: enrich_linkedin_person_comment_activity
      summary: Enrich person comment activity
      description: |-
        The target's recent comments across OTHER people's posts (activity feed, Comments tab): where the target spends attention, and warm entry points for an opener. Each item carries the PARENT POST too, so you can read what they were reacting to without a second call. cached 7d, paginated. Addressed by profile_id alone. PAGING: the end of the feed is a MISSING paging.next_page_cursor, never an empty page, because member filtering can empty a page mid-feed; there is no total, LinkedIn reports 0 for this feed whatever is in it. The target's OWN posts are person-posts; the commenters OF a post are scraping.

        Contract:
        - MCP tool `enrich_linkedin_person_comment_activity`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonCommentActivityRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonCommentActivityResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_comment_activity
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-contact-info:
    post:
      operationId: enrich_linkedin_person_contact_info
      summary: Enrich person contact info
      description: |-
        Contact details for ONE person: email, phones (typed, so HOME/WORK is kept, unlike the lossy flat `phone` on person-full-profile), websites and twitter handles. Cached 24h. IMPORTANT: LinkedIn reveals contacts to 1st-degree connections ONLY, so this runs from whichever of YOUR accounts is connected to the target (picked automatically, respecting limits; linkedin_account_sid is only a preference). If none of your accounts is connected it refuses 422 no_connected_account, so connect first (linkedin_connection_requests send), then retry after the invite is accepted. An empty block means the connected account still cannot see them.

        Contract:
        - MCP tool `enrich_linkedin_person_contact_info`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonContactInfoRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonContactInfoResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_contact_info
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-education:
    post:
      operationId: enrich_linkedin_person_education
      summary: Enrich person education
      description: |-
        Education history only, a subset projection of the full-profile wire call (NOT a stub: shares get-full-profile, no dedicated verb). cached 7d under its own method key (a cached full profile does NOT satisfy it). Not paginated. public_identifier passes straight through (native slug support).

        Contract:
        - MCP tool `enrich_linkedin_person_education`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonEducationRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonEducationResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_education
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-experience:
    post:
      operationId: enrich_linkedin_person_experience
      summary: Enrich person experience
      description: |-
        Complete, paginated work history ("Show all experiences"), unlike the truncated head on full-profile. One call = one page; loop cursor until paging.next_page_cursor is absent. cached 7d. A public_identifier-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable. On the connected account's OWN profile each entry also carries position_id, the key of the position editing verbs.

        Contract:
        - MCP tool `enrich_linkedin_person_experience`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonExperienceRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonExperienceResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_experience
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-featured:
    post:
      operationId: enrich_linkedin_person_featured
      summary: Enrich person featured
      description: |-
        The Featured section: what the target chose to pin (posts, links, media). Small, cheap, high-signal for personalization: pinned content is what the person WANTS noticed. cached 7d. Not paginated. A public_identifier-only call needs a stored URN.

        Contract:
        - MCP tool `enrich_linkedin_person_featured`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonFeaturedRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonFeaturedResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_featured
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-full-profile:
    post:
      operationId: enrich_linkedin_person_full_profile
      summary: Enrich person full profile
      description: |-
        The complete person dossier: identity, headline/position/company, location, about, follower/connection counts, premium/verification flags, plus truncated heads of experience/education/skills/recent posts. cached 24h. One full profile beats separate subset calls when you need profile + 2 or more sections. Full sub-record lists still need the dedicated paginated methods. picture_url is normalized to avatar_url.

        Contract:
        - MCP tool `enrich_linkedin_person_full_profile`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonFullProfileRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonFullProfileResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_full_profile
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-interests:
    post:
      operationId: enrich_linkedin_person_interests
      summary: Enrich person interests
      description: |-
        ONE tab of the Interests section per call: top_voices (the default), companies, groups, newsletters or schools. Cheap ICP-fit and conversation-hook signal. cached 7d, paginated. The wire pages a single tab, so reading all five spends the method five times; the requested tab is echoed at result.tab so a caller looping the vocabulary can tell the responses apart. Addressed by public_identifier ONLY: a urn-only call is ledgered and then refused not_dispatchable, so run person-lite-profile first if all you have is the urn.

        Contract:
        - MCP tool `enrich_linkedin_person_interests`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonInterestsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonInterestsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_interests
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-languages:
    post:
      operationId: enrich_linkedin_person_languages
      summary: Enrich person languages
      description: |-
        The Languages section: spoken languages with self-declared proficiency. Cheap localization signal: write the opener in the prospect's native language. cached 7d. Most profiles declare NONE, so an empty list is a real answer about the person rather than a failed read. proficiency is the RAW string LinkedIn renders, suffix included ("Native or bilingual proficiency", "Full professional proficiency", ...), localized on non-English sessions and null when the member declared the language without a level. Address by profile_id XOR public_identifier; like certifications, the screen behind this one needs the vanity slug AND the member urn at once, so the backend resolves whichever half you did not send.

        Contract:
        - MCP tool `enrich_linkedin_person_languages`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonLanguagesRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonLanguagesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_languages
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-lite-profile:
    post:
      operationId: enrich_linkedin_person_lite_profile
      summary: Enrich person lite profile
      description: |-
        Cheapest person read: existence check + full identifier resolution. THE tool for turning a vanity slug (/in/…) or a bare URN into the canonical identifier quad (ln_member_id + both URNs + nickname) that every deeper enrich and stored-domain join keys on. cached 24h. Pin linkedin_account_sid and the relationship degree comes back with it in network_distance, which saves the second dispatch to linkedin-connections.check-degree; without a pinned account that field is null, because a degree relative to an account you did not name is not an answer. Address by profile_id XOR public_identifier.

        Contract:
        - MCP tool `enrich_linkedin_person_lite_profile`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonLiteProfileRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonLiteProfileResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_lite_profile
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-posts:
    post:
      operationId: enrich_linkedin_person_posts
      summary: Enrich person posts
      description: |-
        Posts authored or reshared by the target, newest-first: the personalization goldmine before outreach. Reshares carry the original in reshared_post; created_at is ISO 8601. cached 7d. This is the target's OWN feed; to harvest who ENGAGED with a post use the scraping surface. A public_identifier-only call needs a stored URN.

        Contract:
        - MCP tool `enrich_linkedin_person_posts`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonPostsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonPostsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_posts
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-reaction-activity:
    post:
      operationId: enrich_linkedin_person_reaction_activity
      summary: Enrich person reaction activity
      description: |-
        The target's recent reactions on OTHER people's posts (activity feed, Reactions tab): topical interest signal, cheaper to act on than comments. Each item carries the reaction type, when they reacted, and the PARENT POST whole. cached 7d, paginated. Addressed by profile_id alone. PAGING: the end of the feed is a MISSING paging.next_page_cursor, never an empty page; there is no total, LinkedIn reports 0 for this feed whatever is in it. reaction_type is null when the header phrase did not map, which is normal. The reactors OF a post are scraping (get-post-reactors).

        Contract:
        - MCP tool `enrich_linkedin_person_reaction_activity`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonReactionActivityRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonReactionActivityResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_reaction_activity
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-recommendations:
    post:
      operationId: enrich_linkedin_person_recommendations
      summary: Enrich person recommendations
      description: |-
        Recommendations on the target profile: who vouches for them and in what words. `direction` picks received (the default, what LinkedIn opens on) or given; these are two SEPARATE reads of the same screen, so asking for both runs the method twice. cached 7d. The counterpart carries a nickname, name, headline and network distance but NO ln_id: LinkedIn does not put the member urn in this payload, so enrich the nickname separately if you need the urn. created_at is parsed out of the free-text context line and is null when that line has no date. Address by profile_id XOR public_identifier, the same exactly-one-of rule as every other person read: passing both is a 422, they prohibit each other. The screen behind this one is the exception that needs the vanity slug AND the member urn at once, so the backend resolves whichever half you did not send.

        Contract:
        - MCP tool `enrich_linkedin_person_recommendations`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonRecommendationsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonRecommendationsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_recommendations
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-services:
    post:
      operationId: enrich_linkedin_person_services
      summary: Enrich person services
      description: |-
        The "Providing services" marketplace page of one service-provider profile: business name, pricing line, page URL and the standardized services they list. Complements scraping-side search-service-providers (that discovers providers, this reads one provider's own page). cached 7d, no pagination. result.services is NULL when the member sells no services at all, which is a different fact from a page whose services_provided is empty, and both are a normal completed read. A page its owner has UNPUBLISHED reads as null too (LinkedIn drops the link the read follows), which looks the same as never having had one.

        Contract:
        - MCP tool `enrich_linkedin_person_services`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonServicesRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonServicesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_services
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/person-skills:
    post:
      operationId: enrich_linkedin_person_skills
      summary: Enrich person skills
      description: |-
        Complete, paginated skills list ("Show all skills") with endorsement counts (skill_id is the endorse handle). cached 7d. Use to see/reason over skills; to simply ENDORSE, use linkedin-accounts.endorse-skill (auto-discovers skills, no enrich call needed). A public_identifier-only call needs a stored URN.

        Contract:
        - MCP tool `enrich_linkedin_person_skills`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPersonSkillsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPersonSkillsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_person_skills
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-enrichment/post-details:
    post:
      operationId: enrich_linkedin_post_details
      summary: Enrich post details
      description: |-
        One post's own data by its urn: full text, author, media, engagement counters, per-reaction breakdown, is_reshare with the original post embedded. LIVE since 2026-08-14 (node get-post). Accepts post_urn XOR url. result.post is null when the post is deleted or unavailable - a delivered answer, not an error, so do not retry it. Cached 7d. WHO engaged is scraping (get-post-comments / get-post-reactors / get-post-resharers); impressions exist only on the executor's own posts.

        Contract:
        - MCP tool `enrich_linkedin_post_details`, registry package `mcp.linkedin/linkedin_enrichment`, mount `linkedin.enrichment`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `enrichment` 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_enrichment
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EnrichLinkedinPostDetailsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EnrichLinkedinPostDetailsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: enrich_linkedin_post_details
      x-gtm-mcp-mount: linkedin.enrichment
      x-gtm-entity: linkedin_enrichment
      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: enrichment
  /api/linkedin-followers/get-my-latest:
    post:
      operationId: get_my_latest_linkedin_followers
      summary: Get my latest followers
      description: |-
        Always-fresh head read of the followers list: refresh the newest from LinkedIn in-request (§5.8), then return the last N (created_at DESC) with a counts block. The first page (cursor null) triggers the refresh; continuation pages read the already-refreshed DB. Account-scoped. Runs through the account's browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account's overdue syncs.

        Contract:
        - MCP tool `get_my_latest_linkedin_followers`, registry package `mcp.linkedin/linkedin_followers`, mount `linkedin.network`.
        - Operation `action`, response envelope `search`.
        - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_followers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetMyLatestLinkedinFollowersRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetMyLatestLinkedinFollowersResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_my_latest_linkedin_followers
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_followers
      x-gtm-operation: action
      x-gtm-envelope: search
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: self_account_sync
  /api/linkedin-followers/metrics:
    post:
      operationId: get_linkedin_followers_metrics
      summary: LinkedIn followers metrics
      description: |-
        Period-bound audience aggregates over a filtered follower set. Requires period {from,to}. Returns followers_growth, follower_to_connection_conversions and connected_follower_share. Optional filter and a single group_by axis (linkedin_account_sid).

        Contract:
        - MCP tool `get_linkedin_followers_metrics`, registry package `mcp.linkedin/linkedin_followers`, mount `linkedin.network`.
        - Operation `metrics`, response envelope `metrics`.
        - Flags: read only.
      tags:
        - linkedin_followers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetLinkedinFollowersMetricsRequest"
      responses:
        "200":
          description: "`metrics` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinFollowersMetricsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_followers_metrics
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_followers
      x-gtm-operation: metrics
      x-gtm-envelope: metrics
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-followers/search:
    post:
      operationId: search_linkedin_followers
      summary: Search LinkedIn followers
      description: |-
        List stored followers of team accounts with filters, sorting, cursor pagination and filter.q, a LIKE (substring) over the follower name. Returns a counts block. include[] can eager-load linkedin_account plus the funnel probes linkedin_connection / linkedin_connection_request; both absent means a warm, untouched prospect.

        Contract:
        - MCP tool `search_linkedin_followers`, registry package `mcp.linkedin/linkedin_followers`, mount `linkedin.network`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_followers
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinFollowersRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinFollowersResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_followers
      x-gtm-mcp-mount: linkedin.network
      x-gtm-entity: linkedin_followers
      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
  /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
  /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
  /api/linkedin-messages/check-sent:
    post:
      operationId: check_linkedin_message_sent
      summary: Check whether a LinkedIn message went out
      description: |-
        Ask what a LinkedIn message send came to, without sending: by the client_reference it went out under (optionally at one place: linkedin_conversation_sid, ln_member_id or profile_urn), or by the activity_log_sid a 409 named. result.outcome: sent (item is the message, or null with reason message_row_pending or caller_confirmed), in_flight, unknown (the thread has not shown it yet; retry_after, send_decisive_at), or not_sent (no_send_under_key, refused, not_in_thread, caller_confirmed). Send the same request again only on not_sent, under the same key. result.activity_log_sid is the attempt a person's word names (confirmed_not_sent / confirmed_sent on the send tools). A send in doubt has its thread read now when a look is due, so a call can be slow. A key sent to several places is 422 place_required, a place in another form than the sends recorded 422 place_unmatched (context.places). Invitations: check_linkedin_connection_request_sent; comments, posts, reposts: check_linkedin_posting_sent.

        Contract:
        - MCP tool `check_linkedin_message_sent`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: none.
      tags:
        - linkedin_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CheckLinkedinMessageSentRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CheckLinkedinMessageSentResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: check_linkedin_message_sent
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      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: complex
  /api/linkedin-messages/download-attachment:
    post:
      operationId: download_linkedin_message_attachment
      summary: Download message attachment
      description: |-
        Download one inbound attachment of a basic-messenger message, returned inline as a base64 data_url (nothing is persisted, no row changes). This verb is addressed by RAW LinkedIn ids, not by our message sid, so assemble it from a message row you already hold (search_linkedin_messages): linkedin_account_sid = that row's linkedin_account_sid; message_id = that row's message_hash (must be the 2-… form); attachment_urn = attachments[i].urn on the same row. profile_id is the ACTING account's own LinkedIn URN: read ln_id off that linkedin_account_sid via search_linkedin_accounts, NOT the other party's URN. 120 s budget, up to ~50 MB; spends the messaging_general bucket.

        Contract:
        - MCP tool `download_linkedin_message_attachment`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: read only; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DownloadLinkedinMessageAttachmentRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DownloadLinkedinMessageAttachmentResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: download_linkedin_message_attachment
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      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: messaging_general
  /api/linkedin-messages/download-sales-nav-attachment:
    post:
      operationId: download_linkedin_sales_nav_message_attachment
      summary: Download Sales Navigator attachment
      description: |-
        Sales Navigator variant of download_linkedin_message_attachment: one inbound attachment of an SN message, inline as a base64 data_url. Same raw-id addressing, one field fewer (the SN wire verb takes no profile_id): linkedin_account_sid must be an account with Sales Navigator, message_id is the message row's message_hash, attachment_urn is attachments[i].urn on that row. The row must be messenger_type='sales_navigator' (an account without SN is refused before dispatch). Same 120 s budget and messaging_general bucket.

        Contract:
        - MCP tool `download_linkedin_sales_nav_message_attachment`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: read only; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DownloadLinkedinSalesNavMessageAttachmentRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DownloadLinkedinSalesNavMessageAttachmentResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: download_linkedin_sales_nav_message_attachment
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      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: messaging_general
  /api/linkedin-messages/get-my-latest:
    post:
      operationId: get_my_latest_linkedin_messages
      summary: Get my latest LinkedIn messages
      description: |-
        Always-fresh head read of ONE basic-messenger thread (§5.8 refresh of that conversation from LinkedIn, then the last N messages, sent_at DESC). Never stale: it 429s with bucket_saturated / sync_in_progress. Use before drafting a reply; use search_linkedin_messages for stored history. Runs through the account's browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account's overdue syncs.

        Contract:
        - MCP tool `get_my_latest_linkedin_messages`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `search`.
        - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetMyLatestLinkedinMessagesRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetMyLatestLinkedinMessagesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_my_latest_linkedin_messages
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      x-gtm-operation: action
      x-gtm-envelope: search
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: self_account_sync
  /api/linkedin-messages/get-my-latest-recruiter:
    post:
      operationId: get_my_latest_linkedin_messages_recruiter
      summary: Get my latest Recruiter messages
      description: |-
        LinkedIn Recruiter variant of get_my_latest_linkedin_messages: always-fresh head read of ONE recruiter thread's messages (§5.8 refresh-then-return over the talent wire, dispatched with the account's seat). Requires a messenger_type='recruiter' conversation (a 422 messenger_type_mismatch names the right tool otherwise) and a Recruiter seat with its stamped seat number; same hard-429 guards. Rows: linkedin_type='inmail', type outbox for the seat's own messages and inbox for the candidate's. Runs through the account's browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account's overdue syncs.

        Contract:
        - MCP tool `get_my_latest_linkedin_messages_recruiter`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.recruiter`.
        - Operation `action`, response envelope `search`.
        - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetMyLatestLinkedinMessagesRecruiterRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetMyLatestLinkedinMessagesRecruiterResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_my_latest_linkedin_messages_recruiter
      x-gtm-mcp-mount: linkedin.recruiter
      x-gtm-entity: linkedin_messages
      x-gtm-operation: action
      x-gtm-envelope: search
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: self_account_sync
  /api/linkedin-messages/get-my-latest-sales-nav:
    post:
      operationId: get_my_latest_linkedin_messages_sales_nav
      summary: Get my latest Sales Navigator messages
      description: |-
        Sales Navigator variant of get_my_latest_linkedin_messages: always-fresh head read of ONE SN thread's messages (§5.8 refresh-then-return). Requires a messenger_type='sales_navigator' conversation; same hard-429 guards. Runs through the account's browser: a stopped or idle one is cold-started first (about 50 s, or 503 browser_starting), which also releases that account's overdue syncs.

        Contract:
        - MCP tool `get_my_latest_linkedin_messages_sales_nav`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `search`.
        - Flags: paced: a call spends the `self_account_sync` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetMyLatestLinkedinMessagesSalesNavRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetMyLatestLinkedinMessagesSalesNavResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_my_latest_linkedin_messages_sales_nav
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      x-gtm-operation: action
      x-gtm-envelope: search
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: self_account_sync
  /api/linkedin-messages/metrics:
    post:
      operationId: get_linkedin_messages_metrics
      summary: Get LinkedIn messages metrics
      description: |-
        Period-bound message aggregates for one account (reply_rate_pct, avg_time_to_reply_seconds, avg_thread_depth) with an optional group_by axis. Requires period {from,to} (≤ 90 days) and filter.linkedin_account_sid - that is the ONLY filter axis the aggregation applies, unlike search. Returns the counts block alongside.

        Contract:
        - MCP tool `get_linkedin_messages_metrics`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `metrics`, response envelope `metrics`.
        - Flags: read only.
      tags:
        - linkedin_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetLinkedinMessagesMetricsRequest"
      responses:
        "200":
          description: "`metrics` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinMessagesMetricsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_messages_metrics
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      x-gtm-operation: metrics
      x-gtm-envelope: metrics
      x-gtm-availability: ga
      x-gtm-dangerous: false
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
  /api/linkedin-messages/search:
    post:
      operationId: search_linkedin_messages
      summary: Search LinkedIn messages
      description: |-
        List LinkedIn messages (basic DM + Sales Navigator + InMail) with operator-object filters (account, conversation, channel, direction, contact ids, date ranges) and filter.q, a LIKE (substring) over body + subject (message text, not contact names). Supports include[], sort, cursor pagination. page_size:0 for count-only. To read a single message, filter by {sid:{eq:"ln_ms_…"}}.

        Contract:
        - MCP tool `search_linkedin_messages`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `search`, response envelope `search`.
        - Flags: read only.
      tags:
        - linkedin_messages
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SearchLinkedinMessagesRequest"
      responses:
        "200":
          description: "`search` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SearchLinkedinMessagesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: search_linkedin_messages
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      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
  /api/linkedin-messages/send:
    post:
      operationId: send_linkedin_message
      summary: Send LinkedIn message
      description: |-
        Send one outbound regular LinkedIn DM on the basic messenger (outward action). Reply to an existing thread via linkedin_conversation_sid, or open a new thread to a 1st-degree connection via ln_id / sn_id or by public_identifier (slug or linkedin.com/in/ URL). Guards run first: send_messages daily cap, 8000-char body cap, block guard (a member who blocked this account is refused 422 target_blocked, no browser call), connection guard, attachment https:// reachability, basic-messenger surface guard. Fire-on-success: a row only on terminal success. Sends once per client_reference and place (the thread, else the person): a repeat is answered, never sent twice; on a 409 read error.context.send_outcome, never resend under a new key. When NOT: InMail to a non-connection → send_linkedin_inmail; voice note → send_linkedin_voice_message; Sales Navigator thread → send_linkedin_sales_nav_message; the connection note lives on linkedin-connection-requests. Bulk: loop client-side within the daily cap.

        Contract:
        - MCP tool `send_linkedin_message`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; step eligible: gtm.service.orchestration can run this verb as a mass-action plan step, once per item; paced: a call spends the `send_messages` 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_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SendLinkedinMessageRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SendLinkedinMessageResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: send_linkedin_message
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      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: complex
      x-gtm-paced-bucket: send_messages
  /api/linkedin-messages/send-inmail:
    post:
      operationId: send_linkedin_inmail
      summary: Send LinkedIn InMail
      description: |-
        Send one premium InMail to a person (outward action). Person-addressed only via ln_id / sn_id, subject required (≤ 200), body ≤ 1900. Sends once per client_reference and person: a repeat is answered, never sent twice; on a 409 read error.context.send_outcome, never resend under a new key. Guards: send_inmails daily cap, Premium guard, InMail-credits guard (422 no_inmail_credits when the account's pool is known empty: the seat's grant inmail_credits with a Sales Navigator seat, premium_inmail_credits without; a balance never read does not block). Fire-on-success; the plugin's inmail_credits_remaining is written back onto that pool, and LinkedIn's own NOT_ENOUGH_INMAIL_CREDIT answers 422 no_inmail_credits and zeroes it (it is not a block of the target). When NOT: 1st-degree connection → send_linkedin_message (free); no Premium / zero credits → the guards 422; SN thread continuation → send_linkedin_sales_nav_message.

        Contract:
        - MCP tool `send_linkedin_inmail`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `send_inmails` 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_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SendLinkedinInmailRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SendLinkedinInmailResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: send_linkedin_inmail
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      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: complex
      x-gtm-paced-bucket: send_inmails
  /api/linkedin-messages/send-recruiter:
    post:
      operationId: send_linkedin_recruiter_message
      summary: Send Recruiter InMail
      description: |-
        Send one LinkedIn Recruiter InMail (outward action): open a NEW recruiter thread via recruiter_id (AEMAA… id; ln_id / sn_id work too), or reply INTO an existing thread via linkedin_conversation_sid (messenger_type='recruiter'). Guards, in order: Recruiter seat (422 recruiter_required); live Recruiter session (409 recruiter_reauth_required: only the seat holder renews Recruiter's 30-day session, by signing in again in the account's browser; tell the user, do not retry); stamped seat on a reply (422 recruiter_seat_unresolvable); LinkedIn's one InMail per candidate per 24 h (429 recruiter_inmail_cooldown, cooldown_ends_at: refresh the thread with get_my_latest_linkedin_messages_recruiter if a reply may have landed, else wait). Spends send_inmails and an InMail credit. Sends once per client_reference and place: a repeat is answered, never sent twice; on a 409 read error.context.send_outcome, never resend under a new key. When NOT: basic threads → send_linkedin_message; SN → send_linkedin_sales_nav_message.

        Contract:
        - MCP tool `send_linkedin_recruiter_message`, registry package `mcp.linkedin/linkedin_messages`, 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 `send_inmails` 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_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SendLinkedinRecruiterMessageRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SendLinkedinRecruiterMessageResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: send_linkedin_recruiter_message
      x-gtm-mcp-mount: linkedin.recruiter
      x-gtm-entity: linkedin_messages
      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: complex
      x-gtm-paced-bucket: send_inmails
  /api/linkedin-messages/send-sales-nav:
    post:
      operationId: send_linkedin_sales_nav_message
      summary: Send Sales Navigator message
      description: |-
        Send one Sales Navigator message (outward action): continue an SN thread via linkedin_conversation_sid (messenger_type=sales_navigator), or open a new one via ln_id / sn_id. Guards: send_inmails daily cap, SN seat and surface, and on a NEW thread outside the network the InMail-credits guard (422 no_inmail_credits when the seat's inmail_credits are known to be 0). Fire-on-success. Sends once per client_reference and place: a repeat is answered, never sent twice; on a 409 read error.context.send_outcome, never resend under a new key. LinkedIn's 403 SALES_SEAT_REQUIRED is a stale SN session, not a lost seat: the send re-arms it once and retries; a second refusal is 409 sales_session_stale (run check_linkedin_account_premium_subscription with checks ["sales_nav"], retry), a seat the probe finds gone 422 sales_nav_required. When NOT: basic threads → send_linkedin_message / send_linkedin_voice_message; cold InMail outside SN → send_linkedin_inmail; no SN seat is 422, so check linkedin-accounts.has_sn first.

        Contract:
        - MCP tool `send_linkedin_sales_nav_message`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `send_inmails` 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_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SendLinkedinSalesNavMessageRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SendLinkedinSalesNavMessageResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: send_linkedin_sales_nav_message
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      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: complex
      x-gtm-paced-bucket: send_inmails
  /api/linkedin-messages/send-voice:
    post:
      operationId: send_linkedin_voice_message
      summary: Send LinkedIn voice message
      description: |-
        Send one voice note on the basic LinkedIn messenger (outward action). audio arrives as a https:// url or base64 (any common format) and is normalized server-side to AAC/m4a, hard-capped at 60 s. Same guard chain as send_linkedin_message plus audio validation. Fire-on-success: a row is inserted only on terminal success; no text body. Sends once per client_reference and place (the thread, else the person): a repeat is answered, never sent twice; on a 409 read error.context.send_outcome, never resend under a new key. A keyed repeat is answered before its audio is read. When NOT: text DM → send_linkedin_message; SN threads → send_linkedin_sales_nav_message; audio longer than 60 s is rejected, so trim client-side first.

        Contract:
        - MCP tool `send_linkedin_voice_message`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `send_messages` 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_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SendLinkedinVoiceMessageRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SendLinkedinVoiceMessageResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: send_linkedin_voice_message
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      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: complex
      x-gtm-paced-bucket: send_messages
  /api/linkedin-messages/start-group:
    post:
      operationId: start_linkedin_group_conversation
      summary: Start group conversation
      description: |-
        Start a new multi-attendee (group) chat on the basic messenger and send an opening message (outward action). Provide the executor account, 2..20 attendee URNs and the opening body (1..8000 chars, optional attachments, optional conversation_title to name the group); mints the group thread and dispatches the first message. Spends the send_messages bucket. Sends once per client_reference and attendee set: a repeat is answered, never sent twice; on a 409 read error.context.send_outcome, never resend under a new key. A group has no place check_linkedin_message_sent takes: ask it by the key alone or by activity_log_sid.

        Contract:
        - MCP tool `start_linkedin_group_conversation`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `send_messages` 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_messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/StartLinkedinGroupConversationRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/StartLinkedinGroupConversationResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: start_linkedin_group_conversation
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      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: complex
      x-gtm-paced-bucket: send_messages
  /api/linkedin-messages/{sid}/delete-on-linkedin:
    post:
      operationId: delete_linkedin_message_on_linkedin
      summary: Recall message on LinkedIn
      description: |-
        Recall one of OUR OWN sent messages: it disappears for EVERY participant, not just for us. Addressed by the message sid, like react_linkedin_message. Irreversible - a wrong sid destroys a real conversation, so confirm the message first. LinkedIn allows a recall only WITHIN AN HOUR of sending; past that it refuses, so an older message comes back as 409 message_too_old_to_recall with nothing dispatched and no limit spent. The stored row is NOT removed: it stays in the thread marked is_deleted with an emptied body, which is what LinkedIn serves afterwards, so the operator still sees that something was withdrawn. Basic messenger only; an SN message, a non-2-… message_hash, or a row already marked is_deleted is refused before dispatch. Recallability is otherwise not pre-validated, so 'not yours' arrives as a wire error. Spends messaging_general, the reaction verbs' bucket.

        Contract:
        - MCP tool `delete_linkedin_message_on_linkedin`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_messages
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn message sid (ln_ms_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_ms_
            description: LinkedIn message sid (ln_ms_…).
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeleteLinkedinMessageOnLinkedinResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: delete_linkedin_message_on_linkedin
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: true
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: messaging_general
  /api/linkedin-messages/{sid}/react:
    post:
      operationId: react_linkedin_message
      summary: React to message
      description: |-
        Add or remove an emoji reaction on one stored message on LinkedIn (outward action). Pass the message sid + a reaction_type; the reaction is dispatched to LinkedIn and mirrored onto the stored row. Set remove:true to take YOUR reaction back (pass the same reaction_type you reacted with). Basic messenger only: an SN message or a non-2-… message_hash is refused before dispatch. Spends the messaging_general bucket.

        Contract:
        - MCP tool `react_linkedin_message`, registry package `mcp.linkedin/linkedin_messages`, mount `linkedin.messaging`.
        - Operation `action`, response envelope `action`.
        - Flags: dangerous: the MCP layer gates it behind a preview/commit token, and the effect cannot be undone through this API; paced: a call spends the `messaging_general` smart-limit bucket of the account it runs on, and calls of one bucket are spaced per account. A short wait is slept by the server; a longer one answers 429 `rate_limited` with `context.retry_after`, and the same call succeeds from that moment. Parallel calls on one account queue behind each other.
      tags:
        - linkedin_messages
      parameters:
        - name: sid
          in: path
          required: true
          description: LinkedIn message sid (ln_ms_…).
          schema:
            type: string
            minLength: 18
            maxLength: 18
            pattern: ^ln_ms_
            description: LinkedIn message sid (ln_ms_…).
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReactLinkedinMessageRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReactLinkedinMessageResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: react_linkedin_message
      x-gtm-mcp-mount: linkedin.messaging
      x-gtm-entity: linkedin_messages
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: true
      x-gtm-mass-action: false
      x-gtm-step-eligible: false
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: messaging_general
  /api/linkedin-posting/check-sent:
    post:
      operationId: check_linkedin_posting_sent
      summary: Check whether a LinkedIn comment, post or repost went out
      description: |-
        Ask what a LinkedIn comment, post or repost came to, without sending: by the client_reference it went out under and its verb (comment, create-post, repost), optionally at one place (entity_urn: the post a comment or a repost went to, in any of its forms, or the comment a reply answers; parent_comment_urn for a reply; post_place for a post), or by the activity_log_sid a 409 named. result.outcome: sent (item is what it made, or null with reason result_pending or caller_confirmed), in_flight, unknown (LinkedIn has not shown it yet; retry_after, send_decisive_at), or not_sent (no_send_under_key, refused, not_on_linkedin, caller_confirmed). Send the same request again only on not_sent, under the same key. result.activity_log_sid is the attempt a person's word names (confirmed_not_sent / confirmed_sent on the send). A send in doubt has LinkedIn read now when the last look is old enough. A key sent to several places is 422 place_required, a place LinkedIn could not be read for 422 place_unmatched (context.places).

        Contract:
        - MCP tool `check_linkedin_posting_sent`, registry package `mcp.linkedin/linkedin_posting`, mount `linkedin.content`.
        - Operation `action`, response envelope `action`.
        - Flags: none.
      tags:
        - linkedin_posting
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CheckLinkedinPostingSentRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CheckLinkedinPostingSentResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: check_linkedin_posting_sent
      x-gtm-mcp-mount: linkedin.content
      x-gtm-entity: linkedin_posting
      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: complex
  /api/linkedin-posting/comment:
    post:
      operationId: create_linkedin_comment
      summary: Create LinkedIn comment
      description: |-
        Leave ONE outbound comment on any LinkedIn post (wire create-comment): entity_urn takes a post urn in any family or a post URL carrying one, and the comment is written on the post's social thread (see entity_urn). Outward and fire-on-success: the post does NOT need to be tracked or owned by us. Identity-bound: linkedin_account_sid REQUIRED, spends the comment_posts bucket (30/day at a 360 s floor), saturation returns 429. Reply to an existing comment via parent_comment_urn. mentions turns exact substrings of text into clickable profile links ({profile_id, name} pairs; a name missing or out of order is a 422 with no dispatch spent). Returns the created comment ref plus the activity-log row. Sends once per client_reference and place (the post as LinkedIn files it, or the comment a reply answers): a repeat is answered, never sent twice; on a 409 read error.context.send_outcome, never resend under a new key. To react use react_linkedin_post; to resolve a post URL use get_activity_urn_by_url.

        Contract:
        - MCP tool `create_linkedin_comment`, registry package `mcp.linkedin/linkedin_posting`, 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; mass action: this verb's own request accepts a filter or targets[] set, which the owning service drains; step eligible: gtm.service.orchestration can run this verb as a mass-action plan step, once per item; paced: a call spends the `comment_posts` 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_posting
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateLinkedinCommentRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreateLinkedinCommentResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: create_linkedin_comment
      x-gtm-mcp-mount: linkedin.content
      x-gtm-entity: linkedin_posting
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: true
      x-gtm-mass-action: true
      x-gtm-step-eligible: true
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: comment_posts
  /api/linkedin-posting/create-post:
    post:
      operationId: create_linkedin_post
      summary: Create LinkedIn post
      description: |-
        Publish ONE feed post - as the member, AS a company page it administers (author_organization_id), or INTO a group (group_id) - now or scheduled (scheduled_at) - wire create-post. Public; retract with delete_linkedin_post, or delete a scheduled draft with delete_linkedin_scheduled_post. Identity-bound: linkedin_account_sid REQUIRED, spends the posting bucket (20/day in series of 3 at a 1200 s pause; free plan 4), saturation returns 429. text is REQUIRED as a key but may be an EMPTY string when media is attached; no text, images or video at all is a 422. Media: up to 20 images XOR one video, each base64 or an https url, 35 MB total. Answers the published post (urn, url, time, body) and the activity-log row. Sends once per client_reference and place (your feed, the page or the group; a new scheduled_at is the same post): a repeat is answered, never sent twice; on a 409 read error.context.send_outcome, never resend under a new key. 409 post_not_created is send_outcome unknown: repeat after retry_after.

        Contract:
        - MCP tool `create_linkedin_post`, registry package `mcp.linkedin/linkedin_posting`, 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 `posting` 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_posting
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateLinkedinPostRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreateLinkedinPostResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: create_linkedin_post
      x-gtm-mcp-mount: linkedin.content
      x-gtm-entity: linkedin_posting
      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: posting
  /api/linkedin-posting/delete-comment:
    post:
      operationId: delete_linkedin_comment
      summary: Delete LinkedIn comment
      description: |-
        Delete one of OUR OWN LinkedIn comments, addressed by comment_urn (wire delete-comment). The counterpart of create_linkedin_comment. You already hold the handle: create_linkedin_comment returns comment_urn, and the linkedin-scraping get-post-comments rows carry the same compound urn, so a comment can be removed without any extra read. LinkedIn only deletes the account's own comments and we do not pre-validate that. Identity-bound: linkedin_account_sid REQUIRED, spends the SAME comment_posts bucket as commenting (30/day), but an undo is paced 2 s, not the bucket delay, so a comment and its delete fit back to back; saturation returns 429. Nothing is stored on this service.

        Contract:
        - MCP tool `delete_linkedin_comment`, registry package `mcp.linkedin/linkedin_posting`, 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 `comment_posts` 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_posting
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DeleteLinkedinCommentRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeleteLinkedinCommentResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: delete_linkedin_comment
      x-gtm-mcp-mount: linkedin.content
      x-gtm-entity: linkedin_posting
      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: comment_posts
  /api/linkedin-posting/delete-post:
    post:
      operationId: delete_linkedin_post
      summary: Delete LinkedIn post
      description: |-
        Delete one of OUR OWN LinkedIn posts, addressed by activity_urn (wire delete-post). The counterpart of create_linkedin_post and the way to retract a post an agent published: pass the activity_urn that create_linkedin_post returned, or the post URL. LinkedIn only deletes the account's own posts and we do not pre-validate that. Identity-bound: linkedin_account_sid REQUIRED, spends the SAME posting bucket as publishing (20/day in series of 3 at a 1200 s pause; free plan 4 - the series is what lets a publish and its delete fit back-to-back), saturation returns 429. Backend urns (urn:li:share:, urn:li:ugcPost:) are NOT accepted here even though create_linkedin_post returns one: the wire builds its payload from the numeric activity id. A refusal - not your post, already gone - comes back as 409 post_not_deleted with LinkedIn's own toast in error.context, never as a success. Nothing is stored on this service, so nothing local is deleted either.

        Contract:
        - MCP tool `delete_linkedin_post`, registry package `mcp.linkedin/linkedin_posting`, 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 `posting` 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_posting
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DeleteLinkedinPostRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeleteLinkedinPostResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: delete_linkedin_post
      x-gtm-mcp-mount: linkedin.content
      x-gtm-entity: linkedin_posting
      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: posting
  /api/linkedin-posting/delete-scheduled-post:
    post:
      operationId: delete_linkedin_scheduled_post
      summary: Delete scheduled LinkedIn post
      description: |-
        Delete one SCHEDULED (never published) post from the account's queue, addressed by the BACKEND urn get_linkedin_scheduled_posts returns as rows[].post_urn (wire delete-scheduled-post). NOT a variant of delete_linkedin_post: an unpublished share has no activity urn, and this verb runs a graphql mutation against the queue while delete-post drives an SDUI action on a live feed post - the two handles are not interchangeable. Spends the one Content bucket, posting (20/day in series of 3 with a 1200 s pause; free plan 4/day) - the same bucket publishing spends, sized so queue cleanup and publishing fit together. A refusal - not this account's draft, or already gone - comes back as 409 scheduled_post_not_deleted, never as a success.

        Contract:
        - MCP tool `delete_linkedin_scheduled_post`, registry package `mcp.linkedin/linkedin_posting`, 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 `posting` 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_posting
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DeleteLinkedinScheduledPostRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeleteLinkedinScheduledPostResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: delete_linkedin_scheduled_post
      x-gtm-mcp-mount: linkedin.content
      x-gtm-entity: linkedin_posting
      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: posting
  /api/linkedin-posting/get-scheduled-posts:
    post:
      operationId: get_linkedin_scheduled_posts
      summary: Get scheduled LinkedIn posts
      description: |-
        One page of the account's SCHEDULED-posts queue: drafts waiting for their publication time, each with post_urn, scheduled_at, text and LinkedIn's own error_message (wire get-scheduled-posts). A PRIVATE read - nobody on LinkedIn sees it - but it spends the one Content bucket, posting (20/day in series of 3 with a 1200 s pause; free plan 4/day), shared with publishing. Pass author_organization_id (the bare numeric company id) to read a COMPANY PAGE's queue the account administers instead of the member's own. Offset-paged: page_size 1-100 (default 20), pass paging.next_cursor back as cursor. rows[].post_urn is the exact handle delete_linkedin_scheduled_post takes. Scheduling itself is not exposed through this API yet - posts are scheduled in LinkedIn's own UI; this pair reads and cleans the queue.

        Contract:
        - MCP tool `get_linkedin_scheduled_posts`, registry package `mcp.linkedin/linkedin_posting`, mount `linkedin.content`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `posting` 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_posting
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetLinkedinScheduledPostsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GetLinkedinScheduledPostsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: get_linkedin_scheduled_posts
      x-gtm-mcp-mount: linkedin.content
      x-gtm-entity: linkedin_posting
      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: posting
  /api/linkedin-posting/react:
    post:
      operationId: react_linkedin_post
      summary: React to LinkedIn post
      description: |-
        Leave OUR reaction on any LinkedIn post OR comment (wire create-reaction): entity_urn takes a post urn in any family, a post URL carrying one, or a comment urn; a post is reacted on at its social thread (see entity_urn). The social-selling counterpart of create_linkedin_comment. Outward and fire-on-success: the post does NOT need to be tracked, nothing is persisted here. Identity-bound: linkedin_account_sid REQUIRED, spends the react_posts bucket (30/day at a 360 s floor), saturation returns 429. Returns reaction_urn (the reaction's key, naming the entity it landed on; null on drift or when LinkedIn ignored it) plus the activity-log row. interested is the EVENT-post reaction: ordinary posts silently ignore it (success envelope, null reaction_urn, nothing lands - verified live). Takes no key: LinkedIn keeps one reaction per account and post, so repeating the same reaction changes nothing; every refusal still names error.context.send_outcome. To comment use create_linkedin_comment.

        Contract:
        - MCP tool `react_linkedin_post`, registry package `mcp.linkedin/linkedin_posting`, 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; mass action: this verb's own request accepts a filter or targets[] set, which the owning service drains; step eligible: gtm.service.orchestration can run this verb as a mass-action plan step, once per item; paced: a call spends the `react_posts` 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_posting
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReactLinkedinPostRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReactLinkedinPostResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: react_linkedin_post
      x-gtm-mcp-mount: linkedin.content
      x-gtm-entity: linkedin_posting
      x-gtm-operation: action
      x-gtm-envelope: action
      x-gtm-availability: ga
      x-gtm-dangerous: true
      x-gtm-mass-action: true
      x-gtm-step-eligible: true
      x-gtm-schedule-required: false
      x-gtm-tool-class: typical
      x-gtm-paced-bucket: react_posts
  /api/linkedin-posting/repost:
    post:
      operationId: repost_linkedin_post
      summary: Repost LinkedIn post
      description: |-
        Repost a LinkedIn post from one of the team accounts (wire create-instant-repost / create-repost-with-thoughts): ONE tool, the body picks which. Without text it is the plain repost (the feed's Repost button) and nothing else may be sent. With text it is a repost with your thoughts, a share of your own above the reposted post, which takes visibility, allowed_commenters_scope and mentions exactly as create_linkedin_post does. post_urn is the post being reposted as urn:li:activity, urn:li:share or urn:li:ugcPost (a group post cannot be reposted). Public and outward; retract with delete_linkedin_post on the answered activity_urn. Spends the posting bucket. Sends once per client_reference and reposted post (as LinkedIn files it, whichever of its urns you name): a repeat is answered, never sent twice; on a 409 read error.context.send_outcome, never resend under a new key. A plain repost has no deadline on LinkedIn's side, so one whose answer was lost stays in doubt for an hour.

        Contract:
        - MCP tool `repost_linkedin_post`, registry package `mcp.linkedin/linkedin_posting`, 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 `posting` 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_posting
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RepostLinkedinPostRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RepostLinkedinPostResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: repost_linkedin_post
      x-gtm-mcp-mount: linkedin.content
      x-gtm-entity: linkedin_posting
      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: posting
  /api/linkedin-posting/unreact:
    post:
      operationId: unreact_linkedin_post
      summary: Remove LinkedIn reaction
      description: |-
        Remove OUR reaction from a LinkedIn post or comment, addressed by the same entity_urn react_linkedin_post took (wire delete-reaction). Undo a reaction left by mistake or by a play that has been retargeted. Takes no reaction_type: LinkedIn holds at most one reaction per account per entity, so removal is unambiguous. Identity-bound: linkedin_account_sid REQUIRED, spends the SAME react_posts bucket as reacting (30/day), but an undo is paced 2 s, not the bucket delay, so a reaction and its removal fit back to back; saturation returns 429. A post is addressed at its social thread exactly like react_linkedin_post, so undoing with the value you reacted with removes the reaction that landed. removed: true means LinkedIn accepted the delete, not that a reaction existed (a delete with nothing to remove answered true live, 2026-09-16); a refused removal comes back 409 reaction_not_removed.

        Contract:
        - MCP tool `unreact_linkedin_post`, registry package `mcp.linkedin/linkedin_posting`, 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 `react_posts` 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_posting
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UnreactLinkedinPostRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UnreactLinkedinPostResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: unreact_linkedin_post
      x-gtm-mcp-mount: linkedin.content
      x-gtm-entity: linkedin_posting
      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: react_posts
  /api/linkedin-scraping/build-search-url:
    post:
      operationId: scrape_linkedin_build_search_url
      summary: Build LinkedIn search URL
      description: |-
        Build the LinkedIn URL of a people or company search, regular or Sales Navigator, from that search's filters: send exactly ONE of people / sales_nav_people / companies / sales_nav_companies. Facet values take an id or plain text; each text is resolved by the search's own typeahead (the option labelled exactly so, else the first; a multi-word miss is retried by its first word), at most 10 lookups per call, each a paced scraping read (Sales Navigator ones need an SN seat). A text nothing matches is a 422 naming the closest options, except on Sales Navigator titles and companies, where it stays free text. Returns url (Sales Navigator in its ?query= form, the one imports read), filters in the exact shape the matching search tool takes, and resolved: per text, the id picked and the alternatives. All ids given: no LinkedIn call at all. Recruiter has no build: its URL comes from running scrape_linkedin_search_recruiter_people.

        Contract:
        - MCP tool `scrape_linkedin_build_search_url`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinBuildSearchUrlRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinBuildSearchUrlResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_build_search_url
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: complex
      x-gtm-paced-bucket: scraping
  /api/linkedin-scraping/company-decision-makers:
    post:
      operationId: scrape_linkedin_company_decision_makers
      summary: Scrape company decision makers
      description: |-
        Sales Navigator’s decision-makers panel for ONE company: the bounded, seniority-weighted leadership/buying-committee list SN computes. SN-capable executor required.

        Contract:
        - MCP tool `scrape_linkedin_company_decision_makers`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinCompanyDecisionMakersRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinCompanyDecisionMakersResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_company_decision_makers
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/company-employees:
    post:
      operationId: scrape_linkedin_company_employees
      summary: Scrape company employees
      description: |-
        List the people currently working at ONE company (the company page’s "employees" people-search, page-numbered). Heavy, page-numbered list.

        Contract:
        - MCP tool `scrape_linkedin_company_employees`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinCompanyEmployeesRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinCompanyEmployeesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_company_employees
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/get-post-comments:
    post:
      operationId: scrape_linkedin_get_post_comments
      summary: Scrape post comments
      description: |-
        Direct LinkedIn read (bypasses our DB): one page of the COMMENTS on ONE post, live. This is the only comments read there is - a row carries the comment AND the person who wrote it (content, posted_at, comment_permalink, reactions_count, replies_count, is_pinned, is_edited + member id, nickname, name, headline), annotated with is_own, so reading "what was written" and "who commented" is a single call and never two. Target any post by URL, activity URN, or the backend urn a company-page post / newsletter issue / group thread carries (share, ugcPost, groupPost) in post. Top-level comments only: replies are not on this wire at all, replies_count is a count. Order with sort_order; one wire page per call, page on with cursor.

        Contract:
        - MCP tool `scrape_linkedin_get_post_comments`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinGetPostCommentsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinGetPostCommentsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_get_post_comments
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: complex
      x-gtm-paced-bucket: scraping
  /api/linkedin-scraping/get-post-reactors:
    post:
      operationId: scrape_linkedin_get_post_reactors
      summary: Scrape post reactors
      description: |-
        Direct LinkedIn read (bypasses our DB): live pull of who is reacting to ONE post - or ONE COMMENT - right now, as transient reactor objects with reaction_type in OUR write vocabulary (interested = the event-post reaction), annotated with is_own. Target a post by URL or urn in any family (activity, share, ugcPost, groupPost) in post, or target a comment by its urn (either form: urn:li:comment:(...) or the fsd urn:li:fsd_comment:(...)) to read the comment's reactors. LinkedIn files a post's reactions under its social thread, which is the ugcPost or groupPost urn for those posts and the activity urn for a share post; this tool names the thread for you and result.post.post_ln_id is the urn the feed was read by. One wire page per call; page on with cursor.

        Contract:
        - MCP tool `scrape_linkedin_get_post_reactors`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinGetPostReactorsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinGetPostReactorsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_get_post_reactors
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: complex
      x-gtm-paced-bucket: scraping
  /api/linkedin-scraping/get-post-resharers:
    post:
      operationId: scrape_linkedin_get_post_resharers
      summary: Scrape post resharers
      description: |-
        Direct LinkedIn read (bypasses our DB): live pull of the profiles that RESHARED one post, the third and typically highest-intent leg of the engagement trio. Targeting mirrors the reshare feed's own grammar (2026-08-21): a post URL, an activity URN, or a backend urn:li:share: / urn:li:ugcPost: urn verbatim - NOT urn:li:groupPost:, which is refused 422 reshare_target_unsupported (a group post has no reshare feed). is_own annotated. When exposed, resharer_commentary carries the added text and reshare_urn is the reshare’s own activity URN (feed it back into get-post-comments / -reactors). One wire page per call; page on with cursor.

        Contract:
        - MCP tool `scrape_linkedin_get_post_resharers`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinGetPostResharersRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinGetPostResharersResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_get_post_resharers
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: complex
      x-gtm-paced-bucket: scraping
  /api/linkedin-scraping/param-id-lookup:
    post:
      operationId: scrape_linkedin_param_id_lookup
      summary: Look up LinkedIn facet id
      description: |-
        Facet-id typeahead for the REGULAR (non Sales Navigator) search: turn a human term ("United States", "SaaS", "Acme") into the id a filter member needs. One type per call, and the type picks the member: people → followers_of, connections → connections_of, location → locations, company → current_companies, industry → industries, service_category → service_categories. Rows are the dropdown itself, best match first, about ten of them, with no paging and no size knob. An empty rows list means the dropdown offered nothing for that term, which is an answer, not an error. It types into the account's already-open tab, so no page is loaded, no search is spent and the people-search commercial-use limit is untouched. Cheapest method here. Sales Navigator ids are a different space: use scrape_linkedin_sales_nav_param_id_lookup.

        Contract:
        - MCP tool `scrape_linkedin_param_id_lookup`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinParamIdLookupRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinParamIdLookupResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_param_id_lookup
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/recruiter-param-id-lookup:
    post:
      operationId: scrape_linkedin_recruiter_param_id_lookup
      summary: Look up LinkedIn Recruiter facet id
      description: |-
        LinkedIn Recruiter facet-id typeahead: resolve one Recruiter search facet (type) for a typed query into the ids the scrape_linkedin_search_recruiter_people filters take (urn:li:ts_*:N; the lowercase language name for spoken_languages). A THIRD id space: neither the flagship nor the Sales Navigator lookup ids fit here. Eleven kinds, all text facets (query required); LinkedIn answers a fixed 10. Needs a Recruiter-seat executor. Costs a scraping-bucket slot per call.

        Contract:
        - MCP tool `scrape_linkedin_recruiter_param_id_lookup`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinRecruiterParamIdLookupRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinRecruiterParamIdLookupResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_recruiter_param_id_lookup
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/sales-nav-param-id-lookup:
    post:
      operationId: scrape_linkedin_sales_nav_param_id_lookup
      summary: Look up Sales Navigator facet id
      description: |-
        Sales Navigator facet-id typeahead: resolve one SN facet (type) into the opaque ids the SN search filters need. type is a node salesApiFacetTypeahead kind passed through verbatim; the seven text facets resolve query, the rest return their fixed / account-scoped list. Type → target filter member: TITLE → current_titles/past_titles; BING_GEO → locations/company_headquarters; INDUSTRY → industries; COMPANY_WITH_LIST → current_companies/past_companies; GROUP → groups; SCHOOL → schools; CONNECTION_OF → connections_of; ACCOUNT_LIST → account_lists (company search). Skip it for the static kinds (COMPANY_SIZE/FUNCTION/SENIORITY_V2/RELATIONSHIP/COMPANY_TYPE/TENURE/PROFILE_LANGUAGE): their full id sets are inlined in the search filter schemas. PERSONA/LEAD_LIST/LEAD_INTERACTIONS/SAVED_LEADS_AND_ACCOUNTS have no filters member yet. SN executor required.

        Contract:
        - MCP tool `scrape_linkedin_sales_nav_param_id_lookup`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSalesNavParamIdLookupRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSalesNavParamIdLookupResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_sales_nav_param_id_lookup
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-companies:
    post:
      operationId: scrape_linkedin_search_companies
      summary: Scrape LinkedIn company search
      description: |-
        One page of a regular LinkedIn company search, addressed EITHER by `filters` (keywords, geo ids, industry ids, headcount buckets) OR by a pasted /search/results/companies/ `url`: exactly one of the two, never both, never neither. Rows are company previews, not people, carrying the card's industry, followers (LinkedIn's rounded count) and location next to the identity. Same engine and the same company rows either way; page on with paging.has_more. For revenue, growth, follower, Fortune and buying-signal facets use scrape_linkedin_search_sales_nav_companies instead: this engine has none of them.

        Contract:
        - MCP tool `scrape_linkedin_search_companies`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchCompaniesRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchCompaniesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_companies
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-courses:
    post:
      operationId: scrape_linkedin_search_courses
      summary: Scrape LinkedIn Learning course search
      description: |-
        One page of a LinkedIn LEARNING course search, the sixth row kind here: `filters` OR a pasted /search/results/learning/ `url` (that screen, NOT /courses/), exactly one of the two. filters is a REQUIRED keywords plus two closed vocabularies, difficulty and time_to_complete, whose snake_case values the NODE maps onto LinkedIn's own labels, so never send a label yourself; the screen's software and subject facets need the url form. Rows are courses keyed by course_slug (this wire has no numeric id), with a tracking-free /learning/ URL, title, instructor, a normalised duration, the release and viewer lines as printed, and artwork. WARNING, the English dependency is TOTAL, as on groups: the title is read out of the "Save the course X" button label and a card without a readable title is DROPPED, so a non-English executor returns ZERO rows at success. Page on has_more, never on paging.total.

        Contract:
        - MCP tool `scrape_linkedin_search_courses`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchCoursesRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchCoursesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_courses
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-events:
    post:
      operationId: scrape_linkedin_search_events
      summary: Scrape event search
      description: |-
        One page of a LinkedIn EVENT search. `filters` carries keywords and NOTHING else (this engine has no location, date, type or organizer facet, and any other key is refused by name), so a pasted /search/results/events/ `url` is the only way to any facet the events screen itself offers: send exactly one of the two. Rows are events keyed by event_ln_id, with a tracking-free /events/ URL, title, the date and location lines as printed, the organizer when the card names one, the blurb, the attendee counter (0 is real, null is unread) and a cover image. The English dependency is PARTIAL: rows still come back on another interface language, but date_text and location_text can swap and organizer and attendee_count go null, silently. Page on with has_more, never on paging.total.

        Contract:
        - MCP tool `scrape_linkedin_search_events`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchEventsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchEventsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_events
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-groups:
    post:
      operationId: scrape_linkedin_search_groups
      summary: Scrape group search
      description: |-
        One page of a LinkedIn GROUP search, the fifth row kind on this surface. `filters` carries keywords and nothing else, exactly like the events search, so a pasted /search/results/groups/ `url` is the only way to anything the groups screen offers beyond a keyword: send exactly one of the two. Rows are groups keyed by group_ln_id, with a /groups/ URL, the name, Public or Private, the member counter both as printed and parsed (0 is real, null is unread), a best-effort blurb and a logo. WARNING, the English dependency is TOTAL, worse than the jobs search: the name is read out of English UI copy and a card whose name cannot be read is dropped, so a non-English executor returns ZERO rows and still reports success. Page on with has_more, never on paging.total.

        Contract:
        - MCP tool `scrape_linkedin_search_groups`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchGroupsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchGroupsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_groups
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-jobs:
    post:
      operationId: scrape_linkedin_search_jobs
      summary: Scrape job-posting search
      description: |-
        One page of a LinkedIn JOB-POSTING search, addressed EITHER by `filters` (keywords is REQUIRED here, which no other engine on this surface demands) OR by a pasted /jobs/search-results/ `url`, which is the only way to hybrid or on-site work, several locations, a radius around one, verified jobs and the other facet segments LinkedIn ships: exactly one of the two. Rows are postings keyed by job_ln_id, with a tracking-free /jobs/view/ URL, title, hiring company, location plus workplace_type, listing age, the salary line as printed, and the Easy Apply / early-applicant / verified flags. Card text is read off an ENGLISH LinkedIn UI: an executor whose interface is another language returns zero rows and still reports success. Page on with has_more, never on paging.total.

        Contract:
        - MCP tool `scrape_linkedin_search_jobs`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchJobsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchJobsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_jobs
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-people:
    post:
      operationId: scrape_linkedin_search_people
      summary: Scrape LinkedIn people search
      description: |-
        One page of a regular LinkedIn people search, addressed EITHER by `filters` OR by a pasted search `url`: exactly one of the two, never both, never neither. Use filters when the agent composes the search itself, url for a search already built in the LinkedIn UI or for anything the filter vocabulary cannot express. Same engine and the same person rows either way; page on with paging.has_more. Rows carry the card's headline, location and degree badge next to the identity (position / company_name are Recruiter-only). commercial_use_limit_hit true means LinkedIn's monthly search paywall fired and rows may be truncated: switch to the Sales Navigator people tool or wait for the reset.

        Contract:
        - MCP tool `scrape_linkedin_search_people`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchPeopleRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchPeopleResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_people
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-posts:
    post:
      operationId: scrape_linkedin_search_posts
      summary: Scrape post search
      description: |-
        LinkedIn content search: find POSTS by keywords, recency or author. The discovery front door for post-engagement plays (feed the returned post_ln_id into the commenters / reactors / resharers tools). Addressed EITHER by `filters` (keywords REQUIRED) OR by a pasted /search/results/content/ `url`, which the node parses back into the same filter object: exactly one of the two, never both, never neither. CURSOR paginated, unlike every other search here: feed paging.next_cursor back verbatim and size the page with page_size. A page is the end only when LinkedIn itself answers that the window is empty; an answer the platform cannot read is refused (503 linkedin_page_unreadable, retry in a minute), never returned as an empty page.

        Contract:
        - MCP tool `scrape_linkedin_search_posts`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchPostsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchPostsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_posts
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-products:
    post:
      operationId: scrape_linkedin_search_products
      summary: Scrape LinkedIn product search
      description: |-
        One page of a LinkedIn PRODUCT search, the seventh row kind here: `filters` OR a pasted /search/results/products/ `url`, exactly one of the two. filters is a REQUIRED keywords plus a one-way free_version toggle and two arrays of digit-string ids that come from DIFFERENT places: product_category from param-id-lookup type=product_category, product_company from the ordinary organization id space. Nothing reconciles them, so a swapped id returns an empty page, not an error. Rows are product pages keyed by product_slug (the wire calls it product_id, but it is a slug and must never be sent back as an id), with a tracking-free /products/ URL, name, vendor, tagline, top features and a connections counter. Unlike courses, a non-English executor still returns named rows here, but category_text and tagline can silently carry the WRONG text. Page on has_more, never on paging.total.

        Contract:
        - MCP tool `scrape_linkedin_search_products`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchProductsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchProductsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_products
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-recruiter-people:
    post:
      operationId: scrape_linkedin_search_recruiter_people
      summary: Scrape LinkedIn Recruiter people search
      description: |-
        One page of a LinkedIn Recruiter (talent) people search, by a structured filters object (the Recruiter facets: titles, skills, companies, locations, postal codes, industries, education, languages, seniority, function, company size and type, year sliders, network, open-to-work) OR by a pasted Recruiter search url. A Recruiter URL carries no filters, only the searchHistoryId of the search LinkedIn keeps on the seat, so the url half replays that stored search on your page; every answer returns search_history_id and search_url, so page 2 onwards is addressed by the URL alone. 25 hits a page, page 1..40, a real total; rows carry recruiter_id (for send_linkedin_recruiter_message), headline, location, current position, can_send_inmail. Needs a Recruiter-seat executor with a live session (422 recruiter_required, 409 recruiter_reauth_required); 429 recruiter_search_usage_limit is LinkedIn's per-seat throttle, wait a minute. Ids via scrape_linkedin_recruiter_param_id_lookup. One scraping-bucket slot per page.

        Contract:
        - MCP tool `scrape_linkedin_search_recruiter_people`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchRecruiterPeopleRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchRecruiterPeopleResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_recruiter_people
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-sales-nav-companies:
    post:
      operationId: scrape_linkedin_search_sales_nav_companies
      summary: Scrape Sales Navigator company search
      description: |-
        One page of a Sales Navigator ACCOUNT search, the one engine here that filters on annual revenue, company and per-department headcount growth, department headcount, follower buckets, Fortune tier and buying signals (leadership changes, funding events). Addressed EITHER by `filters`, whose typeahead members take ids from scrape_linkedin_sales_nav_param_id_lookup while the static enums are inline, OR by a pasted /sales/search/company `url`: exactly one of the two. SN-capable executor required.

        Contract:
        - MCP tool `scrape_linkedin_search_sales_nav_companies`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchSalesNavCompaniesRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchSalesNavCompaniesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_sales_nav_companies
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-sales-nav-people:
    post:
      operationId: scrape_linkedin_search_sales_nav_people
      summary: Scrape Sales Navigator people search
      description: |-
        One page of a Sales Navigator people search: richer facets than the regular engine (seniority, function, tenure, headcount, company type), no commercial-use limit, SN URNs (sn_id) on the rows. Addressed EITHER by `filters`, which carry the COMPLETE SN facet vocabulary, OR by a pasted /sales/search/people `url`: exactly one of the two. Typeahead members take [{id, text, exclude}] values from scrape_linkedin_sales_nav_param_id_lookup; the static-enum members list their ids inline and need no lookup. Needs an SN-capable executor (a non-SN own account gets 422 sales_nav_required; the auto-pick filters to SN seats).

        Contract:
        - MCP tool `scrape_linkedin_search_sales_nav_people`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchSalesNavPeopleRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchSalesNavPeopleResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_sales_nav_people
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-schools:
    post:
      operationId: scrape_linkedin_search_schools
      summary: Scrape LinkedIn school search
      description: |-
        One page of a LinkedIn SCHOOL search, the eighth row kind here: `filters` OR a pasted /search/results/schools/ `url`, exactly one of the two. filters is a REQUIRED keywords and NOTHING else, the same one-member shape the events search has, so every facet the schools screen offers lives only in the url form. There is NO school-id filter: the ids param_id_lookup returns for type=school fit nothing here. Rows are school pages keyed by school_slug (the wire calls it school_id, it is a slug, it can be URL-encoded, and it is not that lookup id), with a tracking-free /school/ URL, name, location line, a students-and-alumni counter and a blurb. Names and slugs survive a non-English executor, but description can silently carry the students line. Page on has_more, never on paging.total.

        Contract:
        - MCP tool `scrape_linkedin_search_schools`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchSchoolsRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchSchoolsResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_schools
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/search-service-providers:
    post:
      operationId: scrape_linkedin_search_service_providers
      summary: Scrape service-provider search
      description: |-
        One page of LinkedIn's service-provider marketplace (freelancers and agencies), addressed EITHER by `filters` (keywords, LinkedIn's own numeric service-category and geo ids, connection degree, profile language) OR by a pasted /search/results/services/ `url`, which is how to reach anything those five cannot express: exactly one of the two. Rows are the same person previews the people search returns, because the services screen carries no ratings and no service labels in its results, only provider profiles.

        Contract:
        - MCP tool `scrape_linkedin_search_service_providers`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSearchServiceProvidersRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSearchServiceProvidersResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_search_service_providers
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/similar-companies:
    post:
      operationId: scrape_linkedin_similar_companies
      summary: Scrape similar companies
      description: |-
        LinkedIn’s "similar companies / pages people also viewed" list for ONE target company: lookalike account expansion. One-shot list.

        Contract:
        - MCP tool `scrape_linkedin_similar_companies`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSimilarCompaniesRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSimilarCompaniesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_similar_companies
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
  /api/linkedin-scraping/similar-profiles:
    post:
      operationId: scrape_linkedin_similar_profiles
      summary: Scrape similar profiles
      description: |-
        LinkedIn’s "people also viewed" browsemap for ONE seed profile: lookalike expansion from a known-good persona. IMPORTANT: address by profile.nickname (the vanity slug) ONLY, because the wire navigates by vanityName, so a ln_id/sn_id URN is refused not_dispatchable (resolve it via enrich_linkedin_person_lite_profile first, then pass the nickname). Returns ~20 cards; rows carry ln_member_id + nickname + full_name + headline (no ACoAA id, no avatar, no degree). One-shot list (no pagination); limit caps the cards.

        Contract:
        - MCP tool `scrape_linkedin_similar_profiles`, registry package `mcp.linkedin/linkedin_scraping`, mount `linkedin.scraping`.
        - Operation `action`, response envelope `action`.
        - Flags: paced: a call spends the `scraping` 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_scraping
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScrapeLinkedinSimilarProfilesRequest"
      responses:
        "200":
          description: "`action` success envelope."
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScrapeLinkedinSimilarProfilesResponse"
        4XX:
          $ref: "#/components/responses/McpClientError"
        5XX:
          $ref: "#/components/responses/McpServerError"
      x-gtm-mcp-tool: scrape_linkedin_similar_profiles
      x-gtm-mcp-mount: linkedin.scraping
      x-gtm-entity: linkedin_scraping
      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: scraping
components:
  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.
  responses:
    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"
    McpServerError:
      description: MCP error envelope with `error.code` internal_error or service_unavailable.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/McpError"
  schemas:
    AcceptLinkedinConnectionInvitationResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            ln_member_id:
              type: string
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            note:
              type: string
              nullable: true
            linkedin_invitation_id:
              type: string
              nullable: true
            shared_secret:
              type: string
              nullable: true
            received_at:
              type: string
            last_check_at:
              type: string
              nullable: true
            removal_kind:
              type: string
              nullable: true
              enum:
                - accepted
                - ignored
                - expired
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - ln_member_id
            - ln_id
            - sn_id
            - nickname
            - note
            - linkedin_invitation_id
            - shared_secret
            - received_at
            - last_check_at
            - removal_kind
            - 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
              nullable: true
              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
              nullable: true
              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
    AddLinkedinConversationParticipantsRequest:
      type: object
      description: Request body of `add_linkedin_conversation_participants`.
      properties:
        participant_ln_ids:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 64
          minItems: 1
          maxItems: 20
          description: "Bare LinkedIn profile ids (ACoA...) to add, 1..20; not urn: strings."
      required:
        - participant_ln_ids
    AddLinkedinConversationParticipantsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
          description: kebab-case verb; matches the route segment.
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            conversation_hash:
              type: string
              description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
            nickname:
              type: string
              nullable: true
            participants:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  picture_url:
                    type: string
                    nullable: true
            is_muted:
              type: boolean
              nullable: true
            unread_count:
              type: integer
              nullable: true
              description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
            event_count:
              type: number
            last_activity_at:
              type: string
              nullable: true
            last_stored_message_at:
              type: string
              nullable: true
            last_message_sync_at:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - conversation_hash
            - messenger_type
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - participants
            - is_muted
            - unread_count
            - event_count
            - last_activity_at
            - last_stored_message_at
            - last_message_sync_at
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            status:
              type: string
              enum:
                - success
              description: "The only value this verb answers with: a refusal is a typed error, never a status."
            activity_log_sid:
              type: string
              nullable: true
              description: The linkedin-account-activity-log row of the call (ln_al_).
          required:
            - status
            - activity_log_sid
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    CheckAntidetectBrowserProxyConnectivityRequest:
      type: object
      description: Request body of `check_antidetect_browser_proxy_connectivity`.
      properties:
        sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ab_px_
          description: Antidetect browser proxy sid (ab_px_…).
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            type:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            country_code:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            vendor_zone:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            status:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            last_health_check_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            avg_connection_time_ms:
              type: object
              properties:
                gte:
                  type: number
                lte:
                  type: number
                gt:
                  type: number
                lt:
                  type: number
                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 proxies)."
    CheckAntidetectBrowserProxyConnectivityResponse:
      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: {}
        result:
          type: object
          properties:
            total_matched:
              type: integer
              description: True count of matched proxies (before the inline cap).
            truncated:
              type: boolean
              description: true when total_matched exceeded the inline check cap.
          required:
            - total_matched
        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
              nullable: true
              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
              nullable: true
              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
    CheckAntidetectBrowserProxyLocationRequest:
      type: object
      description: Request body of `check_antidetect_browser_proxy_location`.
      properties:
        sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ab_px_
          description: Antidetect browser proxy sid (ab_px_…).
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            type:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            country_code:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            vendor_zone:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            status:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            last_health_check_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            avg_connection_time_ms:
              type: object
              properties:
                gte:
                  type: number
                lte:
                  type: number
                gt:
                  type: number
                lt:
                  type: number
                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 proxies)."
    CheckAntidetectBrowserProxyLocationResponse:
      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: {}
        result:
          type: object
          properties:
            total_matched:
              type: integer
              description: True count of matched proxies (before the inline cap).
            truncated:
              type: boolean
              description: true when total_matched exceeded the inline check cap.
          required:
            - total_matched
        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
              nullable: true
              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
              nullable: true
              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
    CheckAntidetectBrowserProxyRequest:
      type: object
      description: Request body of `check_antidetect_browser_proxy`.
      properties:
        ip:
          type: string
          description: Proxy host.
        port:
          type: integer
          minimum: 1
          maximum: 65535
        mode:
          type: string
          enum:
            - http
            - socks4
            - socks5
          description: Default http.
        username:
          type: string
          nullable: true
        password:
          type: string
          nullable: true
        sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ab_br_
          description: The browser whose own proxy is being edited. A password left out is then the one that browser stores, for the same ip and username only; another host never receives it.
      required:
        - ip
        - port
    CheckAntidetectBrowserProxyResponse:
      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: {}
        result:
          type: object
          properties:
            ok:
              type: boolean
              description: True when the request was routed through the proxy.
            error_kind:
              type: string
              nullable: true
              description: "Why it failed: timeout | tls | network | http_error. Null on success."
            exit_ip:
              type: string
              nullable: true
              description: The address the probe target saw. Null when the target answered nothing parseable.
            country_code:
              type: string
              nullable: true
              description: ISO-3166-1 alpha-2 exit country; this is what create / update-proxy store on the browser.
            latency_ms:
              type: integer
              nullable: true
              description: Round-trip time of the probe.
          required:
            - ok
            - error_kind
            - exit_ip
            - country_code
            - latency_ms
        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
              nullable: true
              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
              nullable: true
              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
    CheckLinkedinAccountPremiumSubscriptionRequest:
      type: object
      description: Request body of `check_linkedin_account_premium_subscription`.
      properties:
        checks:
          type: array
          nullable: true
          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."
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    CheckLinkedinConnectionDegreeRequest:
      type: object
      description: Request body of `check_linkedin_connection_degree`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…) whose network is acted on.
        target:
          type: object
          properties:
            ln_id:
              type: string
              maxLength: 128
              description: Regular-profile URN (ACoAA…).
            sn_id:
              type: string
              maxLength: 64
              description: Sales Navigator URN (ACwAA…).
            nickname:
              type: string
              maxLength: 100
              description: Public profile slug.
          description: Target person; supply exactly one of ln_id / sn_id / nickname.
      required:
        - linkedin_account_sid
        - target
    CheckLinkedinConnectionDegreeResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            ln_member_id:
              type: string
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            full_name:
              type: string
              nullable: true
            connected_at:
              type: string
              nullable: true
            linkedin_connection_request_sid:
              type: string
              nullable: true
            linkedin_connection_invitation_sid:
              type: string
              nullable: true
            last_check_at:
              type: string
              nullable: true
            removal_kind:
              type: string
              nullable: true
              enum:
                - removed
                - blocked
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - ln_member_id
            - ln_id
            - sn_id
            - nickname
            - full_name
            - connected_at
            - linkedin_connection_request_sid
            - linkedin_connection_invitation_sid
            - last_check_at
            - removal_kind
            - 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
              nullable: true
              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
              nullable: true
              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
    CheckLinkedinConnectionRequestSentRequest:
      type: object
      description: Request body of `check_linkedin_connection_request_sent`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: The account that sent (ln_ac_…). A key is looked up on this account only.
        client_reference:
          type: string
          nullable: true
          minLength: 1
          maxLength: 255
          description: "The key the invitation went out under, byte for byte. Exactly one of client_reference / activity_log_sid. Found at any age: an invitation in doubt never ages out of its key."
        activity_log_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: The attempt a 409 or an earlier check named (ln_al_…); it takes no person. An attempt of another account, or one that is no invitation, is 404.
        profile_id:
          type: string
          nullable: true
          maxLength: 128
          description: "The person, next to client_reference: the URN the send was given (ln_id ACoAA… or sn_id ACwAA…). At most one of profile_id / ln_member_id."
        ln_member_id:
          type: string
          nullable: true
          maxLength: 64
          description: "The person, next to client_reference: their member id (digits)."
      required:
        - linkedin_account_sid
    CheckLinkedinConnectionRequestSentResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            ln_member_id:
              type: string
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            note:
              type: string
              nullable: true
            client_reference:
              type: string
              nullable: true
            sent_at:
              type: string
              nullable: true
            invitation_id:
              type: string
              nullable: true
            resend_available_at:
              type: string
              nullable: true
            last_check_at:
              type: string
              nullable: true
            removal_kind:
              type: string
              nullable: true
              enum:
                - accepted
                - withdrawn
                - expired
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - ln_member_id
            - ln_id
            - sn_id
            - nickname
            - note
            - client_reference
            - sent_at
            - invitation_id
            - resend_available_at
            - last_check_at
            - removal_kind
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            outcome:
              type: string
              description: sent | not_sent | in_flight | unknown. Send the same request again only on not_sent; on in_flight or unknown ask again after retry_after.
            reason:
              type: string
              nullable: true
              description: "Why. sent: null (item is the request), request_row_pending (it went out, its row comes later), caller_confirmed (a person said so; no row). not_sent: no_send_under_key, refused, not_in_invitations, caller_confirmed. unknown: answer_lost, may_still_land, unreadable, unexplained."
            retry_after:
              type: string
              description: "ISO 8601: for an invitation in doubt, when the sent invitations are read next."
            activity_log_sid:
              type: string
              description: "The attempt the answer is about (in flight, in doubt or landed): what confirmed_not_sent / confirmed_sent name on send_linkedin_connection_request."
            send_decisive_at:
              type: string
              description: "ISO 8601: the moment an invitation in doubt can no longer land; a person's confirmed_not_sent is taken from then on."
          required:
            - outcome
            - reason
        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
              nullable: true
              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
              nullable: true
              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
    CheckLinkedinMessageSentRequest:
      type: object
      description: Request body of `check_linkedin_message_sent`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: The account that sent (ln_ac_…). A key is looked up on this account only.
        client_reference:
          type: string
          nullable: true
          minLength: 1
          maxLength: 255
          description: "The key the send went out under, byte for byte. Exactly one of client_reference / activity_log_sid. Found at any age: a send in doubt never ages out of its key."
        activity_log_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: The attempt a 409 or an earlier check named (ln_al_…); it takes no place. An attempt of another account is 404.
        linkedin_conversation_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_cv_
          description: "Place, next to client_reference: the thread the send named or landed in. One place at most; a thread of another account is 404."
        ln_member_id:
          type: string
          nullable: true
          maxLength: 64
          description: "Place, next to client_reference: the person's member id (digits)."
        profile_urn:
          type: string
          nullable: true
          maxLength: 128
          description: "Place, next to client_reference: the recipient id the send was given (ln_id ACoAA…, sn_id ACwAA…, or a Recruiter id)."
      required:
        - linkedin_account_sid
    CheckLinkedinMessageSentResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            linkedin_conversation_sid:
              type: string
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
            linkedin_type:
              type: string
              enum:
                - message
                - inmail
                - connection_note
                - system
              description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
            type:
              type: string
              enum:
                - inbox
                - outbox
              description: "Direction relative to our account: received / sent."
            automation:
              type: string
              enum:
                - auto
                - manual
                - synced
              description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
            ln_member_id:
              type: string
              nullable: true
              description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
            nickname:
              type: string
              nullable: true
            subject:
              type: string
              nullable: true
            text:
              type: string
            client_reference:
              type: string
              nullable: true
            attachments:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  urn:
                    type: string
                    description: digitalmediaAsset URN; the attachment_urn the download tools take.
                  name:
                    type: string
                  content_type:
                    type: string
                  content_url:
                    type: string
                  file_byte_size:
                    type: number
                  file_name:
                    type: string
                    description: "Rows our send verbs wrote: the file name as sent."
                  file_type:
                    type: string
                    description: "Rows our send verbs wrote: the MIME type as sent."
            reactions:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  emoji:
                    type: string
                  count:
                    type: number
                  is_viewer_reacted:
                    type: boolean
                  first_reacted_at:
                    type: string
                    nullable: true
                required:
                  - emoji
                  - count
                  - is_viewer_reacted
                  - first_reacted_at
            is_deleted:
              type: boolean
            message_hash:
              type: string
            sent_at:
              type: string
            custom_content:
              type: object
              nullable: true
              additionalProperties: {}
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - linkedin_conversation_sid
            - messenger_type
            - linkedin_type
            - type
            - automation
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - subject
            - text
            - client_reference
            - attachments
            - reactions
            - is_deleted
            - message_hash
            - sent_at
            - custom_content
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            outcome:
              type: string
              description: sent | not_sent | in_flight | unknown. Send the same request again only on not_sent; on in_flight or unknown ask again after retry_after.
            reason:
              type: string
              nullable: true
              description: "Why. sent: null (item is the row), message_row_pending (it went out, its row comes later), caller_confirmed (a person said so; no row). not_sent: no_send_under_key, refused, not_in_thread, caller_confirmed. unknown: answer_lost, may_still_land, thread_unreadable, unexplained_message, unprovable."
            retry_after:
              type: string
              description: "ISO 8601: for a send in doubt, when its thread is read next or the moment it can no longer land."
            activity_log_sid:
              type: string
              description: "The attempt the answer is about (in flight, in doubt or landed): what confirmed_not_sent / confirmed_sent name on the send tools."
            send_decisive_at:
              type: string
              description: "ISO 8601: the moment a send in doubt can no longer land; a person's confirmed_not_sent is taken from then on."
          required:
            - outcome
            - reason
        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
              nullable: true
              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
              nullable: true
              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
    CheckLinkedinPostingSentRequest:
      type: object
      description: Request body of `check_linkedin_posting_sent`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: The account that sent (ln_ac_…). A key is looked up on this account only.
        client_reference:
          type: string
          nullable: true
          minLength: 1
          maxLength: 255
          description: "The key the send went out under, byte for byte. Exactly one of client_reference / activity_log_sid. Found at any age: a send in doubt never ages out of its key."
        activity_log_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: The attempt a 409 or an earlier check named (ln_al_…); it takes no verb and no place. An attempt of another account, or one that is no comment, post or repost, is 404.
        verb:
          type: string
          nullable: true
          enum:
            - comment
            - create-post
            - repost
          description: "Required with client_reference: the verb the key was sent by (create_linkedin_comment, create_linkedin_post, repost_linkedin_post). A key is one send per verb."
        entity_urn:
          type: string
          nullable: true
          maxLength: 512
          description: "Place, next to client_reference: the post a comment or a repost went to, as the send took it or in any other of its forms (it is read for its thread, on the post-details cache), or a comment urn for a reply. Not with create-post."
        parent_comment_urn:
          type: string
          nullable: true
          maxLength: 512
          description: "Place, next to client_reference and verb comment: the comment a reply answers, in either of its forms."
        post_place:
          type: string
          nullable: true
          maxLength: 128
          pattern: ^(?:feed:member|feed:org:\d+|group:\d+(?::org:\d+)?)(?::scheduled:\d+)?$
          description: "Place, next to client_reference and verb create-post: where the post landed: feed:member (your own feed), feed:org:<id> (a company page it was posted as), group:<id> (a group; group:<id>:org:<id> when a page posted into it), optionally :scheduled:<unix ms> after it. A key is read at the feed, page or group whatever its slot."
      required:
        - linkedin_account_sid
    CheckLinkedinPostingSentResponse:
      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
          nullable: true
          properties:
            comment_urn:
              type: string
              nullable: true
              description: "A comment or a reply: the comment it made."
            kind:
              type: string
              description: "A repost: instant or with_thoughts."
            activity_urn:
              type: string
              nullable: true
              description: "A post or a repost: its feed entry."
            post_urn:
              type: string
              nullable: true
              description: "A post or a repost: the publication."
            url:
              type: string
              nullable: true
            created_at:
              type: string
              nullable: true
            text:
              type: string
            parent_post_urn:
              type: string
              nullable: true
              description: "A repost: the post it reposted."
          description: "What the send made, in the shape its own verb answers: a comment the comment_urn; a post its urns, url, time and body; a repost its kind, urns, url, time, body and the reposted post."
        result:
          type: object
          properties:
            outcome:
              type: string
              description: sent | not_sent | in_flight | unknown. Send the same request again only on not_sent; on in_flight or unknown ask again after retry_after.
            reason:
              type: string
              nullable: true
              description: "Why. sent: null (item is what it made), result_pending (it went out, what it made is read later), caller_confirmed (a person said so; no item). not_sent: no_send_under_key, refused, not_on_linkedin, caller_confirmed. unknown: answer_lost, may_still_land, unreadable, unexplained, unprovable (a group post, or a page post its page has not shown: no read can prove either absent)."
            retry_after:
              type: string
              description: "ISO 8601: for a send in doubt, when LinkedIn is read for it next."
            activity_log_sid:
              type: string
              description: "The attempt the answer is about (in flight, in doubt or landed): what confirmed_not_sent / confirmed_sent name on the comment, post and repost tools."
            send_decisive_at:
              type: string
              description: "ISO 8601: the moment a send in doubt can no longer land; a person's confirmed_not_sent is taken from then on. A plain repost carries no deadline of its own, so it is an hour after its answer was lost."
          required:
            - outcome
            - reason
        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
              nullable: true
              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
              nullable: true
              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
    CreateAntidetectBrowserRequest:
      type: object
      description: Request body of `create_antidetect_browser`.
      properties:
        vendor_provider:
          type: string
          enum:
            - gologin
            - multilogin
            - adspower
            - dolphin
          description: Default gologin (the only wired vendor).
        vendor_profile_id:
          type: string
          nullable: true
          pattern: ^[0-9a-f]{24}$
          description: "Bind an EXISTING vendor profile (BYO): the GoLogin profile id, 24 hex characters. NOT a profile URL, share link or LinkedIn slug. Omit to mint a fresh one. The profile must be shared with our GoLogin account, or the create is 422 vendor_profile_not_found; if the owning GoLogin account is over its plan the create is 402 vendor_profile_plan_limit and retrying will not help."
        os:
          type: string
          enum:
            - win
            - mac
            - lin
            - android
          description: OS for a freshly-minted profile (default win).
        antidetect_browser_proxy_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ab_px_
          description: Assign an already-chosen pooled proxy. Resolve the sid yourself with search_antidetect_browser_proxies; never ask an end user for one.
        proxy_country_code:
          type: string
          minLength: 2
          maxLength: 2
          description: ISO country. Picks the least-loaded active proxy. The default way to pick a proxy.
        custom_proxy_config:
          type: object
          properties:
            ip:
              type: string
              description: Proxy host.
            port:
              type: integer
              minimum: 1
              maximum: 65535
            username:
              type: string
            password:
              type: string
            mode:
              type: string
              enum:
                - http
                - socks4
                - socks5
              description: Default http.
          required:
            - ip
            - port
          description: Custom proxy connection tuple (customer BYO path). Probed before it is written; 5G Proxy cannot ride it.
        proxy_5g:
          type: boolean
          description: "Provision the browser on the 5G Proxy add-on: the dedicated 5G mobile route, sold for speed (faster command execution, fewer retries). Each flagged browser takes one add-on slot; with no headroom left the create is refused 402 insufficient_proxy_5g_slots."
    CreateAntidetectBrowserResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - create
        item:
          type: object
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
              nullable: true
            automation_server_sid:
              type: string
              nullable: true
            account_share_sid:
              type: string
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            vendor_provider:
              type: string
              enum:
                - gologin
                - multilogin
                - adspower
                - dolphin
            vendor_name:
              type: string
              nullable: true
            vendor_profile_id:
              type: string
              nullable: true
            browser_owner:
              type: string
              enum:
                - platform
                - customer
            status:
              type: string
              enum:
                - stopped
                - queued_to_start
                - initializing
                - running
                - idle
                - queued_to_stop
                - start_issue
                - running_issue
                - login_issue
                - restricted
                - client_error_investigation
                - support_error_investigation
                - maintenance
                - shared_out
                - subscription_required
            error_reason:
              type: string
              nullable: true
            fail_count:
              type: number
            last_fail_at:
              type: string
              nullable: true
            logout_count:
              type: number
            last_logout_at:
              type: string
              nullable: true
            last_start_at:
              type: string
              nullable: true
            last_health_check_at:
              type: string
              nullable: true
            last_activity_at:
              type: string
              nullable: true
            antidetect_browser_proxy_sid:
              type: string
              nullable: true
            proxy_country_code:
              type: string
              nullable: true
            custom_proxy:
              type: object
              nullable: true
              properties:
                ip:
                  type: string
                port:
                  type: integer
                mode:
                  type: string
                username:
                  type: string
                  nullable: true
                exit_ip:
                  type: string
                  nullable: true
                latency_ms:
                  type: integer
                  nullable: true
              required:
                - ip
                - port
                - mode
                - username
                - exit_ip
                - latency_ms
            proxy_5g:
              type: boolean
              description: "5G Proxy add-on: the browser runs on the dedicated 5G mobile route (faster command execution, fewer retries). Each flagged browser occupies one add-on slot."
            cloud_browser_access:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                    nullable: true
                    minLength: 18
                    maxLength: 18
                    pattern: ^cb_ak_
                    description: "The bearer token itself, in full, for a caller holding can_manage_cloud_browser_external_links (the permission that mints it: reading a key is the same power as minting one, since the public connect checks nothing but the key). null for every other caller; the entry stays so the link, its expiry and its use can still be listed. On cloud-browser-sessions it is masked to the last 4."
                  expires_at:
                    type: string
                    nullable: true
                    description: ISO 8601 expiry; null means it never expires. Checked at connect and never again, so a session can outlive its own key.
                  max_connects:
                    type: number
                    nullable: true
                    description: Cap on CONCURRENT sessions on this key; null means unlimited.
                  allowed_ips:
                    type: array
                    nullable: true
                    items:
                      type: string
                  allowed_countries:
                    type: array
                    nullable: true
                    items:
                      type: string
                  purpose:
                    type: string
                    enum:
                      - relogin
                      - recruiter_relogin
                      - share
                    description: What the public page behind the link does. Stamped at mint and never re-negotiated at connect, because the visitor is unauthenticated. Absent on keys minted before the field existed, which the backend reads as relogin.
                required:
                  - key
                  - expires_at
                  - max_connects
                  - allowed_ips
                  - allowed_countries
              description: The smart links minted on this browser; the key itself only for a caller holding can_manage_cloud_browser_external_links, null otherwise (2026-09-16). Each console open used to leave a throwaway entry here; minting now sweeps entries that expired over 24h ago, so this is the live link list rather than a log.
            vendor_profile_shares:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  email:
                    type: string
                  role:
                    type: string
                  shared_at:
                    type: string
                    nullable: true
                  shared_by:
                    type: string
                    nullable: true
                  vendor_share_id:
                    type: string
                    nullable: true
                required:
                  - email
                  - role
                  - shared_at
                  - shared_by
                  - vendor_share_id
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - automation_server_sid
            - account_share_sid
            - share_role
            - vendor_provider
            - vendor_name
            - vendor_profile_id
            - browser_owner
            - status
            - error_reason
            - fail_count
            - last_fail_at
            - logout_count
            - last_logout_at
            - last_start_at
            - last_health_check_at
            - last_activity_at
            - antidetect_browser_proxy_sid
            - proxy_country_code
            - custom_proxy
            - proxy_5g
            - cloud_browser_access
            - vendor_profile_shares
            - created_by
            - deleted_by
            - created_at
            - updated_at
            - deleted_at
        already_exists:
          type: boolean
        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
              nullable: true
              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
              nullable: true
              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
        - already_exists
        - meta
    CreateLinkedinAutoScrapeRequest:
      type: object
      description: Request body of `create_linkedin_auto_scrape`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor LinkedIn account sid (ln_ac_...): whose browser paginates the source."
        title:
          type: string
          nullable: true
          maxLength: 255
          description: Human label for the list view. Server derives "{result_kind} {source_method}" when omitted.
        url:
          type: string
          maxLength: 2048
          description: LinkedIn or Sales Navigator people/company SEARCH url. Mutually exclusive with source_method plus source_input.
        source_method:
          type: string
          enum:
            - search-people-by-url
            - search-people-by-params
            - search-sales-nav-people-by-url
            - search-sales-nav-people-by-params
            - similar-profiles
            - company-employees
            - company-decision-makers
            - get-post-comments
            - get-post-reactors
            - get-post-resharers
            - search-service-providers
            - search-service-providers-by-url
            - search-companies-by-url
            - search-companies-by-params
            - search-sales-nav-companies-by-url
            - search-sales-nav-companies-by-params
            - similar-companies
          description: The paginated verb to replay. Required (with source_input) for every non-search source.
        source_input:
          type: object
          additionalProperties: {}
          description: "The verb's own arguments. One key is mandatory per family: url, filters, anchor_company_ln_id, anchor_nickname (similar-profiles takes the vanity slug, never a URN), or activity_urn. filters takes the SAME schema as the matching scrape_linkedin_search_* (the merged tools; the old _by_params names are gone) tool (see it for the facet vocabulary and typeahead workflow). On get-post-comments an optional sort_order (RELEVANCE | CHRONOLOGICAL | REVERSE_CHRONOLOGICAL) is FROZEN here at create and used on every page of every run - a cursor belongs to the ordering it was minted under, so the walk's sort can never change mid-run; a value outside that vocabulary is a 422."
        replay_frequency:
          type: string
          nullable: true
          enum:
            - hourly
            - daily
            - weekly
            - monthly
          description: "Cadence: hourly | daily | weekly | monthly. Omit or null for a one-shot job that runs once."
        mass_action_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ma_ac_
          description: Standing mass-action new leads enrol into. Cross-checked for same team, live, and target family compatible with result_kind.
      required:
        - linkedin_account_sid
    CreateLinkedinAutoScrapeResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - create
        item:
          type: object
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            source_method:
              type: string
              enum:
                - search-people-by-url
                - search-people-by-params
                - search-sales-nav-people-by-url
                - search-sales-nav-people-by-params
                - similar-profiles
                - company-employees
                - company-decision-makers
                - get-post-comments
                - get-post-reactors
                - get-post-resharers
                - search-service-providers
                - search-service-providers-by-url
                - search-companies-by-url
                - search-companies-by-params
                - search-sales-nav-companies-by-url
                - search-sales-nav-companies-by-params
                - similar-companies
            source_input:
              type: object
              additionalProperties: {}
            detected_platform:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
            result_kind:
              type: string
              enum:
                - person
                - company
            status:
              type: string
              enum:
                - active
                - paused
            consecutive_failures:
              type: number
            runs_count:
              type: number
            total_new_results:
              type: number
            title:
              type: string
              nullable: true
            replay_frequency:
              type: string
              nullable: true
              enum:
                - hourly
                - daily
                - weekly
                - monthly
            paused_reason:
              type: string
              nullable: true
              enum:
                - manual
                - too_many_failures
                - account_unavailable
            next_run_at:
              type: string
              nullable: true
            last_run_at:
              type: string
              nullable: true
            mass_action_sid:
              type: string
              nullable: true
            created_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - source_method
            - source_input
            - detected_platform
            - result_kind
            - status
            - consecutive_failures
            - runs_count
            - total_new_results
            - title
            - replay_frequency
            - paused_reason
            - next_run_at
            - last_run_at
            - mass_action_sid
            - created_by
            - deleted_by
            - created_at
            - updated_at
            - deleted_at
        already_exists:
          type: boolean
        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
              nullable: true
              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
              nullable: true
              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
        - already_exists
        - meta
    CreateLinkedinCommentRequest:
      type: object
      description: Request body of `create_linkedin_comment`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "LinkedIn account sid (ln_ac_…), the authoring account. Identity-bound: REQUIRED, posts publish AS this account."
        entity_urn:
          type: string
          minLength: 1
          maxLength: 512
          description: "The post to comment on. A comment is written on the post's social thread, and LinkedIn refuses one sent to any other key (live 2026-09-16: the activity urn of a ugcPost company post answered linkedin_400, its ugcPost urn took the comment), so a post handle is re-addressed at its thread before the wire. urn:li:ugcPost:<id> and urn:li:groupPost:<groupId>-<postId> are the thread and go as is. urn:li:activity:<id> and urn:li:share:<id> cost one post read first (the read enrich_linkedin_post_details makes, on this account, cached 7 days): a share post is commented at its activity urn, a ugcPost post at its ugcPost urn, a repost without commentary at the original. A post the read returns null for (deleted, or not visible to the account) is refused 422 post_not_resolvable. To reply under a comment, pass parent_comment_urn (no post read then); a comment urn given here is a reply under that comment too. A post URL works when the id is in it: the feed permalink, the /posts/<slug>-activity-<id>-<hash> share link, the -ugcPost-<id>- share link. A link WITHOUT an id (a shortlink, a bare slug URL) is refused 422 entity_urn_not_resolvable: call enrich_linkedin_get_activity_urn_by_url first. The post does NOT need to be tracked or owned by us. Renamed from activity_urn on 2026-07-30; the old name is no longer accepted."
        text:
          type: string
          minLength: 1
          maxLength: 1250
          description: The comment body (caller-supplied, no templates or AI in-app).
        parent_comment_urn:
          type: string
          nullable: true
          maxLength: 512
          description: "Reply target: the comment URN to reply under. Omit or null for a top-level comment."
        mentions:
          type: array
          items:
            type: object
            properties:
              profile_id:
                type: string
                minLength: 1
                description: "Who to mention: a bare ACoA… profile id (as get-post-comments and the profile readers return) or the full urn:li:fsd_profile:<id>."
              name:
                type: string
                minLength: 1
                description: The exact substring of text that becomes the clickable link (usually the profile name).
            required:
              - profile_id
              - name
          description: Profile mentions (2026-08-21). Names are matched in text left to right in list order, each search starting after the previous mention. The node computes the character offsets itself.
        client_reference:
          type: string
          nullable: true
          maxLength: 255
          description: "Your key for this ONE comment (max 255, byte for byte): one key per comment, the same key on every repeat of it. The key and its place (the post as LinkedIn files it, named by any of its urns, or for a reply the comment it answers) are one comment whatever it says, and a repeat never goes out twice: it answers 200 with what the first send made (result.idempotent_replay, result.content_differs when this request says something else) or 409 naming error.context.send_outcome (in_flight, unknown with retry_after and send_decisive_at, or sent; not_sent with blocking_activity_log_sid when another comment in doubt holds the place). The same key at another place is another comment. Without a key the same words at the same place count as a repeat for an hour after they went out. check_linkedin_posting_sent asks by it."
        confirmed_not_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS send is not on LinkedIn: its activity_log_sid (ln_al_...), from the 409 or check_linkedin_posting_sent, given only after someone looked on LinkedIn. Taken once the attempt can no longer land (before that: 409 send_outcome_unknown, waiting_for may_still_land, retry_after and send_decisive_at that moment): it settles that attempt not_sent and this request goes out. Moot when the attempt is no longer in doubt; another send's sid is 422 not_this_message."
        confirmed_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS send IS on LinkedIn: its activity_log_sid, as for confirmed_not_sent (never both). Taken at once; it settles the attempt sent and sends nothing: the answer is 409 concurrent_send_in_flight with send_outcome sent while what it made is not known (LinkedIn is read for it), or 200 with it once a read has found it. Another send's sid is 422 not_this_message; an attempt already proved not sent is 409 confirmed_sent_contradicts."
      required:
        - linkedin_account_sid
        - entity_urn
        - text
    CreateLinkedinCommentResponse:
      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: {}
        result:
          type: object
          properties:
            comment_urn:
              type: string
              description: The created comment ref.
            activity_log:
              type: object
              properties: {}
              description: Full dispatch row (linkedin-account-activity-log) per §4.12a. Poll it there by sid for the terminal outcome.
            idempotent_replay:
              type: boolean
              description: "true when this answers a repeat (under the key, or without one the same words at the same place) with what the first send made: nothing was sent now."
            content_differs:
              type: boolean
              description: "With idempotent_replay: true when this request's words (or a post's pictures or video) differ from those of the send that made it."
          required:
            - comment_urn
            - activity_log
        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
              nullable: true
              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
              nullable: true
              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
    CreateLinkedinPostRequest:
      type: object
      description: Request body of `create_linkedin_post`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "LinkedIn account sid (ln_ac_…), the authoring account. Identity-bound: REQUIRED, posts publish AS this account."
        text:
          type: string
          maxLength: 3000
          description: Post body, always present. Empty is legal ONLY alongside an image. 3000 is LinkedIn's own cap, refused here rather than burning a posting slot. Published byte for byte, blank lines included, and so is each image's alt_text.
        images:
          type: array
          items:
            type: object
            properties:
              file_base64:
                type: string
                minLength: 1
                description: "The image bytes of a PNG, JPEG, GIF or WEBP: a data:<mime>;base64,<...> URL or bare base64. Exactly one of file_base64 or url. Checked before anything is dispatched: a damaged file, a non-image or invalid base64 is a 422 on this member (image_corrupt / image_format_unrecognized / image_not_base64) and spends nothing. Base64 typed out by hand is the usual source of damage: prefer url."
              url:
                type: string
                maxLength: 2048
                format: uri
                description: An https URL of the image file, downloaded by us (public hosts only, the same 35 MB post budget, typed and checked by content). Exactly one of file_base64 or url. A request_media_upload file_url works once its upload is done. A link to a web page that shows the image is refused (image_format_unrecognized); fetch problems are media_url_invalid / media_url_host_forbidden / media_url_fetch_failed / media_too_large.
              file_byte_size:
                type: integer
                nullable: true
                minimum: 1
              file_name:
                type: string
                nullable: true
                minLength: 1
                maxLength: 255
              file_type:
                type: string
                nullable: true
                minLength: 1
                maxLength: 255
              alt_text:
                type: string
                nullable: true
                description: Accessibility alt text; may be empty.
          maxItems: 20
          description: "Up to 20 images (the node's own cap; array order = carousel order). Mutually exclusive with video. The decoded bytes across ALL media must stay under 35 MB in total; over that is a 422, because a bigger body is refused by the node's JSON parser as a bare 413 with no response envelope. For 2+ images the backend supplies the account's own member id to the wire itself - no profile_id field exists here. Uploads are sequential node-side, so many large images make a SLOW synchronous call: the post can publish after your client times out, so repeat it only as the same request under the same client_reference, which is answered with the post (or held while LinkedIn is read), never published twice."
        visibility:
          type: string
          enum:
            - ANYONE
            - CONNECTIONS_ONLY
          description: ANYONE (the node default) or CONNECTIONS_ONLY. Omit to let the node apply its own default. Mutually exclusive with group_id.
        allowed_commenters_scope:
          type: string
          enum:
            - ALL
            - CONNECTIONS_ONLY
            - NONE
          description: "Who may comment: ALL (the node default), CONNECTIONS_ONLY, or NONE to disable comments. Works on group posts too."
        video:
          type: object
          properties:
            file_base64:
              type: string
              minLength: 1
              description: "The video bytes: a data:<mime>;base64,<...> URL or bare base64. Exactly one of file_base64 or url."
            url:
              type: string
              maxLength: 2048
              format: uri
              description: An https URL of an MP4, MOV or WEBM file, downloaded by us (public hosts only, within the 35 MB budget). Exactly one of file_base64 or url; a request_media_upload file_url works once uploaded.
            file_byte_size:
              type: integer
              nullable: true
              minimum: 1
            file_name:
              type: string
              nullable: true
              minLength: 1
              maxLength: 255
            file_type:
              type: string
              nullable: true
              minLength: 1
              maxLength: 255
          description: "ONE video, image-shaped minus alt_text. Mutually exclusive with images (LinkedIn does not mix them in a share - 422 here). Shares the 35 MB media budget. The upload is a single large PUT through the browser and is SLOW: the synchronous call can outlive your client timeout while the post still publishes, so repeat it only under the same client_reference."
        scheduled_at:
          type: string
          description: "Schedule the post instead of publishing now: ISO 8601 with timezone, must be in the future (a strictly-past time is a 422; within a minute of now is passed through for LinkedIn to judge). A SCHEDULED share legitimately answers with null activity_urn/url - post_urn is the handle. Read and clean the queue with get_linkedin_scheduled_posts / delete_linkedin_scheduled_post. Scheduling is LinkedIn-side: the draft lives in ITS queue, nothing is stored here. The slot is no part of a key: a retry under the same client_reference that computes a new scheduled_at is the same post. Without a key the slot tells two posts apart."
        mentions:
          type: array
          items:
            type: object
            properties:
              profile_id:
                type: string
                minLength: 1
                description: "Who to mention: a bare ACoA… profile id or the full urn:li:fsd_profile:<id>."
              start:
                type: integer
                minimum: 0
                description: Span start in text, in UTF-16 code units (JS String offsets).
              length:
                type: integer
                minimum: 1
                description: Span length in UTF-16 code units. start+length must fit inside text - out of bounds is a 422 here, not a spent dispatch.
            required:
              - profile_id
              - start
              - length
          description: Profile mentions as READY POSITIONS over text (2026-08-21) - unlike create_linkedin_comment's {profile_id, name} search pairs. Require non-blank text.
        brand_partnership:
          type: boolean
          description: true adds LinkedIn's "Brand partnership" label (paid endorsement). false and absent both send nothing - the wire's own shape.
        author_organization_id:
          type: string
          pattern: ^\d+$
          description: "Post AS a company page the account administers: the bare numeric company id (same form get_linkedin_company_posts takes). Omit to post as the member."
        group_id:
          type: string
          pattern: ^\d+$
          description: "Post INTO a group: the bare numeric group id. Mutually exclusive with visibility - a group post sets container visibility, not member-feed visibility. No read serves a group's feed, so a group post whose answer was lost stays in doubt until a person gives their word."
        client_reference:
          type: string
          nullable: true
          maxLength: 255
          description: "Your key for this ONE post (max 255, byte for byte): one key per post, the same key on every repeat of it. The key and its place (where it lands: your own feed, the company page of author_organization_id or the group of group_id) are one post whatever it says, and a repeat never goes out twice: it answers 200 with what the first send made (result.idempotent_replay, result.content_differs when this request says something else) or 409 naming error.context.send_outcome (in_flight, unknown with retry_after and send_decisive_at, or sent; not_sent with blocking_activity_log_sid when another post in doubt holds the place). The same key at another place is another post. Without a key the same words and pictures or video at the same place and slot count as a repeat for an hour after they went out. check_linkedin_posting_sent asks by it."
        confirmed_not_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS send is not on LinkedIn: its activity_log_sid (ln_al_...), from the 409 or check_linkedin_posting_sent, given only after someone looked on LinkedIn. Taken once the attempt can no longer land (before that: 409 send_outcome_unknown, waiting_for may_still_land, retry_after and send_decisive_at that moment): it settles that attempt not_sent and this request goes out. Moot when the attempt is no longer in doubt; another send's sid is 422 not_this_message."
        confirmed_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS send IS on LinkedIn: its activity_log_sid, as for confirmed_not_sent (never both). Taken at once; it settles the attempt sent and sends nothing: the answer is 409 concurrent_send_in_flight with send_outcome sent while what it made is not known (LinkedIn is read for it), or 200 with it once a read has found it. Another send's sid is 422 not_this_message; an attempt already proved not sent is 409 confirmed_sent_contradicts."
      required:
        - linkedin_account_sid
        - text
    CreateLinkedinPostResponse:
      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: {}
        result:
          type: object
          properties:
            activity_urn:
              type: string
              nullable: true
              description: The published post as an activity urn.
            post_urn:
              type: string
              nullable: true
              description: The same post as urn:li:share:<id>.
            url:
              type: string
              nullable: true
              description: Public post URL, query string already stripped.
            created_at:
              type: string
              nullable: true
              description: Publication time, ISO 8601.
            text:
              type: string
              description: The body LinkedIn actually published, read back off the wire. Empty for an image-only post.
            activity_log:
              type: object
              properties: {}
              description: Full dispatch row (linkedin-account-activity-log) per §4.12a. Poll it there by sid for the terminal outcome.
            idempotent_replay:
              type: boolean
              description: "true when this answers a repeat (under the key, or without one the same words at the same place) with what the first send made: nothing was sent now."
            content_differs:
              type: boolean
              description: "With idempotent_replay: true when this request's words (or a post's pictures or video) differ from those of the send that made it."
          required:
            - activity_urn
            - post_urn
            - url
            - created_at
            - text
            - activity_log
        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
              nullable: true
              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
              nullable: true
              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
    DeleteAntidetectBrowserResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - delete
        item:
          type: object
          additionalProperties: {}
        already_deleted:
          type: boolean
        soft_deleted:
          type: boolean
        cascade:
          type: object
          nullable: true
          properties:
            summary:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  entity:
                    type: string
                  deleted:
                    type: integer
                  cancelled:
                    type: integer
                required:
                  - entity
                  - deleted
            recovery_available_until:
              type: string
              nullable: true
          required:
            - summary
            - details
            - recovery_available_until
        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
              nullable: true
              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
              nullable: true
              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
        - already_deleted
        - soft_deleted
        - cascade
        - meta
    DeleteLinkedinAutoScrapeResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - delete
        item:
          type: object
          additionalProperties: {}
        already_deleted:
          type: boolean
        soft_deleted:
          type: boolean
        retained:
          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
              nullable: true
              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
              nullable: true
              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
        - already_deleted
        - soft_deleted
        - retained
        - meta
    DeleteLinkedinCommentRequest:
      type: object
      description: Request body of `delete_linkedin_comment`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "LinkedIn account sid (ln_ac_…), the authoring account. Identity-bound: REQUIRED, posts publish AS this account."
        comment_urn:
          type: string
          minLength: 1
          maxLength: 512
          description: "The comment to delete, as our comment readers return it: urn:li:comment:(<thread>,<id>) over any post family. The fsd form urn:li:fsd_comment:(<id>,<full thread urn>) that LinkedIn's own responses carry is accepted too and normalized on the wire side."
      required:
        - linkedin_account_sid
        - comment_urn
    DeleteLinkedinCommentResponse:
      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: {}
        result:
          type: object
          properties:
            deleted:
              type: boolean
              enum:
                - true
            activity_log:
              type: object
              properties: {}
              description: Full dispatch row (linkedin-account-activity-log) per §4.12a. Poll it there by sid for the terminal outcome.
          required:
            - deleted
            - activity_log
        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
              nullable: true
              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
              nullable: true
              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
    DeleteLinkedinConversationOnLinkedinResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
          description: kebab-case verb; matches the route segment.
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            conversation_hash:
              type: string
              description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
            nickname:
              type: string
              nullable: true
            participants:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  picture_url:
                    type: string
                    nullable: true
            is_muted:
              type: boolean
              nullable: true
            unread_count:
              type: integer
              nullable: true
              description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
            event_count:
              type: number
            last_activity_at:
              type: string
              nullable: true
            last_stored_message_at:
              type: string
              nullable: true
            last_message_sync_at:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - conversation_hash
            - messenger_type
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - participants
            - is_muted
            - unread_count
            - event_count
            - last_activity_at
            - last_stored_message_at
            - last_message_sync_at
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            status:
              type: string
              description: "The browser task's terminal status: success when the thread is gone from the mailbox."
          required:
            - status
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    DeleteLinkedinMessageOnLinkedinResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            linkedin_conversation_sid:
              type: string
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
            linkedin_type:
              type: string
              enum:
                - message
                - inmail
                - connection_note
                - system
              description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
            type:
              type: string
              enum:
                - inbox
                - outbox
              description: "Direction relative to our account: received / sent."
            automation:
              type: string
              enum:
                - auto
                - manual
                - synced
              description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
            ln_member_id:
              type: string
              nullable: true
              description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
            nickname:
              type: string
              nullable: true
            subject:
              type: string
              nullable: true
            text:
              type: string
            client_reference:
              type: string
              nullable: true
            attachments:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  urn:
                    type: string
                    description: digitalmediaAsset URN; the attachment_urn the download tools take.
                  name:
                    type: string
                  content_type:
                    type: string
                  content_url:
                    type: string
                  file_byte_size:
                    type: number
                  file_name:
                    type: string
                    description: "Rows our send verbs wrote: the file name as sent."
                  file_type:
                    type: string
                    description: "Rows our send verbs wrote: the MIME type as sent."
            reactions:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  emoji:
                    type: string
                  count:
                    type: number
                  is_viewer_reacted:
                    type: boolean
                  first_reacted_at:
                    type: string
                    nullable: true
                required:
                  - emoji
                  - count
                  - is_viewer_reacted
                  - first_reacted_at
            is_deleted:
              type: boolean
            message_hash:
              type: string
            sent_at:
              type: string
            custom_content:
              type: object
              nullable: true
              additionalProperties: {}
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - linkedin_conversation_sid
            - messenger_type
            - linkedin_type
            - type
            - automation
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - subject
            - text
            - client_reference
            - attachments
            - reactions
            - is_deleted
            - message_hash
            - sent_at
            - custom_content
            - 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
              nullable: true
              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
              nullable: true
              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
    DeleteLinkedinPostRequest:
      type: object
      description: Request body of `delete_linkedin_post`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "LinkedIn account sid (ln_ac_…), the authoring account. Identity-bound: REQUIRED, posts publish AS this account."
        activity_urn:
          type: string
          minLength: 1
          maxLength: 512
          description: "The post to delete: urn:li:activity:<id>, a bare numeric activity id, or a post URL carrying the id (converted locally, same rule as entity_urn on the write verbs). urn:li:share: / urn:li:ugcPost: are refused by the wire."
      required:
        - linkedin_account_sid
        - activity_urn
    DeleteLinkedinPostResponse:
      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: {}
        result:
          type: object
          properties:
            deleted:
              type: boolean
              enum:
                - true
              description: "Always true on a 200: a refused delete is a 409, never a success body."
            message:
              type: string
              nullable: true
              description: LinkedIn's own confirmation toast, when it sends one.
            activity_log:
              type: object
              properties: {}
              description: Full dispatch row (linkedin-account-activity-log) per §4.12a. Poll it there by sid for the terminal outcome.
          required:
            - deleted
            - message
            - activity_log
        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
              nullable: true
              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
              nullable: true
              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
    DeleteLinkedinScheduledPostRequest:
      type: object
      description: Request body of `delete_linkedin_scheduled_post`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "LinkedIn account sid (ln_ac_…), the authoring account. Identity-bound: REQUIRED, posts publish AS this account."
        post_urn:
          type: string
          minLength: 1
          maxLength: 512
          description: "The queued share to delete: urn:li:share:<id>, urn:li:ugcPost:<id> or urn:li:groupPost:<groupId>-<postId>, exactly as rows[].post_urn hands it back. The grammar is enforced on the wire."
      required:
        - linkedin_account_sid
        - post_urn
    DeleteLinkedinScheduledPostResponse:
      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: {}
        result:
          type: object
          properties:
            deleted:
              type: boolean
              enum:
                - true
              description: "Always true on a 200: a refused delete is a 409 scheduled_post_not_deleted, never a success body."
            activity_log:
              type: object
              properties: {}
              description: Full dispatch row (linkedin-account-activity-log) per §4.12a. Poll it there by sid for the terminal outcome.
          required:
            - deleted
            - activity_log
        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
              nullable: true
              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
              nullable: true
              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
    DownloadLinkedinMessageAttachmentRequest:
      type: object
      description: Request body of `download_linkedin_message_attachment`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Mailbox owner that received the message: the message row's linkedin_account_sid."
        profile_id:
          type: string
          maxLength: 128
          description: The acting account's OWN profile URN (ln_id of linkedin_account_sid from search_linkedin_accounts), not the sender's.
        message_id:
          type: string
          maxLength: 255
          description: "Raw LinkedIn MessageId: the message row's message_hash (2-… form; the conversation id is decoded from it)."
        attachment_urn:
          type: string
          maxLength: 512
          description: "Which attachment of that message: attachments[i].urn on the stored row (urn:li:digitalmediaAsset:…)."
      required:
        - linkedin_account_sid
        - profile_id
        - message_id
        - attachment_urn
    DownloadLinkedinMessageAttachmentResponse:
      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: {}
        result:
          type: object
          properties:
            data_url:
              type: string
              description: data:<mime>;base64,… . The whole payload, inline.
            content_type:
              type: string
              description: MIME type LinkedIn served the asset with.
            file_byte_size:
              type: number
              description: Decoded size in bytes.
          required:
            - data_url
            - content_type
            - file_byte_size
        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
              nullable: true
              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
              nullable: true
              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
    DownloadLinkedinSalesNavMessageAttachmentRequest:
      type: object
      description: Request body of `download_linkedin_sales_nav_message_attachment`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Mailbox owner (Sales Navigator required): the SN message row's linkedin_account_sid."
        message_id:
          type: string
          maxLength: 255
          description: "Raw LinkedIn MessageId: the message row's message_hash."
        attachment_urn:
          type: string
          maxLength: 512
          description: "Which attachment of that message: attachments[i].urn on the stored row (urn:li:digitalmediaAsset:…)."
      required:
        - linkedin_account_sid
        - message_id
        - attachment_urn
    DownloadLinkedinSalesNavMessageAttachmentResponse:
      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: {}
        result:
          type: object
          properties:
            data_url:
              type: string
              description: data:<mime>;base64,… . The whole payload, inline.
            content_type:
              type: string
              description: MIME type LinkedIn served the asset with.
            file_byte_size:
              type: number
              description: Decoded size in bytes.
          required:
            - data_url
            - content_type
            - file_byte_size
        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
              nullable: true
              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
              nullable: true
              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
    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
          nullable: true
          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:<n> 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:<mime>;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:<mime>;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.
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
                    nullable: true
                    description: The toast LinkedIn showed on the save, when it showed one.
                  previous_about:
                    type: string
                    nullable: true
                    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
                    nullable: true
                    description: "photo / background only: the digitalmediaAsset urn of the full-size original."
                  display_asset_urn:
                    type: string
                    nullable: true
                    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
              nullable: true
              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
              nullable: true
              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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              description: The echoed request skill urn urn:li:fsd_profileEndorsedSkill:(<profileId>,<skillId>), read from value.entityUrn; null when LinkedIn omitted it.
            endorsed_by_viewer:
              type: boolean
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinCompanyLiteProfileRequest:
      type: object
      description: Request body of `enrich_linkedin_company_lite_profile`.
      properties:
        company_url:
          type: string
          nullable: true
          maxLength: 2048
          description: https://www.linkedin.com/company/{slug}/ (or a Sales Nav company URL). Provide company_url XOR domain.
        domain:
          type: string
          nullable: true
          maxLength: 191
          description: "The company website instead of its LinkedIn URL (`acme.com`, `www.acme.com` and `https://acme.com/pricing` all fold to the same host): resolved to a LinkedIn identity through the stored corpus, so a miss is refused company_not_resolvable rather than searched for live. This is the way to turn a domain you already have into the company profile. Provide domain XOR company_url."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinCompanyLiteProfileResponse:
      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: {}
        result:
          type: object
          properties:
            company:
              type: object
              properties:
                id:
                  type: string
                urn:
                  type: string
                public_identifier:
                  type: string
                name:
                  type: string
                logo_url:
                  type: string
                  nullable: true
              required:
                - id
                - urn
                - public_identifier
                - name
                - logo_url
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - company
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinCompanyPostsRequest:
      type: object
      description: Request body of `enrich_linkedin_company_posts`.
      properties:
        company:
          type: object
          properties:
            company_ln_id:
              type: string
              nullable: true
              maxLength: 64
              description: "Numeric LinkedIn company id: the `company_id` returned by enrich_linkedin_company_profile. THIS is the dispatchable form."
            company_url:
              type: string
              nullable: true
              maxLength: 512
              pattern: ^https:\/\/www\.linkedin\.com\/
              description: "Vanity company URL. Ledgered, then refused not_dispatchable: only pass it if you deliberately want that. Provide company_ln_id instead."
          description: Company target; exactly one of company_ln_id / company_url (both or neither is a 422).
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Items per page, 1..100 (wire default 10).
        cursor:
          type: string
          nullable: true
          description: "Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
      required:
        - company
    EnrichLinkedinCompanyPostsResponse:
      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: {}
        result:
          type: object
          properties:
            posts:
              type: object
              properties:
                elements:
                  type: array
                  items:
                    type: object
                    properties:
                      activity_urn:
                        type: string
                      post_urn:
                        type: string
                        nullable: true
                      url:
                        type: string
                        nullable: true
                      created_at:
                        type: string
                        nullable: true
                      text:
                        type: string
                      author:
                        type: object
                        properties:
                          name:
                            type: string
                          headline:
                            type: string
                            nullable: true
                          profile_id:
                            type: string
                            nullable: true
                          public_identifier:
                            type: string
                            nullable: true
                          profile_url:
                            type: string
                            nullable: true
                          picture_url:
                            type: string
                            nullable: true
                        required:
                          - name
                          - headline
                          - profile_id
                          - public_identifier
                          - profile_url
                          - picture_url
                      images:
                        type: array
                        items:
                          type: string
                      is_reshare:
                        type: boolean
                      reshared_post:
                        type: object
                        nullable: true
                        properties:
                          activity_urn:
                            type: string
                            nullable: true
                          url:
                            type: string
                            nullable: true
                          created_at:
                            type: string
                            nullable: true
                          text:
                            type: string
                          author:
                            type: object
                            properties:
                              name:
                                type: string
                              headline:
                                type: string
                                nullable: true
                              profile_id:
                                type: string
                                nullable: true
                              public_identifier:
                                type: string
                                nullable: true
                              profile_url:
                                type: string
                                nullable: true
                              picture_url:
                                type: string
                                nullable: true
                            required:
                              - name
                              - headline
                              - profile_id
                              - public_identifier
                              - profile_url
                              - picture_url
                          images:
                            type: array
                            items:
                              type: string
                        required:
                          - activity_urn
                          - url
                          - created_at
                          - text
                          - author
                          - images
                      group:
                        type: object
                        nullable: true
                        properties:
                          group_id:
                            type: string
                            nullable: true
                          name:
                            type: string
                          url:
                            type: string
                            nullable: true
                          logo_url:
                            type: string
                            nullable: true
                        required:
                          - group_id
                          - name
                          - url
                          - logo_url
                      num_likes:
                        type: number
                      num_comments:
                        type: number
                      num_shares:
                        type: number
                      num_impressions:
                        type: number
                        nullable: true
                      reactions:
                        type: object
                        additionalProperties:
                          type: number
                    required:
                      - activity_urn
                      - post_urn
                      - url
                      - created_at
                      - text
                      - author
                      - images
                      - is_reshare
                      - reshared_post
                      - num_likes
                      - num_comments
                      - num_shares
                      - num_impressions
                      - reactions
                paging:
                  type: object
                  properties: {}
              required:
                - elements
                - paging
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - posts
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinCompanyProfileRequest:
      type: object
      description: Request body of `enrich_linkedin_company_profile`.
      properties:
        company_url:
          type: string
          nullable: true
          maxLength: 2048
          description: https://www.linkedin.com/company/{slug}/ (or a Sales Nav company URL). Provide company_url XOR domain.
        domain:
          type: string
          nullable: true
          maxLength: 191
          description: "The company website instead of its LinkedIn URL (`acme.com`, `www.acme.com` and `https://acme.com/pricing` all fold to the same host): resolved to a LinkedIn identity through the stored corpus, so a miss is refused company_not_resolvable rather than searched for live. This is the way to turn a domain you already have into the company profile. Provide domain XOR company_url."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinCompanyProfileResponse:
      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: {}
        result:
          type: object
          properties:
            company:
              type: object
              properties:
                company_id:
                  type: string
                  nullable: true
                universal_name:
                  type: string
                  nullable: true
                name:
                  type: string
                  nullable: true
                url:
                  type: string
                  nullable: true
                website:
                  type: string
                  nullable: true
                industry:
                  type: string
                  nullable: true
                headquarters:
                  type: string
                  nullable: true
                employee_count_range:
                  type: string
                  nullable: true
                followers_number:
                  type: number
                  nullable: true
                founded_year:
                  type: number
                  nullable: true
                about:
                  type: string
                  nullable: true
                specialities:
                  type: array
                  items:
                    type: string
                logo_url:
                  type: string
                  nullable: true
              required:
                - company_id
                - universal_name
                - name
                - url
                - website
                - industry
                - headquarters
                - employee_count_range
                - followers_number
                - founded_year
                - about
                - specialities
                - logo_url
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - company
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinCompanyPublicIdentifierRequest:
      type: object
      description: Request body of `enrich_linkedin_company_public_identifier`.
      properties:
        company_id:
          type: string
          maxLength: 32
          pattern: ^\d+$
          description: Numeric LinkedIn company id, e.g. from a Sales Navigator URL or an organization urn.
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
      required:
        - company_id
    EnrichLinkedinCompanyPublicIdentifierResponse:
      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: {}
        result:
          type: object
          properties:
            public_identifier:
              type: string
              nullable: true
              description: The vanity slug, or null when the id resolves to nothing.
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - public_identifier
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinGetActivityUrnByUrlRequest:
      type: object
      description: Request body of `enrich_linkedin_get_activity_urn_by_url`.
      properties:
        url:
          type: string
          maxLength: 2048
          description: Any linkedin.com post URL (feed permalink, /posts/ slug, shortlink).
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
      required:
        - url
    EnrichLinkedinGetActivityUrnByUrlResponse:
      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: {}
        result:
          type: object
          properties:
            activity_urn:
              type: string
              nullable: true
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - activity_urn
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonBasicProfileRequest:
      type: object
      description: Request body of `enrich_linkedin_person_basic_profile`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonBasicProfileResponse:
      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: {}
        result:
          type: object
          properties:
            profile:
              type: object
              properties:
                id:
                  type: string
                urn:
                  type: string
                member_id:
                  type: string
                  nullable: true
                public_identifier:
                  type: string
                first_name:
                  type: string
                last_name:
                  type: string
                full_name:
                  type: string
                headline:
                  type: string
                  nullable: true
                primary_language:
                  type: string
                  description: Profile LOCALE, not a spoken language.
                supported_languages:
                  type: array
                  items:
                    type: string
                  description: Profile locales, not spoken languages, and no proficiency.
                country:
                  type: string
                  nullable: true
                location:
                  type: string
                  nullable: true
                picture_url:
                  type: string
                  nullable: true
                background_picture_url:
                  type: string
                  nullable: true
                is_premium:
                  type: boolean
                is_influencer:
                  type: boolean
                is_creator:
                  type: boolean
                is_memorialized:
                  type: boolean
                has_verified_profile:
                  type: boolean
                has_premium_subscriber_badge:
                  type: boolean
              required:
                - id
                - urn
                - member_id
                - public_identifier
                - first_name
                - last_name
                - full_name
                - headline
                - country
                - location
                - picture_url
                - background_picture_url
                - is_premium
                - is_influencer
                - is_creator
                - is_memorialized
                - has_verified_profile
                - has_premium_subscriber_badge
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - profile
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonCertificationsRequest:
      type: object
      description: Request body of `enrich_linkedin_person_certifications`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonCertificationsResponse:
      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: {}
        result:
          type: object
          properties:
            certifications:
              type: array
              items:
                type: object
                properties:
                  name:
                    type: string
                  authority:
                    type: string
                    nullable: true
                  license_number:
                    type: string
                    nullable: true
                  issued_at:
                    type: string
                    nullable: true
                  expires_at:
                    type: string
                    nullable: true
                  url:
                    type: string
                    nullable: true
                required:
                  - name
                  - authority
                  - license_number
                  - issued_at
                  - expires_at
                  - url
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - certifications
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonCommentActivityRequest:
      type: object
      description: Request body of `enrich_linkedin_person_comment_activity`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Items per page, 1..100 (wire default 10).
        cursor:
          type: string
          nullable: true
          description: "Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonCommentActivityResponse:
      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: {}
        result:
          type: object
          properties:
            comments:
              type: array
              items:
                type: object
                properties:
                  comment_urn:
                    type: string
                  activity_urn:
                    type: string
                  post_url:
                    type: string
                    nullable: true
                  post_author:
                    type: object
                    nullable: true
                    properties:
                      name:
                        type: string
                      headline:
                        type: string
                        nullable: true
                      profile_id:
                        type: string
                        nullable: true
                      public_identifier:
                        type: string
                        nullable: true
                      profile_url:
                        type: string
                        nullable: true
                      picture_url:
                        type: string
                        nullable: true
                    required:
                      - name
                      - headline
                      - profile_id
                      - public_identifier
                      - profile_url
                      - picture_url
                  text:
                    type: string
                  created_at:
                    type: string
                    nullable: true
                required:
                  - comment_urn
                  - activity_urn
                  - post_url
                  - post_author
                  - text
                  - created_at
            paging:
              type: object
              properties:
                page_size:
                  type: integer
                  nullable: true
                page_cursor:
                  type: string
                  nullable: true
                next_page_cursor:
                  type: string
                  nullable: true
                  description: Pass back as `cursor` for the next page. NULL means the feed is over. There is deliberately no total.
              required:
                - page_size
                - page_cursor
                - next_page_cursor
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - comments
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonContactInfoRequest:
      type: object
      description: Request body of `enrich_linkedin_person_contact_info`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonContactInfoResponse:
      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: {}
        result:
          type: object
          properties:
            contact_info:
              type: object
              properties:
                email:
                  type: string
                  nullable: true
                phones:
                  type: array
                  items:
                    type: object
                    properties:
                      type:
                        type: string
                        nullable: true
                      number:
                        type: string
                    required:
                      - type
                      - number
                websites:
                  type: array
                  items:
                    type: object
                    properties:
                      url:
                        type: string
                      category:
                        type: string
                        nullable: true
                      label:
                        type: string
                        nullable: true
                    required:
                      - url
                      - category
                      - label
                twitter_handles:
                  type: array
                  items:
                    type: string
              required:
                - email
                - phones
                - websites
                - twitter_handles
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - contact_info
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonEducationRequest:
      type: object
      description: Request body of `enrich_linkedin_person_education`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonEducationResponse:
      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: {}
        result:
          type: object
          properties:
            educations:
              type: array
              items:
                type: object
                properties:
                  school_name:
                    type: string
                    nullable: true
                  company_id:
                    type: string
                    nullable: true
                  degree:
                    type: string
                    nullable: true
                  field_of_study:
                    type: string
                    nullable: true
                  start_date:
                    type: string
                    nullable: true
                  end_date:
                    type: string
                    nullable: true
                  description:
                    type: string
                    nullable: true
                required:
                  - school_name
                  - company_id
                  - degree
                  - field_of_study
                  - start_date
                  - end_date
                  - description
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - educations
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonExperienceRequest:
      type: object
      description: Request body of `enrich_linkedin_person_experience`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Items per page, 1..100 (wire default 10).
        cursor:
          type: string
          nullable: true
          description: "Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonExperienceResponse:
      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: {}
        result:
          type: object
          properties:
            experience:
              type: object
              properties:
                elements:
                  type: array
                  items:
                    type: object
                    properties:
                      company_name:
                        type: string
                        nullable: true
                      company_public_identifier:
                        type: string
                        nullable: true
                      company_id:
                        type: string
                        nullable: true
                      position:
                        type: string
                        nullable: true
                      employment_type:
                        type: string
                        nullable: true
                      location:
                        type: string
                        nullable: true
                      start_date:
                        type: string
                        nullable: true
                      end_date:
                        type: string
                        nullable: true
                      description:
                        type: string
                        nullable: true
                      position_id:
                        type: string
                        nullable: true
                        description: "The connected account's OWN profile only: the numeric id behind urn:li:fsd_profilePosition, the key of the position editing verbs. Absent on other members' profiles."
                    required:
                      - company_name
                      - company_public_identifier
                      - company_id
                      - position
                      - employment_type
                      - location
                      - start_date
                      - end_date
                      - description
                paging:
                  type: object
                  properties: {}
              required:
                - elements
                - paging
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - experience
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonFeaturedRequest:
      type: object
      description: Request body of `enrich_linkedin_person_featured`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonFeaturedResponse:
      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: {}
        result:
          type: object
          properties:
            featured:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                    nullable: true
                  url:
                    type: string
                    nullable: true
                  activity_urn:
                    type: string
                    nullable: true
                  title:
                    type: string
                    nullable: true
                  subtitle:
                    type: string
                    nullable: true
                  text:
                    type: string
                    nullable: true
                  image_url:
                    type: string
                    nullable: true
                  num_likes:
                    type: number
                    nullable: true
                  num_comments:
                    type: number
                    nullable: true
                required:
                  - type
                  - url
                  - activity_urn
                  - title
                  - subtitle
                  - text
                  - image_url
                  - num_likes
                  - num_comments
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - featured
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonFullProfileRequest:
      type: object
      description: Request body of `enrich_linkedin_person_full_profile`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonFullProfileResponse:
      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: {}
        result:
          type: object
          properties:
            profile:
              type: object
              properties:
                ln_member_id:
                  type: string
                  nullable: true
                ln_id:
                  type: string
                  nullable: true
                sn_id:
                  type: string
                  nullable: true
                nickname:
                  type: string
                  nullable: true
                full_name:
                  type: string
                network_distance:
                  type: string
                  nullable: true
                  description: Relationship degree relative to the pinned executor account ('1st' / '2nd' / '3rd'…). Null when no linkedin_account_sid was pinned, when the payload came from a cache another account filled, or when the wire did not report one. Never a degree relative to an account you did not name.
                headline:
                  type: string
                  nullable: true
                position:
                  type: string
                  nullable: true
                company_name:
                  type: string
                  nullable: true
                company_public_identifier:
                  type: string
                  nullable: true
                country:
                  type: string
                  nullable: true
                location:
                  type: string
                  nullable: true
                about:
                  type: string
                  nullable: true
                avatar_url:
                  type: string
                  nullable: true
                email:
                  type: string
                  nullable: true
                phone:
                  type: string
                  nullable: true
                twitter:
                  type: string
                  nullable: true
                facebook:
                  type: string
                  nullable: true
                connections_number:
                  type: number
                  nullable: true
                followers_number:
                  type: number
                  nullable: true
                primary_language:
                  type: string
                  nullable: true
                supported_languages:
                  type: array
                  items:
                    type: string
                has_open_profile:
                  type: boolean
                  nullable: true
                has_verified_profile:
                  type: boolean
                  nullable: true
                has_premium:
                  type: boolean
                  nullable: true
                experience:
                  type: array
                  items:
                    type: object
                    properties: {}
                educations:
                  type: array
                  items:
                    type: object
                    properties: {}
                skills:
                  type: array
                  items:
                    type: object
                    properties: {}
                posts:
                  type: array
                  items:
                    type: object
                    properties: {}
                top_voices:
                  type: array
                  items:
                    type: object
                    properties: {}
                featured:
                  type: array
                  items:
                    type: object
                    properties: {}
              required:
                - ln_member_id
                - ln_id
                - sn_id
                - nickname
                - full_name
                - network_distance
                - headline
                - position
                - company_name
                - company_public_identifier
                - country
                - location
                - about
                - avatar_url
                - email
                - phone
                - twitter
                - facebook
                - connections_number
                - followers_number
                - primary_language
                - supported_languages
                - has_open_profile
                - has_verified_profile
                - has_premium
                - experience
                - educations
                - skills
                - posts
                - top_voices
                - featured
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - profile
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonInterestsRequest:
      type: object
      description: Request body of `enrich_linkedin_person_interests`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        tab:
          type: string
          nullable: true
          enum:
            - top_voices
            - companies
            - groups
            - newsletters
            - schools
          description: Which interests tab to read; top_voices when omitted. One tab per call, each its own read.
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Items per page, 1..100 (wire default 10).
        cursor:
          type: string
          nullable: true
          description: "Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonInterestsResponse:
      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: {}
        result:
          type: object
          properties:
            tab:
              type: string
              description: The tab this response is for, echoed back from the request.
            interests:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                    nullable: true
                  urn:
                    type: string
                    nullable: true
                  name:
                    type: string
                  subtitle:
                    type: string
                    nullable: true
                  url:
                    type: string
                    nullable: true
                  public_identifier:
                    type: string
                    nullable: true
                  image_url:
                    type: string
                    nullable: true
                    description: "LinkedIn CDN link, wire passthrough: it carries LinkedIn's own expiry (roughly 30 days)."
                  followers_text:
                    type: string
                    nullable: true
                  followers_count:
                    type: number
                    nullable: true
                    description: "Null on a group card by design: a group renders a members line, a different metric that is not laundered into the followers fields."
                required:
                  - type
                  - urn
                  - name
                  - subtitle
                  - url
                  - public_identifier
                  - image_url
                  - followers_text
                  - followers_count
            paging:
              type: object
              properties:
                page_size:
                  type: integer
                  nullable: true
                page_cursor:
                  type: string
                  nullable: true
                next_page_cursor:
                  type: string
                  nullable: true
                  description: Pass back as `cursor` for the next page. NULL means the feed is over. There is deliberately no total.
              required:
                - page_size
                - page_cursor
                - next_page_cursor
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - tab
            - interests
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonLanguagesRequest:
      type: object
      description: Request body of `enrich_linkedin_person_languages`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonLanguagesResponse:
      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: {}
        result:
          type: object
          properties:
            languages:
              type: array
              items:
                type: object
                properties:
                  name:
                    type: string
                  proficiency:
                    type: string
                    nullable: true
                required:
                  - name
                  - proficiency
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - languages
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonLiteProfileRequest:
      type: object
      description: Request body of `enrich_linkedin_person_lite_profile`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonLiteProfileResponse:
      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: {}
        result:
          type: object
          properties:
            profile:
              type: object
              properties:
                ln_member_id:
                  type: string
                  nullable: true
                ln_id:
                  type: string
                  nullable: true
                sn_id:
                  type: string
                  nullable: true
                nickname:
                  type: string
                  nullable: true
                full_name:
                  type: string
                network_distance:
                  type: string
                  nullable: true
                  description: Relationship degree relative to the pinned executor account ('1st' / '2nd' / '3rd'…). Null when no linkedin_account_sid was pinned, when the payload came from a cache another account filled, or when the wire did not report one. Never a degree relative to an account you did not name.
              required:
                - ln_member_id
                - ln_id
                - sn_id
                - nickname
                - full_name
                - network_distance
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - profile
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonPostsRequest:
      type: object
      description: Request body of `enrich_linkedin_person_posts`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Items per page, 1..100 (wire default 10).
        cursor:
          type: string
          nullable: true
          description: "Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonPostsResponse:
      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: {}
        result:
          type: object
          properties:
            posts:
              type: object
              properties:
                elements:
                  type: array
                  items:
                    type: object
                    properties:
                      activity_urn:
                        type: string
                      post_urn:
                        type: string
                        nullable: true
                      url:
                        type: string
                        nullable: true
                      created_at:
                        type: string
                        nullable: true
                      text:
                        type: string
                      author:
                        type: object
                        properties:
                          name:
                            type: string
                          headline:
                            type: string
                            nullable: true
                          profile_id:
                            type: string
                            nullable: true
                          public_identifier:
                            type: string
                            nullable: true
                          profile_url:
                            type: string
                            nullable: true
                          picture_url:
                            type: string
                            nullable: true
                        required:
                          - name
                          - headline
                          - profile_id
                          - public_identifier
                          - profile_url
                          - picture_url
                      images:
                        type: array
                        items:
                          type: string
                      is_reshare:
                        type: boolean
                      reshared_post:
                        type: object
                        nullable: true
                        properties:
                          activity_urn:
                            type: string
                            nullable: true
                          url:
                            type: string
                            nullable: true
                          created_at:
                            type: string
                            nullable: true
                          text:
                            type: string
                          author:
                            type: object
                            properties:
                              name:
                                type: string
                              headline:
                                type: string
                                nullable: true
                              profile_id:
                                type: string
                                nullable: true
                              public_identifier:
                                type: string
                                nullable: true
                              profile_url:
                                type: string
                                nullable: true
                              picture_url:
                                type: string
                                nullable: true
                            required:
                              - name
                              - headline
                              - profile_id
                              - public_identifier
                              - profile_url
                              - picture_url
                          images:
                            type: array
                            items:
                              type: string
                        required:
                          - activity_urn
                          - url
                          - created_at
                          - text
                          - author
                          - images
                      group:
                        type: object
                        nullable: true
                        properties:
                          group_id:
                            type: string
                            nullable: true
                          name:
                            type: string
                          url:
                            type: string
                            nullable: true
                          logo_url:
                            type: string
                            nullable: true
                        required:
                          - group_id
                          - name
                          - url
                          - logo_url
                      num_likes:
                        type: number
                      num_comments:
                        type: number
                      num_shares:
                        type: number
                      num_impressions:
                        type: number
                        nullable: true
                      reactions:
                        type: object
                        additionalProperties:
                          type: number
                    required:
                      - activity_urn
                      - post_urn
                      - url
                      - created_at
                      - text
                      - author
                      - images
                      - is_reshare
                      - reshared_post
                      - num_likes
                      - num_comments
                      - num_shares
                      - num_impressions
                      - reactions
                paging:
                  type: object
                  properties: {}
              required:
                - elements
                - paging
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - posts
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonReactionActivityRequest:
      type: object
      description: Request body of `enrich_linkedin_person_reaction_activity`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Items per page, 1..100 (wire default 10).
        cursor:
          type: string
          nullable: true
          description: "Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonReactionActivityResponse:
      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: {}
        result:
          type: object
          properties:
            reactions:
              type: array
              items:
                type: object
                properties:
                  reaction_type:
                    type: string
                    nullable: true
                    description: LIKE / PRAISE / EMPATHY / INTEREST / APPRECIATION / ENTERTAINMENT / MAYBE, or null when the header phrase did not map. Null is the wire being honest, not a parse failure.
                  reacted_at:
                    type: string
                    nullable: true
                    description: "ISO 8601 with milliseconds: when the TARGET reacted, which is not the post's own time (post.created_at, kept in wire epoch-ms)."
                  activity_urn:
                    type: string
                    nullable: true
                  post_url:
                    type: string
                    nullable: true
                  post_author:
                    type: object
                    nullable: true
                    properties:
                      name:
                        type: string
                      headline:
                        type: string
                        nullable: true
                      profile_id:
                        type: string
                        nullable: true
                      public_identifier:
                        type: string
                        nullable: true
                      profile_url:
                        type: string
                        nullable: true
                      picture_url:
                        type: string
                        nullable: true
                    required:
                      - name
                      - headline
                      - profile_id
                      - public_identifier
                      - profile_url
                      - picture_url
                  post:
                    type: object
                    nullable: true
                    properties: {}
                    description: The parent post passed through whole, so you can read what they reacted to without a second call.
                required:
                  - reaction_type
                  - reacted_at
                  - activity_urn
                  - post_url
                  - post_author
                  - post
            paging:
              type: object
              properties:
                page_size:
                  type: integer
                  nullable: true
                page_cursor:
                  type: string
                  nullable: true
                next_page_cursor:
                  type: string
                  nullable: true
                  description: Pass back as `cursor` for the next page. NULL means the feed is over. There is deliberately no total.
              required:
                - page_size
                - page_cursor
                - next_page_cursor
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - reactions
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonRecommendationsRequest:
      type: object
      description: Request body of `enrich_linkedin_person_recommendations`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        direction:
          type: string
          nullable: true
          enum:
            - received
            - given
          description: received (default) = written ABOUT the target; given = written BY the target. Separate reads, so each spends the method.
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonRecommendationsResponse:
      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: {}
        result:
          type: object
          properties:
            recommendations:
              type: array
              items:
                type: object
                properties:
                  direction:
                    type: string
                    enum:
                      - received
                      - given
                  counterpart:
                    type: object
                    properties:
                      ln_member_id:
                        type: string
                        nullable: true
                      ln_id:
                        type: string
                        nullable: true
                      sn_id:
                        type: string
                        nullable: true
                      nickname:
                        type: string
                        nullable: true
                      full_name:
                        type: string
                        nullable: true
                      headline:
                        type: string
                        nullable: true
                    required:
                      - ln_member_id
                      - ln_id
                      - sn_id
                      - nickname
                      - full_name
                      - headline
                  relationship:
                    type: string
                    nullable: true
                  text:
                    type: string
                  created_at:
                    type: string
                    nullable: true
                required:
                  - direction
                  - counterpart
                  - relationship
                  - text
                  - created_at
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - recommendations
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonServicesRequest:
      type: object
      description: Request body of `enrich_linkedin_person_services`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonServicesResponse:
      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: {}
        result:
          type: object
          properties:
            services:
              type: object
              nullable: true
              properties:
                page_id:
                  type: string
                  nullable: true
                  description: The page's vanity slug for a published page (the tail of /services/page/<slug>; an older capture carried a numeric id). The whole result is null while the owner keeps the page unpublished.
                page_url:
                  type: string
                  nullable: true
                business_name:
                  type: string
                  nullable: true
                provider_name:
                  type: string
                  nullable: true
                provider_public_identifier:
                  type: string
                  nullable: true
                pricing_text:
                  type: string
                  nullable: true
                services_provided:
                  type: array
                  items:
                    type: string
              required:
                - page_id
                - page_url
                - business_name
                - provider_name
                - provider_public_identifier
                - pricing_text
                - services_provided
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - services
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPersonSkillsRequest:
      type: object
      description: Request body of `enrich_linkedin_person_skills`.
      properties:
        profile_id:
          type: string
          maxLength: 128
          description: ln_id (ACoAA…) or sn_id (ACwAA…), interchangeable for dispatch. Provide profile_id XOR public_identifier.
        public_identifier:
          type: string
          maxLength: 2048
          description: "Vanity slug from /in/…, or the whole profile URL it comes from (any linkedin.com host, locale or mwlite prefix, query and trailing slash included): the URL is reduced to the slug before dispatch, and both forms share one ledger entry. A linkedin.com URL that is NOT a profile URL is refused 422 public_identifier_not_resolvable instead of being sent as a slug. Provide public_identifier XOR profile_id. On sub-record methods a slug-only call needs a stored URN (run person-lite-profile first) or is refused not_dispatchable."
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Items per page, 1..100 (wire default 10).
        cursor:
          type: string
          nullable: true
          description: "Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page."
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPersonSkillsResponse:
      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: {}
        result:
          type: object
          properties:
            skills:
              type: object
              properties:
                elements:
                  type: array
                  items:
                    type: object
                    properties:
                      name:
                        type: string
                      skill_id:
                        type: string
                        nullable: true
                      urn:
                        type: string
                        nullable: true
                      endorsement_count:
                        type: number
                        nullable: true
                    required:
                      - name
                      - skill_id
                      - urn
                      - endorsement_count
                paging:
                  type: object
                  properties: {}
              required:
                - elements
                - paging
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - skills
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    EnrichLinkedinPostDetailsRequest:
      type: object
      description: Request body of `enrich_linkedin_post_details`.
      properties:
        post_urn:
          type: string
          maxLength: 128
          description: "The post handle, in any family the wire takes: urn:li:activity:<id>, urn:li:share:<id>, urn:li:ugcPost:<id>, urn:li:groupPost:<group>-<post>, or a bare id (digits = activity, digits-digits = groupPost). Provide post_urn XOR url."
        url:
          type: string
          maxLength: 2048
          description: Any post URL, a lnkd.in shortlink included. A feed permalink or a slug link carrying the id (activity or ugcPost family) resolves locally, one round trip; a shortlink is expanded server-side first (this is the form Copy link to post mints) and then resolves the same way; a linkedin.com link with NO id in it is fetched by the link itself, also one round trip. Provide url XOR post_urn.
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). Given: the call runs on that account ONLY; a saturated or held enrichment bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Replay guard (team_sid, idempotency_key). A repeat with the same key returns the stored ledger outcome without running again, except a failure that answered with retry_after: once that time has passed, a repeat under the same key runs again."
        trust_cache_max_age_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: 'Accept a stored payload this many days old instead of fetching (probe tier 2, §9.5): a hit answers with served_from_cache / cache_source "data_cluster", spending no browser run and no bucket slot. Omitted, the stored payload is never consulted and the call always dispatches.'
    EnrichLinkedinPostDetailsResponse:
      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: {}
        result:
          type: object
          properties:
            post:
              type: object
              nullable: true
              properties:
                activity_urn:
                  type: string
                post_urn:
                  type: string
                  nullable: true
                url:
                  type: string
                  nullable: true
                created_at:
                  type: string
                  nullable: true
                text:
                  type: string
                author:
                  type: object
                  properties:
                    name:
                      type: string
                    headline:
                      type: string
                      nullable: true
                    profile_id:
                      type: string
                      nullable: true
                    public_identifier:
                      type: string
                      nullable: true
                    profile_url:
                      type: string
                      nullable: true
                    picture_url:
                      type: string
                      nullable: true
                  required:
                    - name
                    - headline
                    - profile_id
                    - public_identifier
                    - profile_url
                    - picture_url
                images:
                  type: array
                  items:
                    type: string
                is_reshare:
                  type: boolean
                reshared_post:
                  type: object
                  nullable: true
                  properties:
                    activity_urn:
                      type: string
                      nullable: true
                    url:
                      type: string
                      nullable: true
                    created_at:
                      type: string
                      nullable: true
                    text:
                      type: string
                    author:
                      type: object
                      properties:
                        name:
                          type: string
                        headline:
                          type: string
                          nullable: true
                        profile_id:
                          type: string
                          nullable: true
                        public_identifier:
                          type: string
                          nullable: true
                        profile_url:
                          type: string
                          nullable: true
                        picture_url:
                          type: string
                          nullable: true
                      required:
                        - name
                        - headline
                        - profile_id
                        - public_identifier
                        - profile_url
                        - picture_url
                    images:
                      type: array
                      items:
                        type: string
                  required:
                    - activity_urn
                    - url
                    - created_at
                    - text
                    - author
                    - images
                group:
                  type: object
                  nullable: true
                  properties:
                    group_id:
                      type: string
                      nullable: true
                    name:
                      type: string
                    url:
                      type: string
                      nullable: true
                    logo_url:
                      type: string
                      nullable: true
                  required:
                    - group_id
                    - name
                    - url
                    - logo_url
                num_likes:
                  type: number
                num_comments:
                  type: number
                num_shares:
                  type: number
                num_impressions:
                  type: number
                  nullable: true
                reactions:
                  type: object
                  additionalProperties:
                    type: number
              required:
                - activity_urn
                - post_urn
                - url
                - created_at
                - text
                - author
                - images
                - is_reshare
                - reshared_post
                - num_likes
                - num_comments
                - num_shares
                - num_impressions
                - reactions
            data_request:
              type: object
              properties: {}
              description: 'The kind="enrich" DataRequest journal row (status / served_from_cache / cached_from_sid). The public audit anchor for this call. A receipt: its result_ref is null here, the payload is the item next to it; get_data_request by sid reads the stored payload back.'
          required:
            - post
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ExecuteLinkedinCustomRequestRequest:
      type: object
      description: Request body of `execute_linkedin_custom_request`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "REQUIRED executor: the OWN account (ln_ac_…) the call runs as. Every custom request runs on the account named here, carrying that account's session, permissions and limits, so name the account whose identity the request should carry. There is no default and no substitute: omit it and the call is rejected."
        url:
          type: string
          minLength: 1
          maxLength: 2048
          description: 'Absolute LinkedIn URL (e.g. "https://www.linkedin.com/voyager/api/…") or a bare path (resolved against https://www.linkedin.com). MUST match the server host + path allowlist (provisional: *.linkedin.com + path prefixes /voyager/api/, /sales-api/). Otherwise 403 forbidden_endpoint.'
        method:
          type: string
          enum:
            - GET
            - POST
          description: HTTP verb, default GET. Write-shaped verbs (PUT/DELETE/PATCH) are out of scope at launch (SAFETY).
        headers:
          type: object
          additionalProperties:
            type: string
          description: Extra request headers merged onto the default voyager headers.
        body:
          anyOf:
            - type: object
              additionalProperties: {}
            - type: string
            - {}
          description: POST JSON body (object → JSON-encoded) or raw string (passed through); ≤ 50 KB serialized; null/omitted for GET.
        form:
          type: boolean
          description: "Modifier: when true, send `body` as application/x-www-form-urlencoded (NOT a separate body). POST only."
        include_default_headers:
          type: boolean
          description: Inject the plugin's default voyager headers (default true); false to send only `headers`.
      required:
        - linkedin_account_sid
        - url
    ExecuteLinkedinCustomRequestResponse:
      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: {}
        result:
          type: object
          properties:
            status_code:
              type: integer
              description: "The HTTP status the plugin observed: ANY value; the verb never throws on non-2xx."
            ok:
              type: boolean
              description: true iff status_code ∈ [200,299].
            headers:
              type: object
              additionalProperties:
                type: string
              description: Response headers the plugin observed.
            body:
              description: Parsed response body (JSON when parseable, else raw string). Returned inline, NOT persisted at rest.
            activity_log:
              type: object
              properties: {}
              description: Full dispatch row (linkedin-account-activity-log, action_type=custom_request) per §4.12a.
          required:
            - status_code
            - ok
            - headers
            - activity_log
        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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              maxLength: 64
              description: Sales Navigator member id.
            nickname:
              type: string
              nullable: true
              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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
    GenerateCloudBrowserAccessKeyRequest:
      type: object
      description: Request body of `generate_cloud_browser_access_key`.
      properties:
        sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ab_br_
          description: Antidetect browser sid (ab_br_…).
        ttl_hours:
          type: integer
          minimum: 1
          maximum: 720
          description: Key lifetime in hours (default 8; the link is a bearer secret, keep it short). Sets expires_at on the entry.
        max_connects:
          type: integer
          minimum: 1
          maximum: 1000
          description: "Cap on CONCURRENT sessions held on this key, counted live at connect. Not a lifetime quota: a key does not spend itself and never becomes exhausted. Omit for unlimited."
        allowed_ips:
          type: array
          items:
            type: string
            maxLength: 45
          description: IP allow-list checked at connect time.
        allowed_countries:
          type: array
          items:
            type: string
            minLength: 2
            maxLength: 2
          description: ISO country allow-list checked at connect time.
        purpose:
          type: string
          enum:
            - relogin
            - recruiter_relogin
            - share
          description: "What the page behind the link does: relogin = sign the LinkedIn session back in and re-bind the browser on confirm (default); share = drive the browser, no sign-in step; recruiter_relogin = the relogin flow aimed at LinkedIn Recruiter (2026-09-15): the cloud browser opens on linkedin.com/talent so the seat holder signs the Recruiter session back in, and the confirmed restart re-checks the account's recruiter_status."
        send_to_email:
          type: string
          maxLength: 255
          format: email
          description: Also email the link to this address, typically the person who holds the LinkedIn password and has no account on the platform. The mail is queued after the key is committed; result.sent_to_email echoes the address. A malformed address is 422 and mints nothing.
      required:
        - sid
    GenerateCloudBrowserAccessKeyResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
              nullable: true
            automation_server_sid:
              type: string
              nullable: true
            account_share_sid:
              type: string
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            vendor_provider:
              type: string
              enum:
                - gologin
                - multilogin
                - adspower
                - dolphin
            vendor_name:
              type: string
              nullable: true
            vendor_profile_id:
              type: string
              nullable: true
            browser_owner:
              type: string
              enum:
                - platform
                - customer
            status:
              type: string
              enum:
                - stopped
                - queued_to_start
                - initializing
                - running
                - idle
                - queued_to_stop
                - start_issue
                - running_issue
                - login_issue
                - restricted
                - client_error_investigation
                - support_error_investigation
                - maintenance
                - shared_out
                - subscription_required
            error_reason:
              type: string
              nullable: true
            fail_count:
              type: number
            last_fail_at:
              type: string
              nullable: true
            logout_count:
              type: number
            last_logout_at:
              type: string
              nullable: true
            last_start_at:
              type: string
              nullable: true
            last_health_check_at:
              type: string
              nullable: true
            last_activity_at:
              type: string
              nullable: true
            antidetect_browser_proxy_sid:
              type: string
              nullable: true
            proxy_country_code:
              type: string
              nullable: true
            custom_proxy:
              type: object
              nullable: true
              properties:
                ip:
                  type: string
                port:
                  type: integer
                mode:
                  type: string
                username:
                  type: string
                  nullable: true
                exit_ip:
                  type: string
                  nullable: true
                latency_ms:
                  type: integer
                  nullable: true
              required:
                - ip
                - port
                - mode
                - username
                - exit_ip
                - latency_ms
            proxy_5g:
              type: boolean
              description: "5G Proxy add-on: the browser runs on the dedicated 5G mobile route (faster command execution, fewer retries). Each flagged browser occupies one add-on slot."
            cloud_browser_access:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                    nullable: true
                    minLength: 18
                    maxLength: 18
                    pattern: ^cb_ak_
                    description: "The bearer token itself, in full, for a caller holding can_manage_cloud_browser_external_links (the permission that mints it: reading a key is the same power as minting one, since the public connect checks nothing but the key). null for every other caller; the entry stays so the link, its expiry and its use can still be listed. On cloud-browser-sessions it is masked to the last 4."
                  expires_at:
                    type: string
                    nullable: true
                    description: ISO 8601 expiry; null means it never expires. Checked at connect and never again, so a session can outlive its own key.
                  max_connects:
                    type: number
                    nullable: true
                    description: Cap on CONCURRENT sessions on this key; null means unlimited.
                  allowed_ips:
                    type: array
                    nullable: true
                    items:
                      type: string
                  allowed_countries:
                    type: array
                    nullable: true
                    items:
                      type: string
                  purpose:
                    type: string
                    enum:
                      - relogin
                      - recruiter_relogin
                      - share
                    description: What the public page behind the link does. Stamped at mint and never re-negotiated at connect, because the visitor is unauthenticated. Absent on keys minted before the field existed, which the backend reads as relogin.
                required:
                  - key
                  - expires_at
                  - max_connects
                  - allowed_ips
                  - allowed_countries
              description: The smart links minted on this browser; the key itself only for a caller holding can_manage_cloud_browser_external_links, null otherwise (2026-09-16). Each console open used to leave a throwaway entry here; minting now sweeps entries that expired over 24h ago, so this is the live link list rather than a log.
            vendor_profile_shares:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  email:
                    type: string
                  role:
                    type: string
                  shared_at:
                    type: string
                    nullable: true
                  shared_by:
                    type: string
                    nullable: true
                  vendor_share_id:
                    type: string
                    nullable: true
                required:
                  - email
                  - role
                  - shared_at
                  - shared_by
                  - vendor_share_id
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - automation_server_sid
            - account_share_sid
            - share_role
            - vendor_provider
            - vendor_name
            - vendor_profile_id
            - browser_owner
            - status
            - error_reason
            - fail_count
            - last_fail_at
            - logout_count
            - last_logout_at
            - last_start_at
            - last_health_check_at
            - last_activity_at
            - antidetect_browser_proxy_sid
            - proxy_country_code
            - custom_proxy
            - proxy_5g
            - cloud_browser_access
            - vendor_profile_shares
            - created_by
            - deleted_by
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            access_key:
              type: object
              properties:
                key:
                  type: string
                  nullable: true
                  minLength: 18
                  maxLength: 18
                  pattern: ^cb_ak_
                  description: "The bearer token itself, in full, for a caller holding can_manage_cloud_browser_external_links (the permission that mints it: reading a key is the same power as minting one, since the public connect checks nothing but the key). null for every other caller; the entry stays so the link, its expiry and its use can still be listed. On cloud-browser-sessions it is masked to the last 4."
                expires_at:
                  type: string
                  nullable: true
                  description: ISO 8601 expiry; null means it never expires. Checked at connect and never again, so a session can outlive its own key.
                max_connects:
                  type: number
                  nullable: true
                  description: Cap on CONCURRENT sessions on this key; null means unlimited.
                allowed_ips:
                  type: array
                  nullable: true
                  items:
                    type: string
                allowed_countries:
                  type: array
                  nullable: true
                  items:
                    type: string
                purpose:
                  type: string
                  enum:
                    - relogin
                    - recruiter_relogin
                    - share
                  description: What the public page behind the link does. Stamped at mint and never re-negotiated at connect, because the visitor is unauthenticated. Absent on keys minted before the field existed, which the backend reads as relogin.
              required:
                - key
                - expires_at
                - max_connects
                - allowed_ips
                - allowed_countries
              description: "The minted entry, key included. Shown once: the key is a bearer secret and is never read back in full from any other surface."
            public_connect_url:
              type: string
              description: Shareable smart link carrying the key. Give this to the person who will open it.
            sent_to_email:
              type: string
              description: "Present only when the request carried send_to_email: the address the link was mailed to. A queued send, not a delivery receipt."
          required:
            - access_key
            - public_connect_url
        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
              nullable: true
              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
              nullable: true
              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
    GetAntidetectBrowserResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - get
        item:
          type: object
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
              nullable: true
            automation_server_sid:
              type: string
              nullable: true
            account_share_sid:
              type: string
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            vendor_provider:
              type: string
              enum:
                - gologin
                - multilogin
                - adspower
                - dolphin
            vendor_name:
              type: string
              nullable: true
            vendor_profile_id:
              type: string
              nullable: true
            browser_owner:
              type: string
              enum:
                - platform
                - customer
            status:
              type: string
              enum:
                - stopped
                - queued_to_start
                - initializing
                - running
                - idle
                - queued_to_stop
                - start_issue
                - running_issue
                - login_issue
                - restricted
                - client_error_investigation
                - support_error_investigation
                - maintenance
                - shared_out
                - subscription_required
            error_reason:
              type: string
              nullable: true
            fail_count:
              type: number
            last_fail_at:
              type: string
              nullable: true
            logout_count:
              type: number
            last_logout_at:
              type: string
              nullable: true
            last_start_at:
              type: string
              nullable: true
            last_health_check_at:
              type: string
              nullable: true
            last_activity_at:
              type: string
              nullable: true
            antidetect_browser_proxy_sid:
              type: string
              nullable: true
            proxy_country_code:
              type: string
              nullable: true
            custom_proxy:
              type: object
              nullable: true
              properties:
                ip:
                  type: string
                port:
                  type: integer
                mode:
                  type: string
                username:
                  type: string
                  nullable: true
                exit_ip:
                  type: string
                  nullable: true
                latency_ms:
                  type: integer
                  nullable: true
              required:
                - ip
                - port
                - mode
                - username
                - exit_ip
                - latency_ms
            proxy_5g:
              type: boolean
              description: "5G Proxy add-on: the browser runs on the dedicated 5G mobile route (faster command execution, fewer retries). Each flagged browser occupies one add-on slot."
            cloud_browser_access:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                    nullable: true
                    minLength: 18
                    maxLength: 18
                    pattern: ^cb_ak_
                    description: "The bearer token itself, in full, for a caller holding can_manage_cloud_browser_external_links (the permission that mints it: reading a key is the same power as minting one, since the public connect checks nothing but the key). null for every other caller; the entry stays so the link, its expiry and its use can still be listed. On cloud-browser-sessions it is masked to the last 4."
                  expires_at:
                    type: string
                    nullable: true
                    description: ISO 8601 expiry; null means it never expires. Checked at connect and never again, so a session can outlive its own key.
                  max_connects:
                    type: number
                    nullable: true
                    description: Cap on CONCURRENT sessions on this key; null means unlimited.
                  allowed_ips:
                    type: array
                    nullable: true
                    items:
                      type: string
                  allowed_countries:
                    type: array
                    nullable: true
                    items:
                      type: string
                  purpose:
                    type: string
                    enum:
                      - relogin
                      - recruiter_relogin
                      - share
                    description: What the public page behind the link does. Stamped at mint and never re-negotiated at connect, because the visitor is unauthenticated. Absent on keys minted before the field existed, which the backend reads as relogin.
                required:
                  - key
                  - expires_at
                  - max_connects
                  - allowed_ips
                  - allowed_countries
              description: The smart links minted on this browser; the key itself only for a caller holding can_manage_cloud_browser_external_links, null otherwise (2026-09-16). Each console open used to leave a throwaway entry here; minting now sweeps entries that expired over 24h ago, so this is the live link list rather than a log.
            vendor_profile_shares:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  email:
                    type: string
                  role:
                    type: string
                  shared_at:
                    type: string
                    nullable: true
                  shared_by:
                    type: string
                    nullable: true
                  vendor_share_id:
                    type: string
                    nullable: true
                required:
                  - email
                  - role
                  - shared_at
                  - shared_by
                  - vendor_share_id
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - automation_server_sid
            - account_share_sid
            - share_role
            - vendor_provider
            - vendor_name
            - vendor_profile_id
            - browser_owner
            - status
            - error_reason
            - fail_count
            - last_fail_at
            - logout_count
            - last_logout_at
            - last_start_at
            - last_health_check_at
            - last_activity_at
            - antidetect_browser_proxy_sid
            - proxy_country_code
            - custom_proxy
            - proxy_5g
            - cloud_browser_access
            - vendor_profile_shares
            - created_by
            - deleted_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
              nullable: true
              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
              nullable: true
              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
    GetAntidetectBrowserSeatUsageResponse:
      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: {}
        result:
          type: object
          properties:
            accounts_used:
              type: integer
              minimum: 0
              description: Live browser rows the team holds. This is the count the create gate refuses on (402 insufficient_slots).
            proxy_5g_used:
              type: integer
              minimum: 0
              description: Of those, the ones carrying the 5G Proxy add-on.
          required:
            - accounts_used
            - proxy_5g_used
        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
              nullable: true
              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
              nullable: true
              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
    GetCloudBrowserSessionsMetricsRequest:
      type: object
      description: Request body of `get_cloud_browser_sessions_metrics`.
      properties:
        filter:
          type: object
          properties:
            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
            cloud_browser_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            connected_user_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            access_type:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            ip:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            ip_country:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            ip_city:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            fingerprint_hash:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            is_login_case:
              type: object
              properties:
                eq:
                  type: boolean
              additionalProperties: false
            login_result:
              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
            login_confirmed_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            connected_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            disconnected_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            session_duration_seconds:
              type: object
              properties:
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
                is_null:
                  type: boolean
              additionalProperties: false
            disconnect_cause:
              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
            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
        period:
          type: object
          properties:
            from:
              type: string
              description: ISO 8601 UTC window start (inclusive).
            to:
              type: string
              description: ISO 8601 UTC window end (exclusive); must be after from.
          required:
            - from
            - to
          description: Required metrics window [from, to).
        group_by:
          type: string
          enum:
            - access_type
            - login_result
            - is_login_case
            - ip_country
            - antidetect_browser_sid
            - linkedin_account_sid
            - connected_user_sid
            - disconnect_cause
          description: Optional single split axis.
      required:
        - period
    GetCloudBrowserSessionsMetricsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - metrics
        metrics:
          type: object
          properties:
            filter:
              type: object
              additionalProperties: {}
            period:
              type: object
              properties:
                from:
                  type: string
                to:
                  type: string
              required:
                - from
                - to
            aggregated:
              type: object
              properties:
                counts:
                  type: object
                  additionalProperties: {}
                metrics:
                  type: object
                  properties:
                    avg_session_duration_seconds:
                      type: number
                      nullable: true
                    p95_session_duration_seconds:
                      type: number
                      nullable: true
                    unique_ips_count:
                      type: number
                    unique_devices_count:
                      type: number
                    login_success_rate:
                      type: number
                      nullable: true
                  required:
                    - avg_session_duration_seconds
                    - p95_session_duration_seconds
                    - unique_ips_count
                    - unique_devices_count
                    - login_success_rate
            metrics:
              type: object
              properties:
                avg_session_duration_seconds:
                  type: number
                  nullable: true
                p95_session_duration_seconds:
                  type: number
                  nullable: true
                unique_ips_count:
                  type: number
                unique_devices_count:
                  type: number
                login_success_rate:
                  type: number
                  nullable: true
              required:
                - avg_session_duration_seconds
                - p95_session_duration_seconds
                - unique_ips_count
                - unique_devices_count
                - login_success_rate
        applied_filters:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - metrics
        - meta
    GetDataRequestResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - get
        item:
          type: object
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
              nullable: true
            kind:
              type: string
              enum:
                - enrich
                - scrape
            method:
              type: string
              enum:
                - person_lite_profile
                - person_basic_profile
                - person_full_profile
                - person_experience
                - person_skills
                - person_education
                - person_posts
                - person_featured
                - person_contact_info
                - person_languages
                - person_certifications
                - person_recommendations
                - person_comment_activity
                - person_reaction_activity
                - person_interests
                - person_services
                - company_profile
                - company_lite_profile
                - company_public_identifier
                - company_posts
                - post_details
                - get_activity_urn_by_url
                - search_people_by_url
                - search_people_by_params
                - search_sales_nav_people_by_url
                - search_sales_nav_people_by_params
                - search_service_providers
                - search_service_providers_by_url
                - similar_profiles
                - search_jobs
                - search_jobs_by_url
                - search_events
                - search_events_by_url
                - search_groups
                - search_groups_by_url
                - search_courses
                - search_courses_by_url
                - search_products
                - search_products_by_url
                - search_schools
                - search_schools_by_url
                - search_companies_by_url
                - search_companies_by_params
                - search_sales_nav_companies_by_url
                - search_sales_nav_companies_by_params
                - similar_companies
                - company_employees
                - company_decision_makers
                - search_posts
                - search_posts_by_url
                - get_post_comments
                - get_post_reactors
                - get_post_resharers
                - search_param_id_lookup
                - search_sales_nav_param_id_lookup
                - search_recruiter_people_by_params
                - search_recruiter_people_by_url
                - search_recruiter_param_id_lookup
            status:
              type: string
              enum:
                - pending
                - running
                - completed
                - rejected
                - failed
            input_kind:
              type: string
              enum:
                - ln_id
                - sn_id
                - nickname
                - ln_member_id
                - url
                - activity_urn
                - params
                - domain
            input_value:
              type: string
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            executed_on:
              type: string
              nullable: true
              enum:
                - own_account
                - infra_pool
            served_from_cache:
              type: boolean
            cached_from_sid:
              type: string
              nullable: true
            idempotency_key:
              type: string
              nullable: true
            result_ref:
              anyOf:
                - type: string
                - type: object
                  additionalProperties: {}
                - type: array
                  items: {}
                - {}
              description: "The stored result payload (inline object/array, or a string pointer). Null on the receipt a scrape / enrich response embeds as result.data_request: that response carries the data as rows / the item, and get_data_request by sid reads the stored payload back."
            error_code:
              type: string
              nullable: true
            created_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                trace_id:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            completed_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - kind
            - method
            - status
            - input_kind
            - input_value
            - ln_member_id
            - ln_id
            - sn_id
            - nickname
            - executed_on
            - served_from_cache
            - cached_from_sid
            - idempotency_key
            - result_ref
            - error_code
            - created_by
            - created_at
            - updated_at
            - completed_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
              nullable: true
              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
              nullable: true
              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
    GetLatestLinkedinBenchmarkResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            period_start:
              type: string
            period_end:
              type: string
            period_iso_week:
              type: string
            sample_size:
              type: number
            group_1:
              type: object
              additionalProperties: {}
              description: Business conversions (MARKET_BENCHMARKS.md §3).
            group_2:
              type: object
              additionalProperties: {}
              description: LinkedIn quota hits (§4).
            group_3:
              type: object
              additionalProperties: {}
              description: LinkedIn logouts (§5).
            created_at:
              type: string
          required:
            - sid
            - period_start
            - period_end
            - period_iso_week
            - sample_size
            - group_1
            - group_2
            - group_3
            - created_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
              nullable: true
              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
              nullable: true
              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
    GetLinkedinAccountActivityLogMetricsRequest:
      type: object
      description: Request body of `get_linkedin_account_activity_log_metrics`.
      properties:
        filter:
          type: object
          properties:
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: "REQUIRED: metrics rejects an unbounded scan with bounded_scan_required."
            status:
              type: object
              properties:
                eq:
                  type: string
              additionalProperties: false
              description: pending | success | failed | skipped. Only .eq is applied here.
        period:
          type: object
          properties:
            from:
              type: string
              description: ISO 8601 UTC window start (inclusive).
            to:
              type: string
              description: ISO 8601 UTC window end (exclusive); must be after from.
          required:
            - from
            - to
          description: Required metrics window [from, to), max 90 days.
        group_by:
          type: string
          enum:
            - action_type
            - status
            - linkedin_account_sid
          description: Optional single split axis.
      required:
        - period
    GetLinkedinAccountActivityLogMetricsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - metrics
        metrics:
          type: object
          properties:
            filter:
              type: object
              additionalProperties: {}
            period:
              type: object
              properties:
                from:
                  type: string
                to:
                  type: string
              required:
                - from
                - to
            aggregated:
              type: object
              properties:
                counts:
                  type: object
                  additionalProperties: {}
                metrics:
                  type: object
                  properties:
                    avg_duration_ms:
                      type: number
                      nullable: true
                    avg_pending_age_seconds:
                      type: number
                      nullable: true
                  required:
                    - avg_duration_ms
                    - avg_pending_age_seconds
            metrics:
              type: object
              properties:
                avg_duration_ms:
                  type: number
                  nullable: true
                avg_pending_age_seconds:
                  type: number
                  nullable: true
              required:
                - avg_duration_ms
                - avg_pending_age_seconds
        applied_filters:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - metrics
        - meta
    GetLinkedinAccountMyAnalyticsRequest:
      type: object
      description: Request body of `get_linkedin_account_my_analytics`.
      properties:
        date_from:
          type: string
          nullable: true
          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
          nullable: true
          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.
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
                        nullable: true
                        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
                        nullable: true
                        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
              nullable: true
              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
              nullable: true
              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
          nullable: true
          description: Pass paging.next_page_cursor back verbatim. Omitted or null starts at the top of the feed.
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
                        nullable: true
                        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
                        nullable: true
                        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
                        nullable: true
                        description: The person the card is about, as rendered. May carry emoji that a profile field would not.
                      prompt_text:
                        type: string
                        nullable: true
                        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
                        nullable: true
                        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
                        nullable: true
                        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
                        nullable: true
                      last_name:
                        type: string
                        nullable: true
                      url:
                        type: string
                        nullable: true
                      public_identifier:
                        type: string
                        nullable: true
                      profile_id:
                        type: string
                        nullable: true
                      member_urn:
                        type: string
                        nullable: true
                      image_url:
                        type: string
                        nullable: true
                    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
                      nullable: true
                      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
                      nullable: true
                      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
                      nullable: true
                      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
              nullable: true
              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
              nullable: true
              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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
          nullable: true
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    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.
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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:<c>,<p>), verbatim.
                      project_id:
                        type: string
                        nullable: true
                        description: Parsed from the urn; null when the shape did not match (the urn stays authoritative).
                      contract_id:
                        type: string
                        nullable: true
                      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
                      nullable: true
                      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
              nullable: true
              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
              nullable: true
              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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    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
          nullable: true
          description: Pass paging.next_page_cursor back verbatim. Omitted or null starts at the top of the feed.
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
                        nullable: true
                        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
                        nullable: true
                      network_distance:
                        type: string
                        nullable: true
                        description: 'Rendered degree: "1st" / "2nd" / "3rd". LinkedIn prefixes the line with punctuation, which is stripped before you see it.'
                      url:
                        type: string
                        nullable: true
                        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
                        nullable: true
                        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
                        nullable: true
                        description: ACoA member id. Present only when the card offered the MESSAGE action, which depends on network distance.
                      member_urn:
                        type: string
                        nullable: true
                        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
                        nullable: true
                        description: Viewer avatar. An anonymized card renders a ghost placeholder and carries none.
                      company_logo_url:
                        type: string
                        nullable: true
                      viewed_at_text:
                        type: string
                        nullable: true
                        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
                        nullable: true
                        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
                      nullable: true
                      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
                      nullable: true
                      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
                      nullable: true
                      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
              nullable: true
              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
              nullable: true
              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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
                    nullable: true
                    description: urn:li:ts_contract:N, verbatim.
                  contract_name:
                    type: string
                    nullable: true
                  category:
                    type: string
                    nullable: true
                    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
                    nullable: true
                  sso_enabled:
                    type: boolean
                    nullable: true
                  application_instance_urn:
                    type: string
                    nullable: true
                  enterprise_profile_urn:
                    type: string
                    nullable: true
                  enterprise_account_id:
                    type: string
                    nullable: true
                    description: Parsed from enterprise_profile_urn; null when its shape did not match.
                  enterprise_profile_id:
                    type: string
                    nullable: true
                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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
                  nullable: true
                  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
                  nullable: true
                  description: The ts_contract number.
                contract_seat_urn:
                  type: string
                  nullable: true
                  description: urn:li:ts_contract_seat:(urn:li:ts_contract:N,urn:li:ts_seat:M), verbatim.
                profile_id:
                  type: string
                  nullable: true
                  description: The talent (AEMAA…) id of the logged-in recruiter.
                first_name:
                  type: string
                  nullable: true
                last_name:
                  type: string
                  nullable: true
                headline:
                  type: string
                  nullable: true
                public_profile_url:
                  type: string
                  nullable: true
                picture_url:
                  type: string
                  nullable: true
                  description: Largest avatar artifact.
                using_multiple_contracts:
                  type: boolean
                  nullable: true
                  description: True when the recruiter holds seats on several contracts; the sync uses the session default seat.
                seat_state:
                  type: string
                  nullable: true
                  description: '"ACTIVE" observed. Open vocabulary.'
                contract_name:
                  type: string
                  nullable: true
                contract_type:
                  type: string
                  nullable: true
                  description: '"AGENCY2" observed. Open vocabulary.'
                account_name:
                  type: string
                  nullable: true
                company_name:
                  type: string
                  nullable: true
                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
                  nullable: true
                  description: Seat entitlement. Null when the entitlement list itself was absent, which is not the same as false.
                can_send_paid_inmail:
                  type: boolean
                  nullable: true
                  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
              nullable: true
              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
              nullable: true
              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
    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
          nullable: true
          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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
                        nullable: true
                        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
                        nullable: true
                        description: 'Rendered headline, e.g. "Suggested lead: Jane shared a post".'
                      body_text:
                        type: string
                        nullable: true
                        description: The shared post text. Shared-update alerts only.
                      subline:
                        type: string
                        nullable: true
                        description: Secondary line, e.g. "Acme Corp, Head of Sales".
                      published_at:
                        type: integer
                        nullable: true
                        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
                        nullable: true
                      score:
                        type: number
                        nullable: true
                        description: LinkedIn's own relevance score for the alert. This is what the feed order is built on.
                      action_target:
                        type: string
                        nullable: true
                        description: "Main click-through: the post for a shared update, the sales profile page otherwise."
                      entity_url:
                        type: string
                        nullable: true
                        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
                        nullable: true
                        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
                        nullable: true
                        description: urn:li:fs_salesProfile:(...) of the lead the alert is about.
                      company_urn:
                        type: string
                        nullable: true
                        description: urn:li:fs_salesCompany:N, on account-level alerts.
                      primary_cta:
                        type: object
                        nullable: true
                        properties:
                          text:
                            type: string
                            nullable: true
                          type:
                            type: string
                            nullable: true
                            description: VIEW_UPDATE, MESSAGE, SAVE_LEAD and so on. Open vocabulary, same as the alert type.
                          action_target:
                            type: string
                            nullable: true
                        description: The action LinkedIn suggests for this alert. Present or null; when present, every field inside it may still be null.
                      lead:
                        type: object
                        nullable: true
                        properties:
                          entity_urn:
                            type: string
                            nullable: true
                          first_name:
                            type: string
                            nullable: true
                          last_name:
                            type: string
                            nullable: true
                          full_name:
                            type: string
                            nullable: true
                          degree:
                            type: integer
                            nullable: true
                            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
                            nullable: true
                            description: Whether this lead is saved in Sales Navigator.
                          image_url:
                            type: string
                            nullable: true
                        description: The lead this alert is about. Present or null; when present, every field inside it may still be null.
                      account:
                        type: object
                        nullable: true
                        properties:
                          entity_urn:
                            type: string
                            nullable: true
                          name:
                            type: string
                            nullable: true
                          saved:
                            type: boolean
                            nullable: true
                            description: Whether this company is saved as an account in Sales Navigator.
                          image_url:
                            type: string
                            nullable: true
                        description: The company this alert is about, on account-level kinds. Same presence rule as lead.
                      image_url:
                        type: string
                        nullable: true
                        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
                  nullable: true
                  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
                      nullable: true
                      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
                      nullable: true
                      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
                      nullable: true
                      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
              nullable: true
              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
              nullable: true
              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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
                  nullable: true
                open_messaging:
                  type: boolean
                review_visibility:
                  type: boolean
                  nullable: true
                  description: "null while the page is unpublished: the form drops the element."
                pricing:
                  type: object
                  properties:
                    kind:
                      type: string
                    currency:
                      type: string
                      nullable: true
                    amount:
                      type: number
                      nullable: true
                  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
              nullable: true
              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
              nullable: true
              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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
                        nullable: true
                        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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    GetLinkedinAccountSyncRunResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - get
        item:
          type: object
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            sync_type:
              type: string
              enum:
                - connections
                - connection_requests
                - connection_invitations
                - conversations
                - sales_navigator_conversations
                - recruiter_conversations
                - messages
                - sales_navigator_messages
                - followers
                - following
                - snapshot
                - premium_check
            sync_mode:
              type: string
              enum:
                - initial
                - incremental
            scope_sid:
              type: string
              nullable: true
            triggered_by:
              type: string
              enum:
                - scheduler
                - account_created
                - reset_sync
                - event_handler
            next_cursor:
              type: string
              nullable: true
            status:
              type: string
              enum:
                - pending
                - in_progress
                - completed
                - cancelled
              description: "No failed state: dispatch failure is a browser problem, run is deferred."
            items_saved:
              type: number
            items_deleted:
              type: number
            pages_fetched:
              type: number
            last_progress_at:
              type: string
              nullable: true
            attempt_count:
              type: number
            next_attempt_at:
              type: string
              nullable: true
            wait_reason:
              type: string
              nullable: true
            started_at:
              type: string
              nullable: true
            finished_at:
              type: string
              nullable: true
            error_message:
              type: string
              nullable: true
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - sync_type
            - sync_mode
            - scope_sid
            - triggered_by
            - next_cursor
            - status
            - items_saved
            - items_deleted
            - pages_fetched
            - last_progress_at
            - attempt_count
            - next_attempt_at
            - wait_reason
            - started_at
            - finished_at
            - error_message
            - created_by
            - created_at
            - updated_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
              nullable: true
              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
              nullable: true
              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
    GetLinkedinAccountSyncRunsMetricsRequest:
      type: object
      description: Request body of `get_linkedin_account_sync_runs_metrics`.
      properties:
        period:
          type: object
          properties:
            from:
              type: string
              description: ISO 8601 UTC window start (inclusive).
            to:
              type: string
              description: ISO 8601 UTC window end (exclusive); must be after from.
          required:
            - from
            - to
          description: Required metrics window [from, to).
        group_by:
          type: string
          enum:
            - status
            - sync_type
            - triggered_by
          description: Optional single split axis.
      required:
        - period
    GetLinkedinAccountSyncRunsMetricsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - metrics
        metrics:
          type: object
          properties:
            filter:
              type: object
              additionalProperties: {}
            period:
              type: object
              properties:
                from:
                  type: string
                to:
                  type: string
              required:
                - from
                - to
            aggregated:
              type: object
              properties:
                counts:
                  type: object
                  additionalProperties: {}
                metrics:
                  type: object
                  properties:
                    avg_completed_duration_seconds:
                      type: number
                      nullable: true
                  required:
                    - avg_completed_duration_seconds
            metrics:
              type: object
              properties:
                avg_completed_duration_seconds:
                  type: number
                  nullable: true
              required:
                - avg_completed_duration_seconds
        applied_filters:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - metrics
        - meta
    GetLinkedinAutoScrapeResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - get
        item:
          type: object
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            source_method:
              type: string
              enum:
                - search-people-by-url
                - search-people-by-params
                - search-sales-nav-people-by-url
                - search-sales-nav-people-by-params
                - similar-profiles
                - company-employees
                - company-decision-makers
                - get-post-comments
                - get-post-reactors
                - get-post-resharers
                - search-service-providers
                - search-service-providers-by-url
                - search-companies-by-url
                - search-companies-by-params
                - search-sales-nav-companies-by-url
                - search-sales-nav-companies-by-params
                - similar-companies
            source_input:
              type: object
              additionalProperties: {}
            detected_platform:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
            result_kind:
              type: string
              enum:
                - person
                - company
            status:
              type: string
              enum:
                - active
                - paused
            consecutive_failures:
              type: number
            runs_count:
              type: number
            total_new_results:
              type: number
            title:
              type: string
              nullable: true
            replay_frequency:
              type: string
              nullable: true
              enum:
                - hourly
                - daily
                - weekly
                - monthly
            paused_reason:
              type: string
              nullable: true
              enum:
                - manual
                - too_many_failures
                - account_unavailable
            next_run_at:
              type: string
              nullable: true
            last_run_at:
              type: string
              nullable: true
            mass_action_sid:
              type: string
              nullable: true
            created_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - source_method
            - source_input
            - detected_platform
            - result_kind
            - status
            - consecutive_failures
            - runs_count
            - total_new_results
            - title
            - replay_frequency
            - paused_reason
            - next_run_at
            - last_run_at
            - mass_action_sid
            - created_by
            - deleted_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
              nullable: true
              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
              nullable: true
              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
    GetLinkedinAutoScrapeRunResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - get
        item:
          type: object
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_auto_scrape_sid:
              type: string
            linkedin_account_sid:
              type: string
            run_number:
              type: number
            trigger:
              type: string
              enum:
                - initial
                - scheduled
                - manual
            status:
              type: string
              enum:
                - pending
                - in_progress
                - completed
                - failed
            page_cursor:
              type: number
            pages_applied:
              type: number
            results_seen:
              type: number
            new_count:
              type: number
            seen_count:
              type: number
            enrolled_count:
              type: number
            mass_action_sid:
              type: string
              nullable: true
            completed_at:
              type: string
              nullable: true
            failed_at:
              type: string
              nullable: true
            error_message:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
          required:
            - sid
            - team_sid
            - linkedin_auto_scrape_sid
            - linkedin_account_sid
            - run_number
            - trigger
            - status
            - page_cursor
            - pages_applied
            - results_seen
            - new_count
            - seen_count
            - enrolled_count
            - mass_action_sid
            - completed_at
            - failed_at
            - error_message
            - created_at
            - updated_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
              nullable: true
              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
              nullable: true
              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
    GetLinkedinConnectionInvitationsMetricsRequest:
      type: object
      description: Request body of `get_linkedin_connection_invitations_metrics`.
      properties:
        filter:
          type: object
          properties:
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
        period:
          type: object
          properties:
            from:
              type: string
              description: ISO 8601 UTC window start (inclusive).
            to:
              type: string
              description: ISO 8601 UTC window end (exclusive); must be after from.
          required:
            - from
            - to
          description: Required metrics window [from, to).
      required:
        - period
    GetLinkedinConnectionInvitationsMetricsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - metrics
        metrics:
          type: object
          properties:
            filter:
              type: object
              additionalProperties: {}
            period:
              type: object
              properties:
                from:
                  type: string
                to:
                  type: string
              required:
                - from
                - to
            aggregated:
              type: object
              properties:
                counts:
                  type: object
                  additionalProperties: {}
                metrics:
                  type: object
                  properties:
                    avg_time_to_triage_seconds:
                      type: number
                      nullable: true
                  required:
                    - avg_time_to_triage_seconds
            metrics:
              type: object
              properties:
                avg_time_to_triage_seconds:
                  type: number
                  nullable: true
              required:
                - avg_time_to_triage_seconds
        applied_filters:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - metrics
        - meta
    GetLinkedinConnectionRequestsMetricsRequest:
      type: object
      description: Request body of `get_linkedin_connection_requests_metrics`.
      properties:
        filter:
          type: object
          properties:
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
        period:
          type: object
          properties:
            from:
              type: string
              description: ISO 8601 UTC window start (inclusive).
            to:
              type: string
              description: ISO 8601 UTC window end (exclusive); must be after from.
          required:
            - from
            - to
          description: Required metrics window [from, to).
      required:
        - period
    GetLinkedinConnectionRequestsMetricsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - metrics
        metrics:
          type: object
          properties:
            filter:
              type: object
              additionalProperties: {}
            period:
              type: object
              properties:
                from:
                  type: string
                to:
                  type: string
              required:
                - from
                - to
            aggregated:
              type: object
              properties:
                counts:
                  type: object
                  additionalProperties: {}
                metrics:
                  type: object
                  properties:
                    avg_note_length_of_accepted:
                      type: number
                      nullable: true
                    avg_time_to_accept_seconds:
                      type: number
                      nullable: true
                  required:
                    - avg_note_length_of_accepted
                    - avg_time_to_accept_seconds
            metrics:
              type: object
              properties:
                avg_note_length_of_accepted:
                  type: number
                  nullable: true
                avg_time_to_accept_seconds:
                  type: number
                  nullable: true
              required:
                - avg_note_length_of_accepted
                - avg_time_to_accept_seconds
        applied_filters:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - metrics
        - meta
    GetLinkedinConnectionsMetricsRequest:
      type: object
      description: Request body of `get_linkedin_connections_metrics`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            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
            nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            q:
              type: string
              description: Full-text LIKE over the contact display name (full_name).
            connected_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            last_check_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            linkedin_connection_request_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:false ⇒ born from one of our outbound requests.
            linkedin_connection_invitation_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:false ⇒ born from an inbound invitation we accepted.
            removal_kind:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - removed
                    - blocked
                ne:
                  type: string
                  enum:
                    - removed
                    - blocked
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - removed
                      - blocked
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - removed
                      - blocked
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:true = live row; is_null:false = all churn; eq to split by reason.
            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 rows)."
        period:
          type: object
          properties:
            from:
              type: string
              description: ISO 8601 UTC window start (inclusive).
            to:
              type: string
              description: ISO 8601 UTC window end (exclusive); must be after from.
          required:
            - from
            - to
          description: Required metrics window [from, to).
        group_by:
          type: string
          enum:
            - linkedin_account_sid
            - removal_kind
            - linkedin_connection_request_sid_present
            - linkedin_connection_invitation_sid_present
          description: Optional single split axis.
      required:
        - period
    GetLinkedinConnectionsMetricsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - metrics
        metrics:
          type: object
          properties:
            filter:
              type: object
              additionalProperties: {}
            period:
              type: object
              properties:
                from:
                  type: string
                to:
                  type: string
              required:
                - from
                - to
            aggregated:
              type: object
              properties:
                counts:
                  type: object
                  additionalProperties: {}
                metrics:
                  type: object
                  properties:
                    connections_growth:
                      type: number
                    connections_removed:
                      type: number
                    net_growth:
                      type: number
                    reply_rate_within_connections:
                      type: number
                    dormant_connections:
                      type: number
                    avg_time_to_first_message:
                      type: number
                      nullable: true
                  required:
                    - connections_growth
                    - connections_removed
                    - net_growth
                    - reply_rate_within_connections
                    - dormant_connections
                    - avg_time_to_first_message
            metrics:
              type: object
              properties:
                connections_growth:
                  type: number
                connections_removed:
                  type: number
                net_growth:
                  type: number
                reply_rate_within_connections:
                  type: number
                dormant_connections:
                  type: number
                avg_time_to_first_message:
                  type: number
                  nullable: true
              required:
                - connections_growth
                - connections_removed
                - net_growth
                - reply_rate_within_connections
                - dormant_connections
                - avg_time_to_first_message
        applied_filters:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - metrics
        - meta
    GetLinkedinConversationResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - get
        item:
          type: object
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            conversation_hash:
              type: string
              description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
            nickname:
              type: string
              nullable: true
            participants:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  picture_url:
                    type: string
                    nullable: true
            is_muted:
              type: boolean
              nullable: true
            unread_count:
              type: integer
              nullable: true
              description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
            event_count:
              type: number
            last_activity_at:
              type: string
              nullable: true
            last_stored_message_at:
              type: string
              nullable: true
            last_message_sync_at:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - conversation_hash
            - messenger_type
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - participants
            - is_muted
            - unread_count
            - event_count
            - last_activity_at
            - last_stored_message_at
            - last_message_sync_at
            - created_at
            - updated_at
            - deleted_at
        included:
          type: object
          additionalProperties: {}
        includes:
          type: array
          items:
            type: string
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    GetLinkedinConversationsMetricsRequest:
      type: object
      description: Request body of `get_linkedin_conversations_metrics`.
      properties:
        filter:
          type: object
          properties:
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
          description: Row scope; linkedin_account_sid is REQUIRED (422 without it).
        period:
          type: object
          properties:
            from:
              type: string
              format: date-time
              description: ISO 8601 UTC start (inclusive).
            to:
              type: string
              format: date-time
              description: ISO 8601 UTC end (exclusive); must be after from; window ≤ 90 days.
          required:
            - from
            - to
          description: Metrics time window.
        group_by:
          type: string
          enum:
            - messenger_type
            - linkedin_account_sid
          description: Optional single split axis.
      required:
        - filter
        - period
    GetLinkedinConversationsMetricsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - metrics
        metrics:
          type: object
          properties:
            filter:
              type: object
              additionalProperties: {}
            period:
              type: object
              properties:
                from:
                  type: string
                to:
                  type: string
              required:
                - from
                - to
            aggregated:
              type: object
              properties:
                counts:
                  type: object
                  additionalProperties: {}
                metrics:
                  type: object
                  properties:
                    new_conversations_count:
                      type: integer
                    active_count:
                      type: integer
                  required:
                    - new_conversations_count
                    - active_count
            metrics:
              type: object
              properties:
                new_conversations_count:
                  type: integer
                active_count:
                  type: integer
              required:
                - new_conversations_count
                - active_count
        applied_filters:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - metrics
        - meta
    GetLinkedinFollowersMetricsRequest:
      type: object
      description: Request body of `get_linkedin_followers_metrics`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            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
              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
            nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            q:
              type: string
              description: Full-text LIKE over the follower display name (full_name).
            last_check_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              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
        period:
          type: object
          properties:
            from:
              type: string
              description: ISO 8601 UTC window start (inclusive).
            to:
              type: string
              description: ISO 8601 UTC window end (exclusive); must be after from.
          required:
            - from
            - to
          description: Required metrics window [from, to).
        group_by:
          type: string
          enum:
            - linkedin_account_sid
          description: Optional single split axis.
      required:
        - period
    GetLinkedinFollowersMetricsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - metrics
        metrics:
          type: object
          properties:
            filter:
              type: object
              additionalProperties: {}
            period:
              type: object
              properties:
                from:
                  type: string
                to:
                  type: string
              required:
                - from
                - to
            aggregated:
              type: object
              properties:
                counts:
                  type: object
                  additionalProperties: {}
                metrics:
                  type: object
                  properties:
                    followers_growth:
                      type: number
                    follower_to_connection_conversions:
                      type: number
                    connected_follower_share:
                      type: number
                  required:
                    - followers_growth
                    - follower_to_connection_conversions
                    - connected_follower_share
            metrics:
              type: object
              properties:
                followers_growth:
                  type: number
                follower_to_connection_conversions:
                  type: number
                connected_follower_share:
                  type: number
              required:
                - followers_growth
                - follower_to_connection_conversions
                - connected_follower_share
        applied_filters:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - metrics
        - meta
    GetLinkedinMessagesMetricsRequest:
      type: object
      description: Request body of `get_linkedin_messages_metrics`.
      properties:
        filter:
          type: object
          properties:
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
          description: Row scope; linkedin_account_sid is REQUIRED (422 without it).
        period:
          type: object
          properties:
            from:
              type: string
              format: date-time
              description: ISO 8601 UTC start (inclusive).
            to:
              type: string
              format: date-time
              description: ISO 8601 UTC end (exclusive); must be after from; window ≤ 90 days.
          required:
            - from
            - to
          description: Metrics time window.
        group_by:
          type: string
          enum:
            - linkedin_account_sid
            - linkedin_conversation_sid
            - type
            - linkedin_type
            - automation
            - messenger_type
          description: Optional single split axis.
      required:
        - filter
        - period
    GetLinkedinMessagesMetricsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - metrics
        metrics:
          type: object
          properties:
            filter:
              type: object
              additionalProperties: {}
            period:
              type: object
              properties:
                from:
                  type: string
                to:
                  type: string
              required:
                - from
                - to
            aggregated:
              type: object
              properties:
                counts:
                  type: object
                  additionalProperties: {}
                metrics:
                  type: object
                  properties:
                    reply_rate_pct:
                      type: number
                      nullable: true
                    avg_time_to_reply_seconds:
                      type: number
                      nullable: true
                    avg_thread_depth:
                      type: number
                      nullable: true
                  required:
                    - reply_rate_pct
                    - avg_time_to_reply_seconds
                    - avg_thread_depth
            metrics:
              type: object
              properties:
                reply_rate_pct:
                  type: number
                  nullable: true
                avg_time_to_reply_seconds:
                  type: number
                  nullable: true
                avg_thread_depth:
                  type: number
                  nullable: true
              required:
                - reply_rate_pct
                - avg_time_to_reply_seconds
                - avg_thread_depth
        applied_filters:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
      required:
        - success
        - operation
        - metrics
        - meta
    GetLinkedinScheduledPostsRequest:
      type: object
      description: Request body of `get_linkedin_scheduled_posts`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "LinkedIn account sid (ln_ac_…), the authoring account. Identity-bound: REQUIRED, posts publish AS this account."
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Rows per page, the node's own [1, 100] gate. Defaults to 20.
        cursor:
          type: string
          minLength: 1
          maxLength: 200
          description: The previous page's paging.next_cursor, verbatim. Omit for the first page.
        author_organization_id:
          type: string
          maxLength: 30
          pattern: ^\d+$
          description: "Read a company page's queue instead of the member's own: the bare numeric organization id (as in linkedin.com/company/<id>). The account must administer that page or the queue comes back empty."
      required:
        - linkedin_account_sid
    GetLinkedinScheduledPostsResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  post_urn:
                    type: string
                    nullable: true
                    description: "The queued share's BACKEND urn (urn:li:share:/ugcPost:/groupPost:) - the exact handle delete_linkedin_scheduled_post takes. NOT an activity urn: an unpublished post has no activity yet."
                  scheduled_at:
                    type: string
                    nullable: true
                    description: Planned publication time, ISO 8601; null when the preview did not carry it (best-effort field).
                  text:
                    type: string
                    description: Draft body; empty string when the draft has no text.
                  error_message:
                    type: string
                    nullable: true
                    description: LinkedIn's own preview error (e.g. failed media processing); normally null.
                required:
                  - post_urn
                  - scheduled_at
                  - text
                  - error_message
            paging:
              type: object
              properties:
                next_cursor:
                  type: string
                  nullable: true
                  description: Offset cursor for the next page; null when the queue is exhausted.
                total:
                  type: integer
                  nullable: true
                  description: The wire's total queue size, when it sends one.
              required:
                - next_cursor
                - total
            activity_log:
              type: object
              properties: {}
              description: Full dispatch row (linkedin-account-activity-log) per §4.12a. Poll it there by sid for the terminal outcome.
          required:
            - rows
            - paging
            - activity_log
        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
              nullable: true
              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
              nullable: true
              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
    GetMyLatestLinkedinConnectionInvitationsRequest:
      type: object
      description: Request body of `get_my_latest_linkedin_connection_invitations`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…) of the receiving account.
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Freshest rows to return / refresh coverage target (1..100, default 50).
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor; the LinkedIn-side refresh runs only on the first page (cursor null).
      required:
        - linkedin_account_sid
    GetMyLatestLinkedinConnectionInvitationsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  ln_member_id:
                    type: string
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  note:
                    type: string
                    nullable: true
                  linkedin_invitation_id:
                    type: string
                    nullable: true
                  shared_secret:
                    type: string
                    nullable: true
                  received_at:
                    type: string
                  last_check_at:
                    type: string
                    nullable: true
                  removal_kind:
                    type: string
                    nullable: true
                    enum:
                      - accepted
                      - ignored
                      - expired
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - note
                  - linkedin_invitation_id
                  - shared_secret
                  - received_at
                  - last_check_at
                  - removal_kind
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
        refresh:
          type: object
          properties:
            performed:
              type: boolean
            pages_fetched:
              type: integer
            items_seen:
              type: integer
            items_upserted:
              type: integer
            stop_reason:
              type: string
              nullable: true
          required:
            - performed
            - pages_fetched
            - items_seen
            - items_upserted
            - stop_reason
          description: §5.8 in-request refresh outcome (first page runs the LinkedIn refresh; continuation pages report performed=false).
        pacing:
          type: object
          properties:
            linkedin_account_sid:
              type: string
              description: The account whose bucket the call spent.
            limit_type:
              type: string
              description: The smart-limit bucket the call spent, e.g. send_messages.
            next_call_after:
              type: string
              description: "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands."
            remaining_today:
              type: integer
              minimum: 0
              description: daily_limit minus done_today_count of that bucket, after this call.
          required:
            - linkedin_account_sid
            - limit_type
            - next_call_after
            - remaining_today
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
        - refresh
    GetMyLatestLinkedinConnectionRequestsRequest:
      type: object
      description: Request body of `get_my_latest_linkedin_connection_requests`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…) of the sending account.
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Freshest rows to return / refresh coverage target (1..100, default 50).
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor; the LinkedIn-side refresh runs only on the first page (cursor null).
      required:
        - linkedin_account_sid
    GetMyLatestLinkedinConnectionRequestsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  ln_member_id:
                    type: string
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  note:
                    type: string
                    nullable: true
                  client_reference:
                    type: string
                    nullable: true
                  sent_at:
                    type: string
                    nullable: true
                  invitation_id:
                    type: string
                    nullable: true
                  resend_available_at:
                    type: string
                    nullable: true
                  last_check_at:
                    type: string
                    nullable: true
                  removal_kind:
                    type: string
                    nullable: true
                    enum:
                      - accepted
                      - withdrawn
                      - expired
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - note
                  - client_reference
                  - sent_at
                  - invitation_id
                  - resend_available_at
                  - last_check_at
                  - removal_kind
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
        pacing:
          type: object
          properties:
            linkedin_account_sid:
              type: string
              description: The account whose bucket the call spent.
            limit_type:
              type: string
              description: The smart-limit bucket the call spent, e.g. send_messages.
            next_call_after:
              type: string
              description: "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands."
            remaining_today:
              type: integer
              minimum: 0
              description: daily_limit minus done_today_count of that bucket, after this call.
          required:
            - linkedin_account_sid
            - limit_type
            - next_call_after
            - remaining_today
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    GetMyLatestLinkedinConnectionsRequest:
      type: object
      description: Request body of `get_my_latest_linkedin_connections`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…) whose network is acted on.
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Freshest rows to return / refresh coverage target (1..100, default 50).
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor; the LinkedIn-side refresh runs only on the first page (cursor null).
      required:
        - linkedin_account_sid
    GetMyLatestLinkedinConnectionsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  ln_member_id:
                    type: string
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  connected_at:
                    type: string
                    nullable: true
                  linkedin_connection_request_sid:
                    type: string
                    nullable: true
                  linkedin_connection_invitation_sid:
                    type: string
                    nullable: true
                  last_check_at:
                    type: string
                    nullable: true
                  removal_kind:
                    type: string
                    nullable: true
                    enum:
                      - removed
                      - blocked
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - full_name
                  - connected_at
                  - linkedin_connection_request_sid
                  - linkedin_connection_invitation_sid
                  - last_check_at
                  - removal_kind
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: number
            live_count:
              type: number
            removed_count:
              type: number
            blocked_count:
              type: number
            from_request_count:
              type: number
            from_invitation_count:
              type: number
            sync_only_count:
              type: number
            groups:
              type: object
              additionalProperties: {}
          required:
            - total_count
            - live_count
            - removed_count
            - blocked_count
            - from_request_count
            - from_invitation_count
            - sync_only_count
            - groups
        refresh:
          type: object
          properties:
            performed:
              type: boolean
            pages_fetched:
              type: integer
            items_seen:
              type: integer
            items_upserted:
              type: integer
            stop_reason:
              type: string
              nullable: true
              enum:
                - overlap
                - covered
                - page_cap
                - exhausted
          required:
            - performed
            - pages_fetched
            - items_seen
            - items_upserted
            - stop_reason
        pacing:
          type: object
          properties:
            linkedin_account_sid:
              type: string
              description: The account whose bucket the call spent.
            limit_type:
              type: string
              description: The smart-limit bucket the call spent, e.g. send_messages.
            next_call_after:
              type: string
              description: "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands."
            remaining_today:
              type: integer
              minimum: 0
              description: daily_limit minus done_today_count of that bucket, after this call.
          required:
            - linkedin_account_sid
            - limit_type
            - next_call_after
            - remaining_today
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
        - refresh
    GetMyLatestLinkedinConversationsRecruiterRequest:
      type: object
      description: Request body of `get_my_latest_linkedin_conversations_recruiter`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: N returned, 1..100, default 50 (the wire refresh itself pages 15 at a time).
        cursor:
          type: string
          nullable: true
          description: Opaque; pagination over the refreshed head.
      required:
        - linkedin_account_sid
    GetMyLatestLinkedinConversationsRecruiterResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  conversation_hash:
                    type: string
                    description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
                  messenger_type:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                    description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                    description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
                  nickname:
                    type: string
                    nullable: true
                  participants:
                    type: array
                    nullable: true
                    items:
                      type: object
                      properties:
                        ln_member_id:
                          type: string
                          nullable: true
                        ln_id:
                          type: string
                          nullable: true
                        sn_id:
                          type: string
                          nullable: true
                        recruiter_id:
                          type: string
                          nullable: true
                        nickname:
                          type: string
                          nullable: true
                        full_name:
                          type: string
                          nullable: true
                        headline:
                          type: string
                          nullable: true
                        picture_url:
                          type: string
                          nullable: true
                  is_muted:
                    type: boolean
                    nullable: true
                  unread_count:
                    type: integer
                    nullable: true
                    description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
                  event_count:
                    type: number
                  last_activity_at:
                    type: string
                    nullable: true
                  last_stored_message_at:
                    type: string
                    nullable: true
                  last_message_sync_at:
                    type: string
                    nullable: true
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - conversation_hash
                  - messenger_type
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - recruiter_id
                  - nickname
                  - participants
                  - is_muted
                  - unread_count
                  - event_count
                  - last_activity_at
                  - last_stored_message_at
                  - last_message_sync_at
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
        pacing:
          type: object
          properties:
            linkedin_account_sid:
              type: string
              description: The account whose bucket the call spent.
            limit_type:
              type: string
              description: The smart-limit bucket the call spent, e.g. send_messages.
            next_call_after:
              type: string
              description: "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands."
            remaining_today:
              type: integer
              minimum: 0
              description: daily_limit minus done_today_count of that bucket, after this call.
          required:
            - linkedin_account_sid
            - limit_type
            - next_call_after
            - remaining_today
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    GetMyLatestLinkedinConversationsRequest:
      type: object
      description: Request body of `get_my_latest_linkedin_conversations`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: N returned, 1..100, default 50.
        cursor:
          type: string
          nullable: true
          description: Opaque; pagination over the refreshed head.
      required:
        - linkedin_account_sid
    GetMyLatestLinkedinConversationsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  conversation_hash:
                    type: string
                    description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
                  messenger_type:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                    description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                    description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
                  nickname:
                    type: string
                    nullable: true
                  participants:
                    type: array
                    nullable: true
                    items:
                      type: object
                      properties:
                        ln_member_id:
                          type: string
                          nullable: true
                        ln_id:
                          type: string
                          nullable: true
                        sn_id:
                          type: string
                          nullable: true
                        recruiter_id:
                          type: string
                          nullable: true
                        nickname:
                          type: string
                          nullable: true
                        full_name:
                          type: string
                          nullable: true
                        headline:
                          type: string
                          nullable: true
                        picture_url:
                          type: string
                          nullable: true
                  is_muted:
                    type: boolean
                    nullable: true
                  unread_count:
                    type: integer
                    nullable: true
                    description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
                  event_count:
                    type: number
                  last_activity_at:
                    type: string
                    nullable: true
                  last_stored_message_at:
                    type: string
                    nullable: true
                  last_message_sync_at:
                    type: string
                    nullable: true
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - conversation_hash
                  - messenger_type
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - recruiter_id
                  - nickname
                  - participants
                  - is_muted
                  - unread_count
                  - event_count
                  - last_activity_at
                  - last_stored_message_at
                  - last_message_sync_at
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
        pacing:
          type: object
          properties:
            linkedin_account_sid:
              type: string
              description: The account whose bucket the call spent.
            limit_type:
              type: string
              description: The smart-limit bucket the call spent, e.g. send_messages.
            next_call_after:
              type: string
              description: "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands."
            remaining_today:
              type: integer
              minimum: 0
              description: daily_limit minus done_today_count of that bucket, after this call.
          required:
            - linkedin_account_sid
            - limit_type
            - next_call_after
            - remaining_today
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    GetMyLatestLinkedinConversationsSalesNavRequest:
      type: object
      description: Request body of `get_my_latest_linkedin_conversations_sales_nav`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: N returned, 1..100, default 50.
        cursor:
          type: string
          nullable: true
          description: Opaque; pagination over the refreshed head.
      required:
        - linkedin_account_sid
    GetMyLatestLinkedinConversationsSalesNavResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  conversation_hash:
                    type: string
                    description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
                  messenger_type:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                    description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                    description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
                  nickname:
                    type: string
                    nullable: true
                  participants:
                    type: array
                    nullable: true
                    items:
                      type: object
                      properties:
                        ln_member_id:
                          type: string
                          nullable: true
                        ln_id:
                          type: string
                          nullable: true
                        sn_id:
                          type: string
                          nullable: true
                        recruiter_id:
                          type: string
                          nullable: true
                        nickname:
                          type: string
                          nullable: true
                        full_name:
                          type: string
                          nullable: true
                        headline:
                          type: string
                          nullable: true
                        picture_url:
                          type: string
                          nullable: true
                  is_muted:
                    type: boolean
                    nullable: true
                  unread_count:
                    type: integer
                    nullable: true
                    description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
                  event_count:
                    type: number
                  last_activity_at:
                    type: string
                    nullable: true
                  last_stored_message_at:
                    type: string
                    nullable: true
                  last_message_sync_at:
                    type: string
                    nullable: true
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - conversation_hash
                  - messenger_type
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - recruiter_id
                  - nickname
                  - participants
                  - is_muted
                  - unread_count
                  - event_count
                  - last_activity_at
                  - last_stored_message_at
                  - last_message_sync_at
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
        pacing:
          type: object
          properties:
            linkedin_account_sid:
              type: string
              description: The account whose bucket the call spent.
            limit_type:
              type: string
              description: The smart-limit bucket the call spent, e.g. send_messages.
            next_call_after:
              type: string
              description: "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands."
            remaining_today:
              type: integer
              minimum: 0
              description: daily_limit minus done_today_count of that bucket, after this call.
          required:
            - linkedin_account_sid
            - limit_type
            - next_call_after
            - remaining_today
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    GetMyLatestLinkedinFollowersRequest:
      type: object
      description: Request body of `get_my_latest_linkedin_followers`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…) of the account being followed.
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Freshest rows to return / refresh coverage target (1..100, default 50).
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor; the LinkedIn-side refresh runs only on the first page (cursor null).
      required:
        - linkedin_account_sid
    GetMyLatestLinkedinFollowersResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  ln_member_id:
                    type: string
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  last_check_at:
                    type: string
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - full_name
                  - last_check_at
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: number
            groups:
              type: object
              additionalProperties: {}
          required:
            - total_count
            - groups
        refresh:
          type: object
          properties:
            performed:
              type: boolean
            pages_fetched:
              type: number
            items_seen:
              type: number
            items_upserted:
              type: number
            stop_reason:
              type: string
              nullable: true
              enum:
                - overlap
                - covered
                - page_cap
                - exhausted
          required:
            - performed
            - pages_fetched
            - items_seen
            - items_upserted
            - stop_reason
        pacing:
          type: object
          properties:
            linkedin_account_sid:
              type: string
              description: The account whose bucket the call spent.
            limit_type:
              type: string
              description: The smart-limit bucket the call spent, e.g. send_messages.
            next_call_after:
              type: string
              description: "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands."
            remaining_today:
              type: integer
              minimum: 0
              description: daily_limit minus done_today_count of that bucket, after this call.
          required:
            - linkedin_account_sid
            - limit_type
            - next_call_after
            - remaining_today
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
        - refresh
    GetMyLatestLinkedinMessagesRecruiterRequest:
      type: object
      description: Request body of `get_my_latest_linkedin_messages_recruiter`.
      properties:
        linkedin_conversation_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_cv_
          description: REQUIRED; must be a messenger_type='recruiter' thread.
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: N returned, 1..100, default 50.
        cursor:
          type: string
          nullable: true
          description: Opaque; pagination over the refreshed tail.
      required:
        - linkedin_conversation_sid
    GetMyLatestLinkedinMessagesRecruiterResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  linkedin_conversation_sid:
                    type: string
                  messenger_type:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                    description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
                  linkedin_type:
                    type: string
                    enum:
                      - message
                      - inmail
                      - connection_note
                      - system
                    description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
                  type:
                    type: string
                    enum:
                      - inbox
                      - outbox
                    description: "Direction relative to our account: received / sent."
                  automation:
                    type: string
                    enum:
                      - auto
                      - manual
                      - synced
                    description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
                  ln_member_id:
                    type: string
                    nullable: true
                    description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                    description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
                  nickname:
                    type: string
                    nullable: true
                  subject:
                    type: string
                    nullable: true
                  text:
                    type: string
                  client_reference:
                    type: string
                    nullable: true
                  attachments:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        urn:
                          type: string
                          description: digitalmediaAsset URN; the attachment_urn the download tools take.
                        name:
                          type: string
                        content_type:
                          type: string
                        content_url:
                          type: string
                        file_byte_size:
                          type: number
                        file_name:
                          type: string
                          description: "Rows our send verbs wrote: the file name as sent."
                        file_type:
                          type: string
                          description: "Rows our send verbs wrote: the MIME type as sent."
                  reactions:
                    type: array
                    nullable: true
                    items:
                      type: object
                      properties:
                        emoji:
                          type: string
                        count:
                          type: number
                        is_viewer_reacted:
                          type: boolean
                        first_reacted_at:
                          type: string
                          nullable: true
                      required:
                        - emoji
                        - count
                        - is_viewer_reacted
                        - first_reacted_at
                  is_deleted:
                    type: boolean
                  message_hash:
                    type: string
                  sent_at:
                    type: string
                  custom_content:
                    type: object
                    nullable: true
                    additionalProperties: {}
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - linkedin_conversation_sid
                  - messenger_type
                  - linkedin_type
                  - type
                  - automation
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - recruiter_id
                  - nickname
                  - subject
                  - text
                  - client_reference
                  - attachments
                  - reactions
                  - is_deleted
                  - message_hash
                  - sent_at
                  - custom_content
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: number
            inbox_count:
              type: number
            outbox_count:
              type: number
            message_count:
              type: number
            inmail_count:
              type: number
            connection_note_count:
              type: number
            with_attachments_count:
              type: number
            groups:
              type: object
              additionalProperties: {}
          required:
            - total_count
            - inbox_count
            - outbox_count
            - message_count
            - inmail_count
            - connection_note_count
            - with_attachments_count
            - groups
        refresh:
          type: object
          properties:
            performed:
              type: boolean
            pages_fetched:
              type: number
            items_seen:
              type: number
            items_upserted:
              type: number
            stop_reason:
              type: string
              nullable: true
          required:
            - performed
            - pages_fetched
            - items_seen
            - items_upserted
            - stop_reason
        pacing:
          type: object
          properties:
            linkedin_account_sid:
              type: string
              description: The account whose bucket the call spent.
            limit_type:
              type: string
              description: The smart-limit bucket the call spent, e.g. send_messages.
            next_call_after:
              type: string
              description: "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands."
            remaining_today:
              type: integer
              minimum: 0
              description: daily_limit minus done_today_count of that bucket, after this call.
          required:
            - linkedin_account_sid
            - limit_type
            - next_call_after
            - remaining_today
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
        - refresh
    GetMyLatestLinkedinMessagesRequest:
      type: object
      description: Request body of `get_my_latest_linkedin_messages`.
      properties:
        linkedin_conversation_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_cv_
          description: REQUIRED; must be a messenger_type='linkedin' thread.
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: N returned, 1..100, default 50.
        cursor:
          type: string
          nullable: true
          description: Opaque; pagination over the refreshed tail.
      required:
        - linkedin_conversation_sid
    GetMyLatestLinkedinMessagesResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  linkedin_conversation_sid:
                    type: string
                  messenger_type:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                    description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
                  linkedin_type:
                    type: string
                    enum:
                      - message
                      - inmail
                      - connection_note
                      - system
                    description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
                  type:
                    type: string
                    enum:
                      - inbox
                      - outbox
                    description: "Direction relative to our account: received / sent."
                  automation:
                    type: string
                    enum:
                      - auto
                      - manual
                      - synced
                    description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
                  ln_member_id:
                    type: string
                    nullable: true
                    description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                    description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
                  nickname:
                    type: string
                    nullable: true
                  subject:
                    type: string
                    nullable: true
                  text:
                    type: string
                  client_reference:
                    type: string
                    nullable: true
                  attachments:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        urn:
                          type: string
                          description: digitalmediaAsset URN; the attachment_urn the download tools take.
                        name:
                          type: string
                        content_type:
                          type: string
                        content_url:
                          type: string
                        file_byte_size:
                          type: number
                        file_name:
                          type: string
                          description: "Rows our send verbs wrote: the file name as sent."
                        file_type:
                          type: string
                          description: "Rows our send verbs wrote: the MIME type as sent."
                  reactions:
                    type: array
                    nullable: true
                    items:
                      type: object
                      properties:
                        emoji:
                          type: string
                        count:
                          type: number
                        is_viewer_reacted:
                          type: boolean
                        first_reacted_at:
                          type: string
                          nullable: true
                      required:
                        - emoji
                        - count
                        - is_viewer_reacted
                        - first_reacted_at
                  is_deleted:
                    type: boolean
                  message_hash:
                    type: string
                  sent_at:
                    type: string
                  custom_content:
                    type: object
                    nullable: true
                    additionalProperties: {}
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - linkedin_conversation_sid
                  - messenger_type
                  - linkedin_type
                  - type
                  - automation
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - recruiter_id
                  - nickname
                  - subject
                  - text
                  - client_reference
                  - attachments
                  - reactions
                  - is_deleted
                  - message_hash
                  - sent_at
                  - custom_content
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: number
            inbox_count:
              type: number
            outbox_count:
              type: number
            message_count:
              type: number
            inmail_count:
              type: number
            connection_note_count:
              type: number
            with_attachments_count:
              type: number
            groups:
              type: object
              additionalProperties: {}
          required:
            - total_count
            - inbox_count
            - outbox_count
            - message_count
            - inmail_count
            - connection_note_count
            - with_attachments_count
            - groups
        refresh:
          type: object
          properties:
            performed:
              type: boolean
            pages_fetched:
              type: number
            items_seen:
              type: number
            items_upserted:
              type: number
            stop_reason:
              type: string
              nullable: true
          required:
            - performed
            - pages_fetched
            - items_seen
            - items_upserted
            - stop_reason
        pacing:
          type: object
          properties:
            linkedin_account_sid:
              type: string
              description: The account whose bucket the call spent.
            limit_type:
              type: string
              description: The smart-limit bucket the call spent, e.g. send_messages.
            next_call_after:
              type: string
              description: "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands."
            remaining_today:
              type: integer
              minimum: 0
              description: daily_limit minus done_today_count of that bucket, after this call.
          required:
            - linkedin_account_sid
            - limit_type
            - next_call_after
            - remaining_today
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
        - refresh
    GetMyLatestLinkedinMessagesSalesNavRequest:
      type: object
      description: Request body of `get_my_latest_linkedin_messages_sales_nav`.
      properties:
        linkedin_conversation_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_cv_
          description: REQUIRED; must be a messenger_type='sales_navigator' thread.
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: N returned, 1..100, default 50.
        cursor:
          type: string
          nullable: true
          description: Opaque; pagination over the refreshed tail.
      required:
        - linkedin_conversation_sid
    GetMyLatestLinkedinMessagesSalesNavResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  linkedin_conversation_sid:
                    type: string
                  messenger_type:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                    description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
                  linkedin_type:
                    type: string
                    enum:
                      - message
                      - inmail
                      - connection_note
                      - system
                    description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
                  type:
                    type: string
                    enum:
                      - inbox
                      - outbox
                    description: "Direction relative to our account: received / sent."
                  automation:
                    type: string
                    enum:
                      - auto
                      - manual
                      - synced
                    description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
                  ln_member_id:
                    type: string
                    nullable: true
                    description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                    description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
                  nickname:
                    type: string
                    nullable: true
                  subject:
                    type: string
                    nullable: true
                  text:
                    type: string
                  client_reference:
                    type: string
                    nullable: true
                  attachments:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        urn:
                          type: string
                          description: digitalmediaAsset URN; the attachment_urn the download tools take.
                        name:
                          type: string
                        content_type:
                          type: string
                        content_url:
                          type: string
                        file_byte_size:
                          type: number
                        file_name:
                          type: string
                          description: "Rows our send verbs wrote: the file name as sent."
                        file_type:
                          type: string
                          description: "Rows our send verbs wrote: the MIME type as sent."
                  reactions:
                    type: array
                    nullable: true
                    items:
                      type: object
                      properties:
                        emoji:
                          type: string
                        count:
                          type: number
                        is_viewer_reacted:
                          type: boolean
                        first_reacted_at:
                          type: string
                          nullable: true
                      required:
                        - emoji
                        - count
                        - is_viewer_reacted
                        - first_reacted_at
                  is_deleted:
                    type: boolean
                  message_hash:
                    type: string
                  sent_at:
                    type: string
                  custom_content:
                    type: object
                    nullable: true
                    additionalProperties: {}
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - linkedin_conversation_sid
                  - messenger_type
                  - linkedin_type
                  - type
                  - automation
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - recruiter_id
                  - nickname
                  - subject
                  - text
                  - client_reference
                  - attachments
                  - reactions
                  - is_deleted
                  - message_hash
                  - sent_at
                  - custom_content
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: number
            inbox_count:
              type: number
            outbox_count:
              type: number
            message_count:
              type: number
            inmail_count:
              type: number
            connection_note_count:
              type: number
            with_attachments_count:
              type: number
            groups:
              type: object
              additionalProperties: {}
          required:
            - total_count
            - inbox_count
            - outbox_count
            - message_count
            - inmail_count
            - connection_note_count
            - with_attachments_count
            - groups
        refresh:
          type: object
          properties:
            performed:
              type: boolean
            pages_fetched:
              type: number
            items_seen:
              type: number
            items_upserted:
              type: number
            stop_reason:
              type: string
              nullable: true
          required:
            - performed
            - pages_fetched
            - items_seen
            - items_upserted
            - stop_reason
        pacing:
          type: object
          properties:
            linkedin_account_sid:
              type: string
              description: The account whose bucket the call spent.
            limit_type:
              type: string
              description: The smart-limit bucket the call spent, e.g. send_messages.
            next_call_after:
              type: string
              description: "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands."
            remaining_today:
              type: integer
              minimum: 0
              description: daily_limit minus done_today_count of that bucket, after this call.
          required:
            - linkedin_account_sid
            - limit_type
            - next_call_after
            - remaining_today
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
        - refresh
    IgnoreLinkedinConnectionInvitationResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            ln_member_id:
              type: string
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            note:
              type: string
              nullable: true
            linkedin_invitation_id:
              type: string
              nullable: true
            shared_secret:
              type: string
              nullable: true
            received_at:
              type: string
            last_check_at:
              type: string
              nullable: true
            removal_kind:
              type: string
              nullable: true
              enum:
                - accepted
                - ignored
                - expired
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - ln_member_id
            - ln_id
            - sn_id
            - nickname
            - note
            - linkedin_invitation_id
            - shared_secret
            - received_at
            - last_check_at
            - removal_kind
            - 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
              nullable: true
              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
              nullable: true
              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:<id>, the event_ln_id of a search_linkedin_events row, the number in https://www.linkedin.com/events/<id>/ ."
        targets:
          type: array
          items:
            type: object
            properties:
              ln_id:
                type: string
                nullable: true
                maxLength: 128
                description: "LinkedIn member id (ACoAA...), sent as is in the batch. The address to prefer: it costs no lookup."
              nickname:
                type: string
                nullable: true
                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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    ListAntidetectBrowserProxyCountriesResponse:
      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: {}
        result:
          type: object
          properties:
            countries:
              type: array
              items:
                type: object
                properties:
                  country_code:
                    type: string
                    description: ISO-3166-1 alpha-2, lowercase.
                  available:
                    type: integer
                    minimum: 0
                    description: Active proxies stocked in that country.
                required:
                  - country_code
                  - available
              description: Sorted by country_code; pass one of these as create's proxy_country_code.
          required:
            - countries
        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
              nullable: true
              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
              nullable: true
              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
    ListCloudBrowserTeamOccupancyResponse:
      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: {}
        result:
          type: object
          properties:
            items:
              type: array
              items:
                type: object
                properties:
                  connected_antidetect_browser_sid:
                    type: string
                  connected_user_sid:
                    type: string
                    nullable: true
                  connected_at:
                    type: string
                  connected_till:
                    type: string
                required:
                  - connected_antidetect_browser_sid
                  - connected_user_sid
                  - connected_at
                  - connected_till
          required:
            - items
        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
              nullable: true
              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
              nullable: true
              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
    MarkLinkedinConversationReadResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
          description: kebab-case verb; matches the route segment.
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            conversation_hash:
              type: string
              description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
            nickname:
              type: string
              nullable: true
            participants:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  picture_url:
                    type: string
                    nullable: true
            is_muted:
              type: boolean
              nullable: true
            unread_count:
              type: integer
              nullable: true
              description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
            event_count:
              type: number
            last_activity_at:
              type: string
              nullable: true
            last_stored_message_at:
              type: string
              nullable: true
            last_message_sync_at:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - conversation_hash
            - messenger_type
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - participants
            - is_muted
            - unread_count
            - event_count
            - last_activity_at
            - last_stored_message_at
            - last_message_sync_at
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    MarkLinkedinConversationUnreadResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
          description: kebab-case verb; matches the route segment.
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            conversation_hash:
              type: string
              description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
            nickname:
              type: string
              nullable: true
            participants:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  picture_url:
                    type: string
                    nullable: true
            is_muted:
              type: boolean
              nullable: true
            unread_count:
              type: integer
              nullable: true
              description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
            event_count:
              type: number
            last_activity_at:
              type: string
              nullable: true
            last_stored_message_at:
              type: string
              nullable: true
            last_message_sync_at:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - conversation_hash
            - messenger_type
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - participants
            - is_muted
            - unread_count
            - event_count
            - last_activity_at
            - last_stored_message_at
            - last_message_sync_at
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        pacing:
          type: object
          properties:
            linkedin_account_sid:
              type: string
              description: The account whose bucket the call spent.
            limit_type:
              type: string
              description: The smart-limit bucket the call spent, e.g. send_messages.
            next_call_after:
              type: string
              description: "ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands."
            remaining_today:
              type: integer
              minimum: 0
              description: daily_limit minus done_today_count of that bucket, after this call.
          required:
            - linkedin_account_sid
            - limit_type
            - next_call_after
            - remaining_today
      required:
        - success
        - operation
        - action
        - item
        - result
        - meta
    McpError:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - false
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - validation_failed
                - nothing_to_update
                - not_found
                - relation_not_found
                - invalid_transition
                - limit_exceeded
                - payment_required
                - duplicate_rejected
                - conflict
                - delete_blocked
                - unauthorized
                - forbidden
                - rate_limited
                - internal_error
                - service_unavailable
                - not_implemented
            message:
              type: string
            recoverable:
              type: boolean
            suggestion:
              type: string
            field_errors:
              type: object
              additionalProperties:
                type: array
                items:
                  type: object
                  properties:
                    rule:
                      type: string
                    message:
                      type: string
                  required:
                    - rule
                    - message
            blockers:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                    description: Machine-readable blocker type (active_flow, pending_tasks, …).
                  severity:
                    type: string
                    enum:
                      - hard
                      - soft
                    description: hard = external action required; soft = acknowledge is enough.
                  description:
                    type: string
                  entity_sid:
                    type: string
                    nullable: true
                  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
              nullable: true
              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
              nullable: true
              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
    MuteLinkedinConversationRequest:
      type: object
      description: Request body of `mute_linkedin_conversation`.
      properties:
        mute:
          type: boolean
          description: true = mute (default), false = unmute.
    MuteLinkedinConversationResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
          description: kebab-case verb; matches the route segment.
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            conversation_hash:
              type: string
              description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
            nickname:
              type: string
              nullable: true
            participants:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  picture_url:
                    type: string
                    nullable: true
            is_muted:
              type: boolean
              nullable: true
            unread_count:
              type: integer
              nullable: true
              description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
            event_count:
              type: number
            last_activity_at:
              type: string
              nullable: true
            last_stored_message_at:
              type: string
              nullable: true
            last_message_sync_at:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - conversation_hash
            - messenger_type
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - participants
            - is_muted
            - unread_count
            - event_count
            - last_activity_at
            - last_stored_message_at
            - last_message_sync_at
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    PauseLinkedinAutoScrapeResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            source_method:
              type: string
              enum:
                - search-people-by-url
                - search-people-by-params
                - search-sales-nav-people-by-url
                - search-sales-nav-people-by-params
                - similar-profiles
                - company-employees
                - company-decision-makers
                - get-post-comments
                - get-post-reactors
                - get-post-resharers
                - search-service-providers
                - search-service-providers-by-url
                - search-companies-by-url
                - search-companies-by-params
                - search-sales-nav-companies-by-url
                - search-sales-nav-companies-by-params
                - similar-companies
            source_input:
              type: object
              additionalProperties: {}
            detected_platform:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
            result_kind:
              type: string
              enum:
                - person
                - company
            status:
              type: string
              enum:
                - active
                - paused
            consecutive_failures:
              type: number
            runs_count:
              type: number
            total_new_results:
              type: number
            title:
              type: string
              nullable: true
            replay_frequency:
              type: string
              nullable: true
              enum:
                - hourly
                - daily
                - weekly
                - monthly
            paused_reason:
              type: string
              nullable: true
              enum:
                - manual
                - too_many_failures
                - account_unavailable
            next_run_at:
              type: string
              nullable: true
            last_run_at:
              type: string
              nullable: true
            mass_action_sid:
              type: string
              nullable: true
            created_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - source_method
            - source_input
            - detected_platform
            - result_kind
            - status
            - consecutive_failures
            - runs_count
            - total_new_results
            - title
            - replay_frequency
            - paused_reason
            - next_run_at
            - last_run_at
            - mass_action_sid
            - created_by
            - deleted_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
              nullable: true
              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
              nullable: true
              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
    ReactLinkedinMessageRequest:
      type: object
      description: Request body of `react_linkedin_message`.
      properties:
        reaction_type:
          type: string
          minLength: 1
          maxLength: 32
          description: Single emoji or LinkedIn reaction identifier.
        remove:
          type: boolean
          nullable: true
          description: true = unreact (drives the unreact-on-message verb) with the SAME reaction_type. Default false = react.
      required:
        - reaction_type
    ReactLinkedinMessageResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            linkedin_conversation_sid:
              type: string
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
            linkedin_type:
              type: string
              enum:
                - message
                - inmail
                - connection_note
                - system
              description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
            type:
              type: string
              enum:
                - inbox
                - outbox
              description: "Direction relative to our account: received / sent."
            automation:
              type: string
              enum:
                - auto
                - manual
                - synced
              description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
            ln_member_id:
              type: string
              nullable: true
              description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
            nickname:
              type: string
              nullable: true
            subject:
              type: string
              nullable: true
            text:
              type: string
            client_reference:
              type: string
              nullable: true
            attachments:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  urn:
                    type: string
                    description: digitalmediaAsset URN; the attachment_urn the download tools take.
                  name:
                    type: string
                  content_type:
                    type: string
                  content_url:
                    type: string
                  file_byte_size:
                    type: number
                  file_name:
                    type: string
                    description: "Rows our send verbs wrote: the file name as sent."
                  file_type:
                    type: string
                    description: "Rows our send verbs wrote: the MIME type as sent."
            reactions:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  emoji:
                    type: string
                  count:
                    type: number
                  is_viewer_reacted:
                    type: boolean
                  first_reacted_at:
                    type: string
                    nullable: true
                required:
                  - emoji
                  - count
                  - is_viewer_reacted
                  - first_reacted_at
            is_deleted:
              type: boolean
            message_hash:
              type: string
            sent_at:
              type: string
            custom_content:
              type: object
              nullable: true
              additionalProperties: {}
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - linkedin_conversation_sid
            - messenger_type
            - linkedin_type
            - type
            - automation
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - subject
            - text
            - client_reference
            - attachments
            - reactions
            - is_deleted
            - message_hash
            - sent_at
            - custom_content
            - 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
              nullable: true
              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
              nullable: true
              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
    ReactLinkedinPostRequest:
      type: object
      description: Request body of `react_linkedin_post`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "LinkedIn account sid (ln_ac_…), the authoring account. Identity-bound: REQUIRED, posts publish AS this account."
        entity_urn:
          type: string
          minLength: 1
          maxLength: 512
          description: "The post or comment to react on. LinkedIn files a reaction under the post's social thread and silently drops one sent to any other key (success, null reaction_urn, nothing lands: captured live on the activity urn of a ugcPost company post), so a post handle is re-addressed at its thread before the wire. urn:li:ugcPost:<id> and urn:li:groupPost:<groupId>-<postId> are the thread and go as is. urn:li:activity:<id> and urn:li:share:<id> cost one post read first (the read enrich_linkedin_post_details makes, on this account, cached 7 days): a share post is reacted on at its activity urn, a ugcPost post at its ugcPost urn, a repost without commentary at the original. A post the read returns null for (deleted, or not visible to the account) is refused 422 post_not_resolvable. A COMMENT key targets a comment and passes verbatim, either form: urn:li:comment:((activity|share|ugcPost|groupPost):<id>,<id>) or urn:li:fsd_comment:(<commentId>,<full thread urn>). A post URL works when the id is in it: the feed permalink, the /posts/<slug>-activity-<id>-<hash> share link, the -ugcPost-<id>- share link. A link WITHOUT an id (a shortlink, a bare slug URL) is refused 422 entity_urn_not_resolvable: call enrich_linkedin_get_activity_urn_by_url first. A malformed urn is refused 422 before any dispatch. The post does NOT need to be tracked or owned by us."
        reaction_type:
          type: string
          nullable: true
          enum:
            - like
            - celebrate
            - support
            - love
            - insightful
            - funny
            - interested
          description: The reaction to leave, mapped to the plugin wire ReactionType. Defaults to like. interested (wire MAYBE) works on EVENT posts; ordinary posts silently ignore it (null reaction_urn back).
      required:
        - linkedin_account_sid
        - entity_urn
    ReactLinkedinPostResponse:
      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: {}
        result:
          type: object
          properties:
            reaction_urn:
              type: string
              nullable: true
            activity_log:
              type: object
              properties: {}
              description: Full dispatch row (linkedin-account-activity-log) per §4.12a. Poll it there by sid for the terminal outcome.
          required:
            - reaction_urn
            - activity_log
        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
              nullable: true
              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
              nullable: true
              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
    RemoveLinkedinConnectionRequest:
      type: object
      description: Request body of `remove_linkedin_connection`.
      properties:
        reason:
          type: string
          nullable: true
          maxLength: 255
          description: Free-form note on why the connection was removed; context for whoever reads the row later, never sent to LinkedIn.
    RemoveLinkedinConnectionResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            ln_member_id:
              type: string
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            full_name:
              type: string
              nullable: true
            connected_at:
              type: string
              nullable: true
            linkedin_connection_request_sid:
              type: string
              nullable: true
            linkedin_connection_invitation_sid:
              type: string
              nullable: true
            last_check_at:
              type: string
              nullable: true
            removal_kind:
              type: string
              nullable: true
              enum:
                - removed
                - blocked
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - ln_member_id
            - ln_id
            - sn_id
            - nickname
            - full_name
            - connected_at
            - linkedin_connection_request_sid
            - linkedin_connection_invitation_sid
            - last_check_at
            - removal_kind
            - 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
              nullable: true
              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
              nullable: true
              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
    RemoveLinkedinConversationParticipantsRequest:
      type: object
      description: Request body of `remove_linkedin_conversation_participants`.
      properties:
        participant_ln_ids:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 64
          minItems: 1
          maxItems: 20
          description: "Bare LinkedIn profile ids (ACoA...) to remove, 1..20; not urn: strings."
      required:
        - participant_ln_ids
    RemoveLinkedinConversationParticipantsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
          description: kebab-case verb; matches the route segment.
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            conversation_hash:
              type: string
              description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
            nickname:
              type: string
              nullable: true
            participants:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  picture_url:
                    type: string
                    nullable: true
            is_muted:
              type: boolean
              nullable: true
            unread_count:
              type: integer
              nullable: true
              description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
            event_count:
              type: number
            last_activity_at:
              type: string
              nullable: true
            last_stored_message_at:
              type: string
              nullable: true
            last_message_sync_at:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - conversation_hash
            - messenger_type
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - participants
            - is_muted
            - unread_count
            - event_count
            - last_activity_at
            - last_stored_message_at
            - last_message_sync_at
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            status:
              type: string
              enum:
                - success
              description: "The only value this verb answers with: a refusal is a typed error, never a status."
            activity_log_sid:
              type: string
              nullable: true
              description: The linkedin-account-activity-log row of the call (ln_al_).
          required:
            - status
            - activity_log_sid
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    RenameLinkedinConversationRequest:
      type: object
      description: Request body of `rename_linkedin_conversation`.
      properties:
        title:
          type: string
          minLength: 1
          maxLength: 256
          description: New group thread title (1..256 chars).
      required:
        - title
    RenameLinkedinConversationResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
          description: kebab-case verb; matches the route segment.
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            conversation_hash:
              type: string
              description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
            nickname:
              type: string
              nullable: true
            participants:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  picture_url:
                    type: string
                    nullable: true
            is_muted:
              type: boolean
              nullable: true
            unread_count:
              type: integer
              nullable: true
              description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
            event_count:
              type: number
            last_activity_at:
              type: string
              nullable: true
            last_stored_message_at:
              type: string
              nullable: true
            last_message_sync_at:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - conversation_hash
            - messenger_type
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - participants
            - is_muted
            - unread_count
            - event_count
            - last_activity_at
            - last_stored_message_at
            - last_message_sync_at
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            status:
              type: string
              enum:
                - success
              description: "The only value this verb answers with: a refusal is a typed error, never a status."
            activity_log_sid:
              type: string
              nullable: true
              description: The linkedin-account-activity-log row of the call (ln_al_).
          required:
            - status
            - activity_log_sid
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    ReplaceAntidetectBrowserProxyRequest:
      type: object
      description: Request body of `replace_antidetect_browser_proxy`.
      properties:
        sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ab_br_
          description: Antidetect browser sid (ab_br_…).
        antidetect_browser_proxy_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ab_px_
          description: Pin a specific same-country replacement; omit for the least-loaded one.
      required:
        - sid
    ReplaceAntidetectBrowserProxyResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
              nullable: true
            automation_server_sid:
              type: string
              nullable: true
            account_share_sid:
              type: string
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            vendor_provider:
              type: string
              enum:
                - gologin
                - multilogin
                - adspower
                - dolphin
            vendor_name:
              type: string
              nullable: true
            vendor_profile_id:
              type: string
              nullable: true
            browser_owner:
              type: string
              enum:
                - platform
                - customer
            status:
              type: string
              enum:
                - stopped
                - queued_to_start
                - initializing
                - running
                - idle
                - queued_to_stop
                - start_issue
                - running_issue
                - login_issue
                - restricted
                - client_error_investigation
                - support_error_investigation
                - maintenance
                - shared_out
                - subscription_required
            error_reason:
              type: string
              nullable: true
            fail_count:
              type: number
            last_fail_at:
              type: string
              nullable: true
            logout_count:
              type: number
            last_logout_at:
              type: string
              nullable: true
            last_start_at:
              type: string
              nullable: true
            last_health_check_at:
              type: string
              nullable: true
            last_activity_at:
              type: string
              nullable: true
            antidetect_browser_proxy_sid:
              type: string
              nullable: true
            proxy_country_code:
              type: string
              nullable: true
            custom_proxy:
              type: object
              nullable: true
              properties:
                ip:
                  type: string
                port:
                  type: integer
                mode:
                  type: string
                username:
                  type: string
                  nullable: true
                exit_ip:
                  type: string
                  nullable: true
                latency_ms:
                  type: integer
                  nullable: true
              required:
                - ip
                - port
                - mode
                - username
                - exit_ip
                - latency_ms
            proxy_5g:
              type: boolean
              description: "5G Proxy add-on: the browser runs on the dedicated 5G mobile route (faster command execution, fewer retries). Each flagged browser occupies one add-on slot."
            cloud_browser_access:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                    nullable: true
                    minLength: 18
                    maxLength: 18
                    pattern: ^cb_ak_
                    description: "The bearer token itself, in full, for a caller holding can_manage_cloud_browser_external_links (the permission that mints it: reading a key is the same power as minting one, since the public connect checks nothing but the key). null for every other caller; the entry stays so the link, its expiry and its use can still be listed. On cloud-browser-sessions it is masked to the last 4."
                  expires_at:
                    type: string
                    nullable: true
                    description: ISO 8601 expiry; null means it never expires. Checked at connect and never again, so a session can outlive its own key.
                  max_connects:
                    type: number
                    nullable: true
                    description: Cap on CONCURRENT sessions on this key; null means unlimited.
                  allowed_ips:
                    type: array
                    nullable: true
                    items:
                      type: string
                  allowed_countries:
                    type: array
                    nullable: true
                    items:
                      type: string
                  purpose:
                    type: string
                    enum:
                      - relogin
                      - recruiter_relogin
                      - share
                    description: What the public page behind the link does. Stamped at mint and never re-negotiated at connect, because the visitor is unauthenticated. Absent on keys minted before the field existed, which the backend reads as relogin.
                required:
                  - key
                  - expires_at
                  - max_connects
                  - allowed_ips
                  - allowed_countries
              description: The smart links minted on this browser; the key itself only for a caller holding can_manage_cloud_browser_external_links, null otherwise (2026-09-16). Each console open used to leave a throwaway entry here; minting now sweeps entries that expired over 24h ago, so this is the live link list rather than a log.
            vendor_profile_shares:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  email:
                    type: string
                  role:
                    type: string
                  shared_at:
                    type: string
                    nullable: true
                  shared_by:
                    type: string
                    nullable: true
                  vendor_share_id:
                    type: string
                    nullable: true
                required:
                  - email
                  - role
                  - shared_at
                  - shared_by
                  - vendor_share_id
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - automation_server_sid
            - account_share_sid
            - share_role
            - vendor_provider
            - vendor_name
            - vendor_profile_id
            - browser_owner
            - status
            - error_reason
            - fail_count
            - last_fail_at
            - logout_count
            - last_logout_at
            - last_start_at
            - last_health_check_at
            - last_activity_at
            - antidetect_browser_proxy_sid
            - proxy_country_code
            - custom_proxy
            - proxy_5g
            - cloud_browser_access
            - vendor_profile_shares
            - created_by
            - deleted_by
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            previous_antidetect_browser_proxy_sid:
              type: string
              nullable: true
              description: The pooled proxy the browser was on before the swap, or null if it had none.
            restarted:
              type: boolean
              description: True when the browser was running and was started again on the new proxy.
            restart_error:
              type: string
              nullable: true
              description: Set when the swap committed but the browser could not be restarted.
          required:
            - previous_antidetect_browser_proxy_sid
            - restarted
            - restart_error
        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
              nullable: true
              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
              nullable: true
              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
    RepostLinkedinPostRequest:
      type: object
      description: Request body of `repost_linkedin_post`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "LinkedIn account sid (ln_ac_…), the authoring account. Identity-bound: REQUIRED, posts publish AS this account."
        post_urn:
          type: string
          pattern: ^urn:li:(activity|share|ugcPost):\d+$
          description: "The post to repost: urn:li:activity:<id>, urn:li:share:<id> or urn:li:ugcPost:<id>."
        text:
          type: string
          maxLength: 3000
          description: Your own words above the reposted post. Omit (or blank) for a plain repost.
        visibility:
          type: string
          enum:
            - ANYONE
            - CONNECTIONS_ONLY
          description: With text only. ANYONE (the default) or CONNECTIONS_ONLY.
        allowed_commenters_scope:
          type: string
          enum:
            - ALL
            - CONNECTIONS_ONLY
            - NONE
          description: With text only. ALL (the default), CONNECTIONS_ONLY, or NONE to disable comments.
        mentions:
          type: array
          items:
            type: object
            properties:
              profile_id:
                type: string
                minLength: 1
                description: The mentioned member's profile id (ACoA... or urn:li:fsd_profile:<id>).
              start:
                type: integer
                minimum: 0
                description: Offset of the mention in text, UTF-16 code units.
              length:
                type: integer
                minimum: 1
                description: Length of the mention span in UTF-16 code units.
            required:
              - profile_id
              - start
              - length
          description: "With text only: profile mentions as ready positions over text, as create_linkedin_post takes them."
        client_reference:
          type: string
          nullable: true
          maxLength: 255
          description: "Your key for this ONE repost (max 255, byte for byte): one key per repost, the same key on every repeat of it. The key and its place (the post it reposts, as LinkedIn files it) are one repost whatever it says, and a repeat never goes out twice: it answers 200 with what the first send made (result.idempotent_replay, result.content_differs when this request says something else) or 409 naming error.context.send_outcome (in_flight, unknown with retry_after and send_decisive_at, or sent; not_sent with blocking_activity_log_sid when another repost in doubt holds the place). The same key at another place is another repost. Without a key a repost of the same post with the same words count as a repeat for an hour after they went out. check_linkedin_posting_sent asks by it."
        confirmed_not_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS send is not on LinkedIn: its activity_log_sid (ln_al_...), from the 409 or check_linkedin_posting_sent, given only after someone looked on LinkedIn. Taken once the attempt can no longer land (before that: 409 send_outcome_unknown, waiting_for may_still_land, retry_after and send_decisive_at that moment): it settles that attempt not_sent and this request goes out. Moot when the attempt is no longer in doubt; another send's sid is 422 not_this_message."
        confirmed_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS send IS on LinkedIn: its activity_log_sid, as for confirmed_not_sent (never both). Taken at once; it settles the attempt sent and sends nothing: the answer is 409 concurrent_send_in_flight with send_outcome sent while what it made is not known (LinkedIn is read for it), or 200 with it once a read has found it. Another send's sid is 422 not_this_message; an attempt already proved not sent is 409 confirmed_sent_contradicts."
      required:
        - linkedin_account_sid
        - post_urn
    RepostLinkedinPostResponse:
      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: {}
        result:
          type: object
          properties:
            kind:
              type: string
              description: instant (a plain repost) or with_thoughts (a share with your text).
            activity_urn:
              type: string
              nullable: true
              description: "The feed entry the repost became: what delete_linkedin_post takes."
            post_urn:
              type: string
              nullable: true
              description: "The publication: urn:li:instantRepost:(<root>,<id>) for a plain repost, the share (urn:li:ugcPost:<id> live, urn:li:share:<id> on older shares) for one with thoughts."
            url:
              type: string
              nullable: true
              description: Public URL of the repost, query string stripped.
            created_at:
              type: string
              nullable: true
              description: ISO 8601.
            text:
              type: string
              description: The commentary LinkedIn published; empty for a plain repost.
            parent_post_urn:
              type: string
              nullable: true
              description: The backend urn (share / ugcPost) that was reposted.
            message:
              type: string
              nullable: true
              description: The plain repost's success toast, when LinkedIn showed one.
            activity_log:
              type: object
              properties: {}
              description: Full dispatch row (linkedin-account-activity-log) per §4.12a. Poll it there by sid for the terminal outcome.
            idempotent_replay:
              type: boolean
              description: "true when this answers a repeat (under the key, or without one the same words at the same place) with what the first send made: nothing was sent now."
            content_differs:
              type: boolean
              description: "With idempotent_replay: true when this request's words (or a post's pictures or video) differ from those of the send that made it."
          required:
            - kind
            - activity_urn
            - post_urn
            - url
            - created_at
            - text
            - parent_post_urn
            - message
            - activity_log
        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
              nullable: true
              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
              nullable: true
              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
    ResetLinkedinAccountSmartLimitHoldResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            limit_type:
              type: string
              enum:
                - send_connection_requests
                - networking_general
                - send_messages
                - send_inmails
                - messaging_general
                - comment_posts
                - react_posts
                - endorse_skills
                - visit_profiles
                - edit_profile
                - self_account_sync
                - scraping
                - enrichment
                - posting
                - custom_request
                - data_requests
            daily_limit:
              type: number
            smart_limit:
              type: number
              nullable: true
            target_limit:
              type: number
              nullable: true
            delay_in_seconds:
              type: number
            done_today_count:
              type: number
            done_7d_count:
              type: number
              nullable: true
            last_reset_at:
              type: string
            status:
              type: string
              enum:
                - active
                - held
                - linkedin_blocked
            hold_till:
              type: string
              nullable: true
            linkedin_quota_hit_till:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - limit_type
            - daily_limit
            - smart_limit
            - target_limit
            - delay_in_seconds
            - done_today_count
            - last_reset_at
            - status
            - hold_till
            - linkedin_quota_hit_till
            - created_at
            - updated_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
              nullable: true
              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
              nullable: true
              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
    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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    ResumeLinkedinAutoScrapeResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            source_method:
              type: string
              enum:
                - search-people-by-url
                - search-people-by-params
                - search-sales-nav-people-by-url
                - search-sales-nav-people-by-params
                - similar-profiles
                - company-employees
                - company-decision-makers
                - get-post-comments
                - get-post-reactors
                - get-post-resharers
                - search-service-providers
                - search-service-providers-by-url
                - search-companies-by-url
                - search-companies-by-params
                - search-sales-nav-companies-by-url
                - search-sales-nav-companies-by-params
                - similar-companies
            source_input:
              type: object
              additionalProperties: {}
            detected_platform:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
            result_kind:
              type: string
              enum:
                - person
                - company
            status:
              type: string
              enum:
                - active
                - paused
            consecutive_failures:
              type: number
            runs_count:
              type: number
            total_new_results:
              type: number
            title:
              type: string
              nullable: true
            replay_frequency:
              type: string
              nullable: true
              enum:
                - hourly
                - daily
                - weekly
                - monthly
            paused_reason:
              type: string
              nullable: true
              enum:
                - manual
                - too_many_failures
                - account_unavailable
            next_run_at:
              type: string
              nullable: true
            last_run_at:
              type: string
              nullable: true
            mass_action_sid:
              type: string
              nullable: true
            created_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - source_method
            - source_input
            - detected_platform
            - result_kind
            - status
            - consecutive_failures
            - runs_count
            - total_new_results
            - title
            - replay_frequency
            - paused_reason
            - next_run_at
            - last_run_at
            - mass_action_sid
            - created_by
            - deleted_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
              nullable: true
              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
              nullable: true
              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
    RevokeCloudBrowserAccessKeyRequest:
      type: object
      description: Request body of `revoke_cloud_browser_access_key`.
      properties:
        sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ab_br_
          description: Antidetect browser sid (ab_br_…).
        key:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^cb_ak_
          description: Single key to revoke; omit to revoke all keys on the browser.
      required:
        - sid
    RevokeCloudBrowserAccessKeyResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
              nullable: true
            automation_server_sid:
              type: string
              nullable: true
            account_share_sid:
              type: string
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            vendor_provider:
              type: string
              enum:
                - gologin
                - multilogin
                - adspower
                - dolphin
            vendor_name:
              type: string
              nullable: true
            vendor_profile_id:
              type: string
              nullable: true
            browser_owner:
              type: string
              enum:
                - platform
                - customer
            status:
              type: string
              enum:
                - stopped
                - queued_to_start
                - initializing
                - running
                - idle
                - queued_to_stop
                - start_issue
                - running_issue
                - login_issue
                - restricted
                - client_error_investigation
                - support_error_investigation
                - maintenance
                - shared_out
                - subscription_required
            error_reason:
              type: string
              nullable: true
            fail_count:
              type: number
            last_fail_at:
              type: string
              nullable: true
            logout_count:
              type: number
            last_logout_at:
              type: string
              nullable: true
            last_start_at:
              type: string
              nullable: true
            last_health_check_at:
              type: string
              nullable: true
            last_activity_at:
              type: string
              nullable: true
            antidetect_browser_proxy_sid:
              type: string
              nullable: true
            proxy_country_code:
              type: string
              nullable: true
            custom_proxy:
              type: object
              nullable: true
              properties:
                ip:
                  type: string
                port:
                  type: integer
                mode:
                  type: string
                username:
                  type: string
                  nullable: true
                exit_ip:
                  type: string
                  nullable: true
                latency_ms:
                  type: integer
                  nullable: true
              required:
                - ip
                - port
                - mode
                - username
                - exit_ip
                - latency_ms
            proxy_5g:
              type: boolean
              description: "5G Proxy add-on: the browser runs on the dedicated 5G mobile route (faster command execution, fewer retries). Each flagged browser occupies one add-on slot."
            cloud_browser_access:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                    nullable: true
                    minLength: 18
                    maxLength: 18
                    pattern: ^cb_ak_
                    description: "The bearer token itself, in full, for a caller holding can_manage_cloud_browser_external_links (the permission that mints it: reading a key is the same power as minting one, since the public connect checks nothing but the key). null for every other caller; the entry stays so the link, its expiry and its use can still be listed. On cloud-browser-sessions it is masked to the last 4."
                  expires_at:
                    type: string
                    nullable: true
                    description: ISO 8601 expiry; null means it never expires. Checked at connect and never again, so a session can outlive its own key.
                  max_connects:
                    type: number
                    nullable: true
                    description: Cap on CONCURRENT sessions on this key; null means unlimited.
                  allowed_ips:
                    type: array
                    nullable: true
                    items:
                      type: string
                  allowed_countries:
                    type: array
                    nullable: true
                    items:
                      type: string
                  purpose:
                    type: string
                    enum:
                      - relogin
                      - recruiter_relogin
                      - share
                    description: What the public page behind the link does. Stamped at mint and never re-negotiated at connect, because the visitor is unauthenticated. Absent on keys minted before the field existed, which the backend reads as relogin.
                required:
                  - key
                  - expires_at
                  - max_connects
                  - allowed_ips
                  - allowed_countries
              description: The smart links minted on this browser; the key itself only for a caller holding can_manage_cloud_browser_external_links, null otherwise (2026-09-16). Each console open used to leave a throwaway entry here; minting now sweeps entries that expired over 24h ago, so this is the live link list rather than a log.
            vendor_profile_shares:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  email:
                    type: string
                  role:
                    type: string
                  shared_at:
                    type: string
                    nullable: true
                  shared_by:
                    type: string
                    nullable: true
                  vendor_share_id:
                    type: string
                    nullable: true
                required:
                  - email
                  - role
                  - shared_at
                  - shared_by
                  - vendor_share_id
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - automation_server_sid
            - account_share_sid
            - share_role
            - vendor_provider
            - vendor_name
            - vendor_profile_id
            - browser_owner
            - status
            - error_reason
            - fail_count
            - last_fail_at
            - logout_count
            - last_logout_at
            - last_start_at
            - last_health_check_at
            - last_activity_at
            - antidetect_browser_proxy_sid
            - proxy_country_code
            - custom_proxy
            - proxy_5g
            - cloud_browser_access
            - vendor_profile_shares
            - created_by
            - deleted_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
              nullable: true
              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
              nullable: true
              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
    RunAntidetectBrowserRequest:
      type: object
      description: Request body of `run_antidetect_browser`.
      properties:
        sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ab_br_
          description: Antidetect browser sid (ab_br_…).
      required:
        - sid
    RunAntidetectBrowserResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
              nullable: true
            automation_server_sid:
              type: string
              nullable: true
            account_share_sid:
              type: string
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            vendor_provider:
              type: string
              enum:
                - gologin
                - multilogin
                - adspower
                - dolphin
            vendor_name:
              type: string
              nullable: true
            vendor_profile_id:
              type: string
              nullable: true
            browser_owner:
              type: string
              enum:
                - platform
                - customer
            status:
              type: string
              enum:
                - stopped
                - queued_to_start
                - initializing
                - running
                - idle
                - queued_to_stop
                - start_issue
                - running_issue
                - login_issue
                - restricted
                - client_error_investigation
                - support_error_investigation
                - maintenance
                - shared_out
                - subscription_required
            error_reason:
              type: string
              nullable: true
            fail_count:
              type: number
            last_fail_at:
              type: string
              nullable: true
            logout_count:
              type: number
            last_logout_at:
              type: string
              nullable: true
            last_start_at:
              type: string
              nullable: true
            last_health_check_at:
              type: string
              nullable: true
            last_activity_at:
              type: string
              nullable: true
            antidetect_browser_proxy_sid:
              type: string
              nullable: true
            proxy_country_code:
              type: string
              nullable: true
            custom_proxy:
              type: object
              nullable: true
              properties:
                ip:
                  type: string
                port:
                  type: integer
                mode:
                  type: string
                username:
                  type: string
                  nullable: true
                exit_ip:
                  type: string
                  nullable: true
                latency_ms:
                  type: integer
                  nullable: true
              required:
                - ip
                - port
                - mode
                - username
                - exit_ip
                - latency_ms
            proxy_5g:
              type: boolean
              description: "5G Proxy add-on: the browser runs on the dedicated 5G mobile route (faster command execution, fewer retries). Each flagged browser occupies one add-on slot."
            cloud_browser_access:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                    nullable: true
                    minLength: 18
                    maxLength: 18
                    pattern: ^cb_ak_
                    description: "The bearer token itself, in full, for a caller holding can_manage_cloud_browser_external_links (the permission that mints it: reading a key is the same power as minting one, since the public connect checks nothing but the key). null for every other caller; the entry stays so the link, its expiry and its use can still be listed. On cloud-browser-sessions it is masked to the last 4."
                  expires_at:
                    type: string
                    nullable: true
                    description: ISO 8601 expiry; null means it never expires. Checked at connect and never again, so a session can outlive its own key.
                  max_connects:
                    type: number
                    nullable: true
                    description: Cap on CONCURRENT sessions on this key; null means unlimited.
                  allowed_ips:
                    type: array
                    nullable: true
                    items:
                      type: string
                  allowed_countries:
                    type: array
                    nullable: true
                    items:
                      type: string
                  purpose:
                    type: string
                    enum:
                      - relogin
                      - recruiter_relogin
                      - share
                    description: What the public page behind the link does. Stamped at mint and never re-negotiated at connect, because the visitor is unauthenticated. Absent on keys minted before the field existed, which the backend reads as relogin.
                required:
                  - key
                  - expires_at
                  - max_connects
                  - allowed_ips
                  - allowed_countries
              description: The smart links minted on this browser; the key itself only for a caller holding can_manage_cloud_browser_external_links, null otherwise (2026-09-16). Each console open used to leave a throwaway entry here; minting now sweeps entries that expired over 24h ago, so this is the live link list rather than a log.
            vendor_profile_shares:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  email:
                    type: string
                  role:
                    type: string
                  shared_at:
                    type: string
                    nullable: true
                  shared_by:
                    type: string
                    nullable: true
                  vendor_share_id:
                    type: string
                    nullable: true
                required:
                  - email
                  - role
                  - shared_at
                  - shared_by
                  - vendor_share_id
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - automation_server_sid
            - account_share_sid
            - share_role
            - vendor_provider
            - vendor_name
            - vendor_profile_id
            - browser_owner
            - status
            - error_reason
            - fail_count
            - last_fail_at
            - logout_count
            - last_logout_at
            - last_start_at
            - last_health_check_at
            - last_activity_at
            - antidetect_browser_proxy_sid
            - proxy_country_code
            - custom_proxy
            - proxy_5g
            - cloud_browser_access
            - vendor_profile_shares
            - created_by
            - deleted_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
              nullable: true
              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
              nullable: true
              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
    RunLinkedinAutoScrapeNowResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            source_method:
              type: string
              enum:
                - search-people-by-url
                - search-people-by-params
                - search-sales-nav-people-by-url
                - search-sales-nav-people-by-params
                - similar-profiles
                - company-employees
                - company-decision-makers
                - get-post-comments
                - get-post-reactors
                - get-post-resharers
                - search-service-providers
                - search-service-providers-by-url
                - search-companies-by-url
                - search-companies-by-params
                - search-sales-nav-companies-by-url
                - search-sales-nav-companies-by-params
                - similar-companies
            source_input:
              type: object
              additionalProperties: {}
            detected_platform:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
            result_kind:
              type: string
              enum:
                - person
                - company
            status:
              type: string
              enum:
                - active
                - paused
            consecutive_failures:
              type: number
            runs_count:
              type: number
            total_new_results:
              type: number
            title:
              type: string
              nullable: true
            replay_frequency:
              type: string
              nullable: true
              enum:
                - hourly
                - daily
                - weekly
                - monthly
            paused_reason:
              type: string
              nullable: true
              enum:
                - manual
                - too_many_failures
                - account_unavailable
            next_run_at:
              type: string
              nullable: true
            last_run_at:
              type: string
              nullable: true
            mass_action_sid:
              type: string
              nullable: true
            created_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - source_method
            - source_input
            - detected_platform
            - result_kind
            - status
            - consecutive_failures
            - runs_count
            - total_new_results
            - title
            - replay_frequency
            - paused_reason
            - next_run_at
            - last_run_at
            - mass_action_sid
            - created_by
            - deleted_by
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            run_sid:
              type: string
              description: The minted run (ln_ar_...); read it with get_linkedin_auto_scrape_run.
            run_number:
              type: number
            status:
              type: string
              enum:
                - pending
                - in_progress
                - completed
                - failed
          required:
            - run_sid
            - run_number
            - status
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinBuildSearchUrlRequest:
      type: object
      description: Request body of `scrape_linkedin_build_search_url`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        people:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              nullable: true
              maxLength: 256
              description: Free-text query.
            first_name:
              type: string
              nullable: true
              maxLength: 100
            last_name:
              type: string
              nullable: true
              maxLength: 100
            title:
              type: string
              nullable: true
              maxLength: 256
              description: Current-title keywords.
            company:
              type: string
              nullable: true
              maxLength: 256
              description: Current-company keywords (free text; prefer current_companies).
            school:
              type: string
              nullable: true
              maxLength: 256
              description: 'School free-text: this engine has no school-id facet, so lookup(type: "school") ids fit nowhere here.'
            network:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - 1st
                  - 2nd
                  - 3rd_plus
              maxItems: 3
              description: Relationship-degree facet; the node maps each degree onto the LinkedIn wire code (F/S/O) itself.
            locations:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 64
                    pattern: ^\d+$
                    description: A numeric id, as the search takes it; rides as it is.
                  text:
                    type: string
                    nullable: true
                    maxLength: 100
                    description: "Human text to resolve (\"Berlin\", \"Acme\"): typed into the typeahead, which picks the option labelled exactly so, else LinkedIn's first."
                description: "One value: an id, or a text to resolve (at least one of the two)."
              maxItems: 10
              description: Geography (location typeahead).
            industries:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 64
                    pattern: ^\d+$
                    description: A numeric id, as the search takes it; rides as it is.
                  text:
                    type: string
                    nullable: true
                    maxLength: 100
                    description: "Human text to resolve (\"Berlin\", \"Acme\"): typed into the typeahead, which picks the option labelled exactly so, else LinkedIn's first."
                description: "One value: an id, or a text to resolve (at least one of the two)."
              maxItems: 10
              description: Industries (industry typeahead).
            current_companies:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 64
                    pattern: ^\d+$
                    description: A numeric id, as the search takes it; rides as it is.
                  text:
                    type: string
                    nullable: true
                    maxLength: 100
                    description: "Human text to resolve (\"Berlin\", \"Acme\"): typed into the typeahead, which picks the option labelled exactly so, else LinkedIn's first."
                description: "One value: an id, or a text to resolve (at least one of the two)."
              maxItems: 10
              description: Current employer (company typeahead).
            past_companies:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 64
                    pattern: ^\d+$
                    description: A numeric id, as the search takes it; rides as it is.
                  text:
                    type: string
                    nullable: true
                    maxLength: 100
                    description: "Human text to resolve (\"Berlin\", \"Acme\"): typed into the typeahead, which picks the option labelled exactly so, else LinkedIn's first."
                description: "One value: an id, or a text to resolve (at least one of the two)."
              maxItems: 10
              description: Past employer (company typeahead).
            service_categories:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 64
                    pattern: ^\d+$
                    description: A numeric id, as the search takes it; rides as it is.
                  text:
                    type: string
                    nullable: true
                    maxLength: 100
                    description: "Human text to resolve (\"Berlin\", \"Acme\"): typed into the typeahead, which picks the option labelled exactly so, else LinkedIn's first."
                description: "One value: an id, or a text to resolve (at least one of the two)."
              maxItems: 10
              description: Service categories (service_category typeahead).
            connections_of:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    pattern: ^[\w-]+$
                    description: A profile id (ACoA…), as the search takes it; rides as it is.
                  text:
                    type: string
                    nullable: true
                    maxLength: 100
                    description: "Human text to resolve (\"Berlin\", \"Acme\"): typed into the typeahead, which picks the option labelled exactly so, else LinkedIn's first."
                description: "One value: an id, or a text to resolve (at least one of the two)."
              maxItems: 10
              description: "People connected to these members: a name resolves through the connections typeahead."
            followers_of:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    pattern: ^[\w-]+$
                    description: A profile id (ACoA…), as the search takes it; rides as it is.
                  text:
                    type: string
                    nullable: true
                    maxLength: 100
                    description: "Human text to resolve (\"Berlin\", \"Acme\"): typed into the typeahead, which picks the option labelled exactly so, else LinkedIn's first."
                description: "One value: an id, or a text to resolve (at least one of the two)."
              maxItems: 10
              description: "People following these members: a name resolves through the people typeahead."
            profile_languages:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: ISO 639-1 language codes.
            open_to_volunteer:
              type: boolean
              nullable: true
          description: "The scrape_linkedin_search_people filters. A text the typeahead offers nothing for is a 422 naming it: these members take ids only."
        sales_nav_people:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              nullable: true
              maxLength: 256
            first_name:
              type: string
              nullable: true
              maxLength: 100
              description: Text-only wire facet (no id space).
            last_name:
              type: string
              nullable: true
              maxLength: 100
              description: Text-only wire facet (no id space).
            current_titles:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Text to resolve into an id plus LinkedIn's label; one the typeahead offers nothing for stays a free-text chip, which SN matches on this facet.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                  free_text:
                    type: boolean
                    nullable: true
                    description: true → send the text as a free-text chip, unresolved.
                description: "One chip: an id, or a text (at least one of the two)."
              maxItems: 10
              description: Current job titles (TITLE).
            past_titles:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Text to resolve into an id plus LinkedIn's label; one the typeahead offers nothing for stays a free-text chip, which SN matches on this facet.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                  free_text:
                    type: boolean
                    nullable: true
                    description: true → send the text as a free-text chip, unresolved.
                description: "One chip: an id, or a text (at least one of the two)."
              maxItems: 10
              description: Past job titles (TITLE).
            locations:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Text to resolve into an id plus LinkedIn's label; one the typeahead offers nothing for is a 422 naming the closest options.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One chip: an id, or a text (at least one of the two)."
              maxItems: 10
              description: Person geography (BING_GEO).
            company_headquarters:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Text to resolve into an id plus LinkedIn's label; one the typeahead offers nothing for is a 422 naming the closest options.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One chip: an id, or a text (at least one of the two)."
              maxItems: 10
              description: Current company HQ region (BING_GEO).
            industries:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Text to resolve into an id plus LinkedIn's label; one the typeahead offers nothing for is a 422 naming the closest options.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One chip: an id, or a text (at least one of the two)."
              maxItems: 10
              description: Industries (INDUSTRY).
            current_companies:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Text to resolve into an id plus LinkedIn's label; one the typeahead offers nothing for stays a free-text chip, which SN matches on this facet.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                  free_text:
                    type: boolean
                    nullable: true
                    description: true → send the text as a free-text chip, unresolved.
                description: "One chip: an id, or a text (at least one of the two)."
              maxItems: 10
              description: Current employer (COMPANY_WITH_LIST).
            past_companies:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Text to resolve into an id plus LinkedIn's label; one the typeahead offers nothing for stays a free-text chip, which SN matches on this facet.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                  free_text:
                    type: boolean
                    nullable: true
                    description: true → send the text as a free-text chip, unresolved.
                description: "One chip: an id, or a text (at least one of the two)."
              maxItems: 10
              description: Past employer (COMPANY_WITH_LIST).
            groups:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Text to resolve into an id plus LinkedIn's label; one the typeahead offers nothing for is a 422 naming the closest options.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One chip: an id, or a text (at least one of the two)."
              maxItems: 10
              description: Group membership (GROUP).
            schools:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Text to resolve into an id plus LinkedIn's label; one the typeahead offers nothing for is a 422 naming the closest options.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One chip: an id, or a text (at least one of the two)."
              maxItems: 10
              description: Schools (SCHOOL).
            seniority_levels:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "100"
                  - "110"
                  - "120"
                  - "130"
                  - "200"
                  - "210"
                  - "220"
                  - "300"
                  - "310"
                  - "320"
              maxItems: 10
              description: "SENIORITY_V2: '100' In Training, '110' Entry Level, '120' Senior, '130' Strategic, '200' Entry Level Manager, '210' Experienced Manager, '220' Director, '300' Vice President, '310' CXO, '320' Owner/Partner."
            functions:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
                  - "6"
                  - "7"
                  - "8"
                  - "9"
                  - "10"
                  - "11"
                  - "12"
                  - "13"
                  - "14"
                  - "15"
                  - "16"
                  - "17"
                  - "18"
                  - "19"
                  - "20"
                  - "21"
                  - "22"
                  - "23"
                  - "24"
                  - "25"
                  - "26"
              maxItems: 10
              description: "Job function: '1' Accounting, '2' Administrative, '3' Arts and Design, '4' Business Development, '5' Community and Social Services, '6' Consulting, '7' Education, '8' Engineering, '9' Entrepreneurship, '10' Finance, '11' Healthcare Services, '12' Human Resources, '13' Information Technology, '14' Legal, '15' Marketing, '16' Media and Communication, '17' Military and Protective Services, '18' Operations, '19' Product Management, '20' Program and Project Management, '21' Purchasing, '22' Quality Assurance, '23' Real Estate, '24' Research, '25' Sales, '26' Customer Success and Support."
            years_in_current_company:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
              maxItems: 5
              description: "Tenure at current company: '1' <1 year, '2' 1-2, '3' 3-5, '4' 6-10, '5' 10+ years."
            years_in_current_position:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
              maxItems: 5
              description: "Tenure in current position: '1' <1 year, '2' 1-2, '3' 3-5, '4' 6-10, '5' 10+ years."
            years_of_experience:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
              maxItems: 5
              description: "Total career length: '1' <1 year, '2' 1-2, '3' 3-5, '4' 6-10, '5' 10+ years."
            company_headcounts:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - A
                  - B
                  - C
                  - D
                  - E
                  - F
                  - G
                  - H
                  - I
              maxItems: 10
              description: "Company size: 'A' Self-employed, 'B' 1-10, 'C' 11-50, 'D' 51-200, 'E' 201-500, 'F' 501-1000, 'G' 1001-5000, 'H' 5001-10000, 'I' 10001+."
            company_types:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - C
                  - P
                  - N
                  - D
                  - S
                  - E
                  - O
                  - G
              maxItems: 10
              description: "Company type: 'C' Public, 'P' Privately Held, 'N' Non-profit, 'D' Educational, 'S' Partnership, 'E' Self-Employed, 'O' Self-Owned, 'G' Government."
            profile_languages:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - ar
                  - en
                  - es
                  - pt
                  - zh
                  - fr
                  - it
                  - ru
                  - de
                  - nl
                  - tr
                  - tl
                  - pl
                  - ko
                  - ja
                  - ms
                  - no
                  - da
                  - ro
                  - sv
                  - in
                  - cs
              maxItems: 10
              description: Profile language, ISO 639-1.
            network:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - F
                  - S
                  - A
                  - O
              maxItems: 4
              description: "Relationship degree: 'F' 1st, 'S' 2nd, 'A' group members, 'O' 3rd+."
            connections_of:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 64
                    description: A member token (ACwA…), as the search takes it.
                  text:
                    type: string
                    nullable: true
                    maxLength: 100
                    description: "Human text to resolve (\"Berlin\", \"Acme\"): typed into the typeahead, which picks the option labelled exactly so, else LinkedIn's first."
                description: "One value: an id, or a text to resolve (at least one of the two)."
              maxItems: 10
              description: "People connected to these members: a name resolves through CONNECTION_OF; a miss is a 422."
          description: The scrape_linkedin_search_sales_nav_people filters; resolution through the Sales Navigator typeahead, which needs an SN seat.
        companies:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              nullable: true
              maxLength: 256
            geo_ids:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 64
                    pattern: ^\d+$
                    description: A numeric id, as the search takes it; rides as it is.
                  text:
                    type: string
                    nullable: true
                    maxLength: 100
                    description: "Human text to resolve (\"Berlin\", \"Acme\"): typed into the typeahead, which picks the option labelled exactly so, else LinkedIn's first."
                description: "One value: an id, or a text to resolve (at least one of the two)."
              maxItems: 10
              description: HQ geography (location typeahead).
            industry_ids:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 64
                    pattern: ^\d+$
                    description: A numeric id, as the search takes it; rides as it is.
                  text:
                    type: string
                    nullable: true
                    maxLength: 100
                    description: "Human text to resolve (\"Berlin\", \"Acme\"): typed into the typeahead, which picks the option labelled exactly so, else LinkedIn's first."
                description: "One value: an id, or a text to resolve (at least one of the two)."
              maxItems: 10
              description: Industries (industry typeahead).
            company_sizes:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - 1_to_10
                  - 11_to_50
                  - 51_to_200
                  - 201_to_500
                  - 501_to_1000
                  - 1001_to_5000
                  - 5001_to_10000
                  - 10001_plus
              maxItems: 8
              description: Headcount ranges; the node maps each range onto the LinkedIn size-bucket id itself.
            network:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - 1st
              maxItems: 1
              description: Companies where you have 1st-degree connections; the company search takes the first degree only.
            has_jobs:
              type: boolean
              nullable: true
              description: true → only companies hiring on LinkedIn right now; false sends nothing.
          description: The scrape_linkedin_search_companies filters. A text the typeahead offers nothing for is a 422 naming it.
        sales_nav_companies:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              nullable: true
              maxLength: 256
            company_headquarters:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Text to resolve into an id plus LinkedIn's label; one the typeahead offers nothing for is a 422 naming the closest options.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One chip: an id, or a text (at least one of the two)."
              maxItems: 10
              description: HQ region (BING_GEO).
            industries:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Text to resolve into an id plus LinkedIn's label; one the typeahead offers nothing for is a 422 naming the closest options.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One chip: an id, or a text (at least one of the two)."
              maxItems: 10
              description: Industries (INDUSTRY).
            account_lists:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "A list NAME: matched against the seat's own lists, exactly or as the one name containing it; no match is a 422."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One facet value: at least one of id / text."
              maxItems: 10
              description: Your SN account lists, by id or by name (ACCOUNT_LIST).
            company_headcounts:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - B
                  - C
                  - D
                  - E
                  - F
                  - G
                  - H
                  - I
              maxItems: 10
              description: "Company size: 'B' 1-10, 'C' 11-50, 'D' 51-200, 'E' 201-500, 'F' 501-1000, 'G' 1001-5000, 'H' 5001-10000, 'I' 10001+ (account search has no 'A')."
            num_of_followers:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - NFR1
                  - NFR2
                  - NFR3
                  - NFR4
                  - NFR5
              maxItems: 5
              description: "LinkedIn page followers: NFR1 1-50, NFR2 51-100, NFR3 101-1000, NFR4 1001-5000, NFR5 5001+."
            fortune:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
              maxItems: 4
              description: "Fortune 500 tier: '1' Fortune 50, '2' 51-100, '3' 101-250, '4' 251-500."
            account_activities:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - SLC
                  - RFE
              maxItems: 2
              description: "Buying signals: 'SLC' senior-leadership changes in the last 3 months, 'RFE' funding event in the past 12 months."
            annual_revenue:
              type: object
              nullable: true
              properties:
                min:
                  type: integer
                  minimum: 0
                  maximum: 100000000
                max:
                  type: integer
                  minimum: 0
                  maximum: 100000000
                currency:
                  type: string
                  nullable: true
                  pattern: ^[A-Z]{3}$
                  description: ISO-4217 code; default USD.
              required:
                - min
                - max
              description: "Annual revenue range in MILLIONS (e.g. {min: 10, max: 100} = $10M-$100M)."
            company_headcount_growth:
              type: object
              nullable: true
              properties:
                min:
                  type: integer
                  minimum: -100
                  maximum: 1000
                max:
                  type: integer
                  minimum: -100
                  maximum: 1000
              required:
                - min
                - max
              description: Company-wide headcount growth range, percent (negative = shrinking).
            department_headcount:
              type: object
              nullable: true
              properties:
                department:
                  type: string
                  enum:
                    - "1"
                    - "2"
                    - "3"
                    - "4"
                    - "5"
                    - "6"
                    - "7"
                    - "8"
                    - "9"
                    - "10"
                    - "11"
                    - "12"
                    - "13"
                    - "14"
                    - "15"
                    - "16"
                    - "17"
                    - "18"
                    - "19"
                    - "20"
                    - "21"
                    - "22"
                    - "23"
                    - "24"
                    - "25"
                    - "26"
                  description: 'Numeric SN department id - the same taxonomy as the people-search functions facet (see its legend, or lookup(type: "FUNCTION")).'
                min:
                  type: integer
                  minimum: 0
                  maximum: 1000000
                max:
                  type: integer
                  minimum: 0
                  maximum: 1000000
              required:
                - department
                - min
                - max
              description: 'Headcount of ONE department (e.g. department "25" Sales, {min: 20, max: 99999}).'
            department_headcount_growth:
              type: object
              nullable: true
              properties:
                department:
                  type: string
                  enum:
                    - "1"
                    - "2"
                    - "3"
                    - "4"
                    - "5"
                    - "6"
                    - "7"
                    - "8"
                    - "9"
                    - "10"
                    - "11"
                    - "12"
                    - "13"
                    - "14"
                    - "15"
                    - "16"
                    - "17"
                    - "18"
                    - "19"
                    - "20"
                    - "21"
                    - "22"
                    - "23"
                    - "24"
                    - "25"
                    - "26"
                  description: 'Numeric SN department id - the same taxonomy as the people-search functions facet (see its legend, or lookup(type: "FUNCTION")).'
                min:
                  type: integer
                  minimum: -100
                  maximum: 1000
                max:
                  type: integer
                  minimum: -100
                  maximum: 1000
              required:
                - department
                - min
                - max
              description: Growth of ONE department, percent - e.g. engineering team growing 10%+.
            hiring_on_linkedin:
              type: boolean
              nullable: true
              description: true → only accounts currently hiring on LinkedIn.
            first_degree_connection:
              type: boolean
              nullable: true
              description: true → only accounts where you have a 1st-degree connection.
            saved_accounts_only:
              type: boolean
              nullable: true
              description: true → only your saved SN accounts.
          description: The scrape_linkedin_search_sales_nav_companies filters; resolution through the Sales Navigator typeahead, which needs an SN seat.
    ScrapeLinkedinBuildSearchUrlResponse:
      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: {}
        result:
          type: object
          properties:
            url:
              type: string
              description: "The search URL: open it, paste it into the matching search tool's url, or hand it to an import."
            filters:
              type: object
              properties: {}
              description: "The filters in the exact shape the matching search tool takes as `filters`: texts replaced by the ids they resolved to."
            resolved:
              type: array
              items:
                type: object
                properties:
                  member:
                    type: string
                    description: The filter member the value sits in.
                  query:
                    type: string
                    description: The text as given (trimmed).
                  lookup_type:
                    type: string
                    description: The typeahead type it went through (location, company, TITLE, BING_GEO, ACCOUNT_LIST, ...).
                  id:
                    type: string
                    nullable: true
                    description: The id picked; null when the typeahead offered nothing and the text rides as a Sales Navigator free-text chip.
                  display_name:
                    type: string
                    nullable: true
                    description: LinkedIn's label of the picked option, also the chip text on Sales Navigator.
                  alternatives:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        display_name:
                          type: string
                          nullable: true
                      required:
                        - id
                        - display_name
                    description: "The other options LinkedIn offered, best first: resend the value with one of these ids to choose another."
                required:
                  - member
                  - query
                  - lookup_type
                  - id
                  - display_name
                  - alternatives
              description: One entry per text value that went through a typeahead, in filter order; empty when every value carried an id.
            data_requests:
              type: array
              items:
                type: object
                properties: {}
                description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
              description: The kind="scrape" ledger rows of the typeahead lookups this call ran, one per distinct text; empty when nothing was resolved.
          required:
            - url
            - filters
            - resolved
            - data_requests
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinCompanyDecisionMakersRequest:
      type: object
      description: Request body of `scrape_linkedin_company_decision_makers`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        company:
          type: object
          properties:
            company_url:
              type: string
              nullable: true
              maxLength: 512
              description: https://www.linkedin.com/company/{slug}/
            company_ln_id:
              type: string
              nullable: true
              maxLength: 64
              description: Numeric LinkedIn company id.
          description: "Target company: exactly one of company_url / company_ln_id."
        limit:
          type: integer
          minimum: 1
          maximum: 50
          description: Default 25.
      required:
        - company
    ScrapeLinkedinCompanyDecisionMakersResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                    description: Canonical member id (decoded in-process).
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                    description: The card's headline line on the regular and Recruiter engines; null on Sales Navigator people search.
                  position:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured position (read the headline).
                  company_name:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured company (read the headline).
                  location:
                    type: string
                    nullable: true
                    description: The card's location line on the regular and Recruiter engines; null on Sales Navigator people search.
                  avatar_url:
                    type: string
                    nullable: true
                    description: Best effort on the regular engines (a DOM lookup, null when the card image had not rendered).
                  connection_degree:
                    type: string
                    nullable: true
                    description: "The degree badge as the card prints it: 1st, 2nd, 3rd or 3rd+ on the regular engines; Recruiter spells 1st, 2nd, 3rd, out_of_network."
                required:
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - full_name
                  - headline
                  - position
                  - company_name
                  - location
                  - avatar_url
                  - connection_degree
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging: {}
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinCompanyEmployeesRequest:
      type: object
      description: Request body of `scrape_linkedin_company_employees`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        company:
          type: object
          properties:
            company_url:
              type: string
              nullable: true
              maxLength: 512
              description: https://www.linkedin.com/company/{slug}/
            company_ln_id:
              type: string
              nullable: true
              maxLength: 64
              description: Numeric LinkedIn company id.
          description: "Target company: exactly one of company_url / company_ln_id."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: Default 1.
      required:
        - company
    ScrapeLinkedinCompanyEmployeesResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                    description: Canonical member id (decoded in-process).
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                    description: The card's headline line on the regular and Recruiter engines; null on Sales Navigator people search.
                  position:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured position (read the headline).
                  company_name:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured company (read the headline).
                  location:
                    type: string
                    nullable: true
                    description: The card's location line on the regular and Recruiter engines; null on Sales Navigator people search.
                  avatar_url:
                    type: string
                    nullable: true
                    description: Best effort on the regular engines (a DOM lookup, null when the card image had not rendered).
                  connection_degree:
                    type: string
                    nullable: true
                    description: "The degree badge as the card prints it: 1st, 2nd, 3rd or 3rd+ on the regular engines; Recruiter spells 1st, 2nd, 3rd, out_of_network."
                required:
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - full_name
                  - headline
                  - position
                  - company_name
                  - location
                  - avatar_url
                  - connection_degree
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinGetPostCommentsRequest:
      type: object
      description: Request body of `scrape_linkedin_get_post_comments`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        post:
          type: string
          maxLength: 512
          description: "The post, named any way you have it. LinkedIn files a post's comments under its social thread (the ugcPost or groupPost urn for those posts, the activity urn for a share post) and a wrong key fails quietly: the activity urn of a ugcPost post reads an EMPTY list newest-first and a first page with total 0 and no next cursor by relevance (live 2026-09-16), a share urn reads empty. So a `urn:li:ugcPost:<id>` or `urn:li:groupPost:<group>-<post>`, or a link carrying one (a `-ugcPost-<id>-` share link), is the thread and reads in one wire page; an `urn:li:activity:<id>` (bare, in a feed permalink or in a `/posts/<slug>-activity-<id>-<hash>` share link) or a `urn:li:share:<id>` costs one post read first (cached 7 days, so only the first call on a post pays it). result.post.post_ln_id is the urn the list was read by: page on with it to skip the read. A linkedin.com link with no id in it (a bare slug URL) adds one more page load to find the urn. An `lnkd.in` shortlink (the form Copy link to post mints) is expanded server-side and its slug id lifted locally, one wire page like any id-carrying URL; one that expands to a non-LinkedIn target is refused 422 post_not_resolvable, and so is a post the read returns null for (deleted, or not visible to the executing account). The post does NOT need to be tracked or owned by you."
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Default 50; one wire page per call.
        sort_order:
          type: string
          enum:
            - RELEVANCE
            - CHRONOLOGICAL
            - REVERSE_CHRONOLOGICAL
          description: Order of the comment list. RELEVANCE is LinkedIn's own default and what you get when this is omitted; REVERSE_CHRONOLOGICAL is "Most recent" in the UI, CHRONOLOGICAL walks oldest-first. Polling a watched post for new comments wants REVERSE_CHRONOLOGICAL, because under relevance a new comment is not guaranteed to be on page 1. A cursor belongs to the order it was issued under - do not resume a walk with a different sort_order.
        cursor:
          type: string
          nullable: true
          description: Opaque resume token from paging.next_cursor; null = first page.
      required:
        - post
    ScrapeLinkedinGetPostCommentsResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  commenter_ln_member_id:
                    type: string
                  commenter_ln_id:
                    type: string
                    nullable: true
                  commenter_nickname:
                    type: string
                    nullable: true
                  commenter_full_name:
                    type: string
                    nullable: true
                  commenter_headline:
                    type: string
                    nullable: true
                  commenter_picture_url:
                    type: string
                    nullable: true
                  comment_ln_id:
                    type: string
                  content:
                    type: string
                  posted_at:
                    type: string
                    nullable: true
                  reactions_count:
                    type: integer
                    description: SUM of every reaction bucket on the comment, not a like count.
                  comment_permalink:
                    type: string
                    nullable: true
                    description: Public deep link to this comment.
                  replies_count:
                    type: integer
                    description: "How many replies the comment has. A COUNT ONLY: this verb queries the post's comment list and fetches no replies, so there is no way to read them and no replies array to ask for."
                  is_pinned:
                    type: boolean
                  is_edited:
                    type: boolean
                  is_own:
                    type: boolean
                    description: Commenter matches one of the team’s managed accounts (same rule as sync).
                required:
                  - commenter_ln_member_id
                  - commenter_ln_id
                  - commenter_nickname
                  - commenter_full_name
                  - commenter_headline
                  - commenter_picture_url
                  - comment_ln_id
                  - content
                  - posted_at
                  - reactions_count
                  - comment_permalink
                  - replies_count
                  - is_pinned
                  - is_edited
                  - is_own
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page_size:
                  type: integer
                next_cursor:
                  type: string
                  nullable: true
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page_size
                - next_cursor
                - has_more
                - total
              description: "Cursor paging: feed next_cursor back verbatim; null = terminal page."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
            post:
              type: object
              properties:
                post_ln_id:
                  type: string
              required:
                - post_ln_id
              description: The resolved post target the getter ran against.
            skipped_invalid_rows:
              type: integer
              description: Wire comments with urn=null / no decodable author skipped.
          required:
            - rows
            - paging
            - data_request
            - post
            - skipped_invalid_rows
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinGetPostReactorsRequest:
      type: object
      description: Request body of `scrape_linkedin_get_post_reactors`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        post:
          type: string
          maxLength: 512
          description: "A post URL, a post urn in any family, or a COMMENT urn (public or fsd form - passed to the wire verbatim, no post read: a comment IS the entity). Cheapest is the thread itself: a `urn:li:ugcPost:<id>` or `urn:li:groupPost:<group>-<post>`, or a URL carrying one (a `-ugcPost-<id>-` share link, a `/feed/update/urn:li:ugcPost:<id>/` permalink), read directly. An `urn:li:activity:<id>` (bare, in a feed permalink or in a `/posts/<slug>-activity-<id>-<hash>` share link) and a `urn:li:share:<id>` cost one extra post read first, the same read as enrich_linkedin_post_details and cached 7 days, so only the first call on a post pays it: an activity urn does not say whether it wraps a ugcPost or a share post, and the reactions read by the wrong key come back as an empty page. So if you already hold a post's post_urn and it is a ugcPost, pass that. A repost without commentary reads the original's reactions. An `lnkd.in` shortlink is expanded server-side at no cost; a linkedin.com link with no id in it (a bare slug URL) is resolved by opening the page through get_activity_urn_by_url, one more page load, cached 7 days. A post LinkedIn returns no post for (deleted, or not visible to the executing account) is refused 422 post_not_resolvable. The post does NOT need to be tracked or owned by you."
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Default 50.
        cursor:
          type: string
          nullable: true
          description: Opaque resume token; null = first page.
      required:
        - post
    ScrapeLinkedinGetPostReactorsResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  reactor_ln_member_id:
                    type: string
                  reactor_ln_id:
                    type: string
                    nullable: true
                  reactor_nickname:
                    type: string
                    nullable: true
                  reactor_full_name:
                    type: string
                    nullable: true
                  reactor_headline:
                    type: string
                    nullable: true
                  reactor_picture_url:
                    type: string
                    nullable: true
                  reaction_type:
                    type: string
                    enum:
                      - like
                      - celebrate
                      - support
                      - love
                      - insightful
                      - funny
                      - interested
                    description: The reaction, in OUR write vocabulary (the same names react_linkedin_post takes; wire INTEREST reads as insightful, MAYBE as interested). Until 2026-08-21 the wire names leaked here lowercased.
                  reacted_at:
                    type: string
                    nullable: true
                  is_own:
                    type: boolean
                required:
                  - reactor_ln_member_id
                  - reactor_ln_id
                  - reactor_nickname
                  - reactor_full_name
                  - reactor_headline
                  - reactor_picture_url
                  - reaction_type
                  - reacted_at
                  - is_own
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page_size:
                  type: integer
                next_cursor:
                  type: string
                  nullable: true
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page_size
                - next_cursor
                - has_more
                - total
              description: "Cursor paging: feed next_cursor back verbatim; null = terminal page."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
            post:
              type: object
              properties:
                post_ln_id:
                  type: string
              required:
                - post_ln_id
              description: The resolved post target the getter ran against.
            skipped_null_actors:
              type: integer
              description: Banned/suspended reactor slots skipped (KNOWLEDGE §7a).
          required:
            - rows
            - paging
            - data_request
            - post
            - skipped_null_actors
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinGetPostResharersRequest:
      type: object
      description: Request body of `scrape_linkedin_get_post_resharers`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        post:
          type: string
          maxLength: 512
          description: A post URL, an activity URN, or a backend post urn (`urn:li:share:<id>` / `urn:li:ugcPost:<id>`, passed verbatim). NOT `urn:li:groupPost:` - the reshare feed refuses it, so we refuse it locally by name. URL forms are parsed locally at no extra cost; a link with no id in it (a shortlink, a bare slug URL) is resolved by opening the page through get_activity_urn_by_url, which adds one extra page load to this call and is cached 7 days. The post does NOT need to be tracked or owned by you.
        page_size:
          type: integer
          minimum: 1
          maximum: 100
          description: Default 50.
        cursor:
          type: string
          nullable: true
          description: Opaque resume token; null = first page.
      required:
        - post
    ScrapeLinkedinGetPostResharersResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  resharer_ln_member_id:
                    type: string
                  resharer_ln_id:
                    type: string
                    nullable: true
                  resharer_nickname:
                    type: string
                    nullable: true
                  resharer_full_name:
                    type: string
                    nullable: true
                  resharer_headline:
                    type: string
                    nullable: true
                  resharer_picture_url:
                    type: string
                    nullable: true
                  resharer_commentary:
                    type: string
                    nullable: true
                    description: Text added when resharing (empty for a plain reshare).
                  reshare_urn:
                    type: string
                    nullable: true
                    description: The reshare’s own activity URN. Feed it back into get-post-comments/-reactors to scrape the reshare itself.
                  is_own:
                    type: boolean
                required:
                  - resharer_ln_member_id
                  - resharer_ln_id
                  - resharer_nickname
                  - resharer_full_name
                  - resharer_headline
                  - resharer_picture_url
                  - resharer_commentary
                  - reshare_urn
                  - is_own
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page_size:
                  type: integer
                next_cursor:
                  type: string
                  nullable: true
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page_size
                - next_cursor
                - has_more
                - total
              description: "Cursor paging: feed next_cursor back verbatim; null = terminal page."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
            post:
              type: object
              properties:
                post_ln_id:
                  type: string
              required:
                - post_ln_id
              description: The resolved post target the getter ran against.
          required:
            - rows
            - paging
            - data_request
            - post
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinParamIdLookupRequest:
      type: object
      description: Request body of `scrape_linkedin_param_id_lookup`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        type:
          type: string
          enum:
            - people
            - connections
            - location
            - company
            - school
            - industry
            - service_category
            - product_category
            - job_location
          description: "Which dropdown to type into. Where each id lands in the search_people filters: people → followers_of, connections → connections_of, location → locations, company → current_companies, industry → industries, service_category → service_categories. search_service_providers takes the same location and service_category ids; search_companies takes location as geo_ids and industry as industry_ids (matched on the people search, not yet verified there). job_location is the JOBS search box and its ids feed the search_jobs geo_id member ONLY: a different family from the location ids above, so do not cross the two. product_category feeds the search_products product_category member, and ONLY that one: its sibling product_company takes ordinary organization ids, which this endpoint does not resolve under that name (use type=company). school is the one type with no filter member on this surface."
        query:
          type: string
          minLength: 1
          maxLength: 100
          description: "The human term to resolve. Always required: a typeahead has nothing to offer without typed text, and every one of the nine types is a text box."
      required:
        - type
        - query
    ScrapeLinkedinParamIdLookupResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                    enum:
                      - people
                      - connections
                      - location
                      - company
                      - school
                      - industry
                      - service_category
                      - product_category
                      - job_location
                    description: Echo of the requested type, so a caller batching several lookups can tell the rows apart.
                  id:
                    type: string
                    description: The raw filter value the picked option feeds, e.g. location "104001442", company "167560", people "ACoAAADnFr8Brc7l...". Not a urn. Goes into the filter member verbatim.
                  display_name:
                    type: string
                    description: The option label, LinkedIn's first visible line (wire display_value).
                  subtitle:
                    type: string
                    nullable: true
                    description: "The option's second line: member headline for people/connections, industry for company. null for the other six types, which render one line."
                required:
                  - type
                  - id
                  - display_name
                  - subtitle
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging: {}
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinRecruiterParamIdLookupRequest:
      type: object
      description: Request body of `scrape_linkedin_recruiter_param_id_lookup`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        type:
          type: string
          enum:
            - occupation
            - skill
            - company
            - geo
            - zip
            - industry
            - school
            - fieldOfStudy
            - degree
            - language
            - group
          description: "The Recruiter search-filter typeahead kind (node talentTypeaheads `q`, passed through verbatim). Every kind is a text facet, so `query` is required. Where each id lands in the search_recruiter_people filters: occupation → job_titles / occupations, skill → skills, company → companies / current_companies, geo → locations, zip → postal_codes, industry → industries, school → schools (the row id is the school's organization urn, what the facet matches on), fieldOfStudy → fields_of_study, degree → degrees, language → spoken_languages (the id is the lowercase language name), group → no search member yet. Pass the row's display_name as the chip text on job_titles / occupations / skills / companies / postal_codes. The closed enums of the search (seniority, function, company size, …) have no typeahead: their code sets are inline in the filters."
        query:
          type: string
          minLength: 1
          maxLength: 100
          description: The typed term - required, every kind is a text facet.
      required:
        - type
        - query
    ScrapeLinkedinRecruiterParamIdLookupResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                  id:
                    type: string
                    description: Opaque SN facet id. Feed it VERBATIM into the SN search filters (company "urn:li:organization:1441", geo "100506914", …).
                  display_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  entity_urn:
                    type: string
                    nullable: true
                  image_url:
                    type: string
                    nullable: true
                required:
                  - type
                  - id
                  - display_name
                  - headline
                  - entity_urn
                  - image_url
                description: "Same shape as the Sales Navigator lookup rows: id is what the Recruiter filter takes; entity_urn the typeahead entity urn; headline the ISO country code for geo / zip, the organization urn for school; image_url the company logo."
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging: {}
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSalesNavParamIdLookupRequest:
      type: object
      description: Request body of `scrape_linkedin_sales_nav_param_id_lookup`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        type:
          type: string
          enum:
            - COMPANY_WITH_LIST
            - BING_GEO
            - INDUSTRY
            - TITLE
            - GROUP
            - SCHOOL
            - CONNECTION_OF
            - COMPANY_SIZE
            - FUNCTION
            - SENIORITY_V2
            - RELATIONSHIP
            - COMPANY_TYPE
            - TENURE
            - PROFILE_LANGUAGE
            - PERSONA
            - ACCOUNT_LIST
            - LEAD_LIST
            - LEAD_INTERACTIONS
            - SAVED_LEADS_AND_ACCOUNTS
          description: The Sales Navigator facet kind to resolve (node salesApiFacetTypeahead `type`, passed through verbatim). The first seven are text facets that resolve `query`; the rest return their fixed / account-scoped list and ignore it.
        query:
          type: string
          nullable: true
          minLength: 1
          maxLength: 100
          description: The typed term (text facets); ignored by static-enum / list facets.
        limit:
          type: integer
          minimum: 1
          maximum: 25
          description: Default 10.
      required:
        - type
    ScrapeLinkedinSalesNavParamIdLookupResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                  id:
                    type: string
                    description: Opaque SN facet id. Feed it VERBATIM into the SN search filters (company "urn:li:organization:1441", geo "100506914", …).
                  display_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  entity_urn:
                    type: string
                    nullable: true
                  image_url:
                    type: string
                    nullable: true
                required:
                  - type
                  - id
                  - display_name
                  - headline
                  - entity_urn
                  - image_url
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging: {}
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchCompaniesRequest:
      type: object
      description: Request body of `scrape_linkedin_search_companies`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/search\/results\/companies\/
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/search/results/companies/ : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              nullable: true
              maxLength: 256
            geo_ids:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: 'Numeric LinkedIn geo ids. scrape_linkedin_param_id_lookup(type: "location") answers in this id family, but the mapping was matched on the people search and this engine sends the ids under its own URL param, so check the first page before a long run.'
            industry_ids:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: 'Numeric LinkedIn industry ids, from scrape_linkedin_param_id_lookup(type: "industry"). Same caveat as geo_ids: the mapping is verified on the people search, not on this one.'
            company_sizes:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - 1_to_10
                  - 11_to_50
                  - 51_to_200
                  - 201_to_500
                  - 501_to_1000
                  - 1001_to_5000
                  - 5001_to_10000
                  - 10001_plus
              maxItems: 8
              description: Headcount ranges; the node maps each range onto the LinkedIn size-bucket id itself.
            network:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - 1st
              maxItems: 1
              description: Companies where you have 1st-degree connections; the company search takes the first degree only.
            has_jobs:
              type: boolean
              nullable: true
              description: true → only companies hiring on LinkedIn right now; false sends nothing.
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). Regular company-search filters. At least one member must be non-empty."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more.
    ScrapeLinkedinSearchCompaniesResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  company_ln_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                    description: "Vanity slug; regular and similar-companies engines only (Sales Navigator: null, resolve via get-company-public-identifier)."
                  name:
                    type: string
                    nullable: true
                  industry:
                    type: string
                    nullable: true
                  employees_size:
                    type: string
                    nullable: true
                    description: Sales Navigator size bucket ("11-50"); null on the regular engine.
                  followers:
                    type: integer
                    nullable: true
                    description: Regular and similar-companies engines; the regular card's rounded "4K followers" reads 4000.
                  location:
                    type: string
                    nullable: true
                    description: "Regular engine: the card's location line; many cards print none."
                  tagline:
                    type: string
                    nullable: true
                    description: Sales Navigator only.
                  logo_url:
                    type: string
                    nullable: true
                  website:
                    type: string
                    nullable: true
                    description: On no search wire; always null.
                required:
                  - company_ln_id
                  - nickname
                  - name
                  - industry
                  - employees_size
                  - followers
                  - location
                  - tagline
                  - logo_url
                  - website
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchCoursesRequest:
      type: object
      description: Request body of `scrape_linkedin_search_courses`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/search\/results\/learning\/
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/search/results/learning/ : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              maxLength: 256
              description: "REQUIRED: this engine has no wire form without a query, so a filter object carrying only a difficulty or only a length band is refused rather than run wide."
            difficulty:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - beginner
                  - intermediate
                  - advanced
              maxItems: 3
              description: "Course level, LinkedIn Learning's own three. Send these readable names: the node maps each onto LinkedIn's own label (\"Beginner\") while it composes the URL, so a label sent from here is refused by its validator."
            time_to_complete:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - under_10_mins
                  - 10_to_30_mins
                  - 30_to_60_mins
                  - 1_to_2_hours
                  - 2_to_3_hours
                  - 3_plus_hours
              maxItems: 6
              description: Course-length bands, in LinkedIn's own dropdown order. Readable names only, mapped node-side exactly like difficulty ("< 10 mins", "3+ hours"); the bands are what the UI offers, so an arbitrary minute range cannot be asked for.
          required:
            - keywords
          additionalProperties: false
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). LinkedIn LEARNING course-search filters. keywords is REQUIRED; difficulty and time_to_complete are closed vocabularies whose values the NODE translates into LinkedIn's own labels, so send the names spelled here and never a LinkedIn label. Any other key is REFUSED rather than ignored, which matters because the learning screen also ships software and subject facets this vocabulary does not carry: those are reachable only by building the search in the LinkedIn UI and pasting the URL into the url field."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: "LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
    ScrapeLinkedinSearchCoursesResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  course_slug:
                    type: string
                    description: "The /learning/{slug} path segment, and the ONLY identity a course row carries: this vertical has no numeric id anywhere on the wire. A card whose slug cannot be read is dropped rather than returned half-formed, and a repeat of a slug already seen on this page is dropped too."
                  course_url:
                    type: string
                    description: https://www.linkedin.com/learning/{course_slug}/ , composed from the slug, so it is stable and free of tracking parameters.
                  title:
                    type: string
                    description: Course title, read out of the English "Save the course <TITLE>" button label. A card whose title cannot be read is dropped, so this is never null, which is exactly why a non-English executor returns an empty page instead of untitled rows.
                  author:
                    type: string
                    nullable: true
                    description: "The instructor, from the card's \"By: <name>\" line with the prefix stripped. A bare NAME: no member id, no vanity slug, so joining an instructor back to a LinkedIn profile needs a second search."
                  duration_text:
                    type: string
                    nullable: true
                    description: "Course length, NORMALISED rather than quoted: the parser reads LinkedIn's accessible form (\"6 hours and 14 minutes\", \"1 day and 10 hours\"), folds days into hours and re-prints it compactly (\"34h 10m\", \"45m\"). It is not the string on the card and not a number of minutes, so parse it if you need arithmetic."
                  released_text:
                    type: string
                    nullable: true
                    description: The release line VERBATIM, prefix included ("Released Jan 2026"). Free text, not a date, and unlike author the "Released " prefix is deliberately not stripped.
                  viewers_text:
                    type: string
                    nullable: true
                    description: 'The viewer counter exactly as printed ("12,345 viewers", "1.2M viewers"). Kept as text on purpose: LinkedIn rounds the compact form, so there is no honest integer to parse it into.'
                  thumbnail_url:
                    type: string
                    nullable: true
                    description: "Course artwork, widest rendition available. Best effort: a card renders several images and the most repeated asset is taken as the thumbnail."
                  position:
                    type: integer
                    nullable: true
                    description: The card's slot on THIS page, 0 based and page local, so it is not a rank across pages. Numbering happens before duplicate slugs are dropped, which can leave gaps. The parser always fills it, so null means the key was missing from the wire row.
                required:
                  - course_slug
                  - course_url
                  - title
                  - author
                  - duration_text
                  - released_text
                  - viewers_text
                  - thumbnail_url
                  - position
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more. total carries LinkedIn's own result count when the page printed one, best effort and null otherwise, so drive the loop from has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchEventsRequest:
      type: object
      description: Request body of `scrape_linkedin_search_events`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/search\/results\/events\/
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/search/results/events/ : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              maxLength: 256
              description: "REQUIRED, and the WHOLE vocabulary: the events search has no wire form without a query and no second axis to combine with it. Passed to LinkedIn verbatim."
          required:
            - keywords
          additionalProperties: false
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). LinkedIn events-search filters. keywords is the only member there is, because it is the only one the engine accepts, and any other key is REFUSED rather than ignored. Every facet the LinkedIn events screen itself offers is reachable ONLY by building the search in that UI and pasting the URL into the url field."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: "LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
    ScrapeLinkedinSearchEventsResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  event_ln_id:
                    type: string
                    description: LinkedIn's numeric event id (the wire's event_id), the only stable identity an event row carries. A card whose id cannot be read is dropped rather than returned half-formed, and a repeat of an id already seen on this page is dropped too.
                  event_url:
                    type: string
                    description: https://www.linkedin.com/events/{event_ln_id}/ , composed from the id, so it is stable and free of tracking parameters.
                  title:
                    type: string
                    description: Event title. A card whose title cannot be read is dropped, so this is never null.
                  date_text:
                    type: string
                    nullable: true
                    description: The date line as LinkedIn printed it ("Wed, Sep 16 - Fri, Sep 18", "Wed, Jul 29, 11:00 AM", "Jul 29, 2026"). Free text in the viewing account's own timezone, not a timestamp, and start and end are not split out.
                  location_text:
                    type: string
                    nullable: true
                    description: 'Where it happens, as printed: "Online", "In person", "Hybrid" or a venue. When the card packs location and organizer into one bulleted line, this holds the left half only.'
                  organizer:
                    type: string
                    nullable: true
                    description: The "By <name>" half of that same line, prefix stripped. null whenever the card printed no bullet, which is the common case, so null here means the card did not name an organizer rather than that the event has none.
                  description:
                    type: string
                    nullable: true
                    description: "The card's blurb: the longest small-print line that is not the attendee counter. LinkedIn truncates it on the card, so it is a snippet, not the event description."
                  attendee_count:
                    type: integer
                    nullable: true
                    description: Attendees, parsed out of attendees_text. 0 is a REAL value and means the card said "Be the first attendee"; null means no counter was read at all. Do not conflate the two. A compact counter is rounded on the way in ("2.3K attendees" becomes 2300), so a large number is an approximation.
                  attendees_text:
                    type: string
                    nullable: true
                    description: The counter exactly as printed ("4 attendees", "2.3K attendees", "Be the first attendee"). Read this whenever the rounding in attendee_count would matter.
                  thumbnail_url:
                    type: string
                    nullable: true
                    description: "Event cover image, widest rendition available. Best effort: a card renders several images and the most repeated asset is taken as the cover."
                  position:
                    type: integer
                    nullable: true
                    description: The card's slot on THIS page, 0 based and page local, so it is not a rank across pages. Numbering happens before duplicate ids are dropped, which can leave gaps. The parser always fills it, so null means the key was missing from the wire row.
                required:
                  - event_ln_id
                  - event_url
                  - title
                  - date_text
                  - location_text
                  - organizer
                  - description
                  - attendee_count
                  - attendees_text
                  - thumbnail_url
                  - position
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more. total carries LinkedIn's own result count when the page printed one, best effort and null otherwise, so drive the loop from has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchGroupsRequest:
      type: object
      description: Request body of `scrape_linkedin_search_groups`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/search\/results\/groups\/
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/search/results/groups/ : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              maxLength: 256
              description: "REQUIRED, and the WHOLE vocabulary: the groups search has no wire form without a query and no second axis to combine with it. Passed to LinkedIn verbatim."
          required:
            - keywords
          additionalProperties: false
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). LinkedIn groups-search filters. keywords is the only member there is, and any other key is REFUSED rather than ignored. Anything else the groups screen offers is reachable only by building the search in the LinkedIn UI and pasting the URL into the url field."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: "LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
    ScrapeLinkedinSearchGroupsResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  group_ln_id:
                    type: string
                    description: LinkedIn's numeric group id, the only stable identity a group row carries. A card whose id cannot be read is dropped rather than returned half-formed, and a repeat of an id already seen on this page is dropped too.
                  group_url:
                    type: string
                    description: https://www.linkedin.com/groups/{group_ln_id}/ , composed from the id, so it is stable and free of tracking parameters.
                  name:
                    type: string
                    description: Group name. A card whose name cannot be read is dropped, so this is never null, which is exactly why a non-English executor returns an empty page instead of nameless rows.
                  privacy:
                    type: string
                    nullable: true
                    description: "\"Public\" or \"Private\", LinkedIn's own casing, read from the card's \"Public Group\" / \"Private Group\" label. English-only, so it goes null on any other interface language rather than guessing."
                  member_count:
                    type: integer
                    nullable: true
                    description: Members, parsed out of members_text. 0 is a REAL value; null means no counter was read at all. Do not conflate the two, and do not test for falsiness.
                  members_text:
                    type: string
                    nullable: true
                    description: The counter exactly as LinkedIn printed it ("1,204 members").
                  description:
                    type: string
                    nullable: true
                    description: "Best-effort blurb, ASSEMBLED rather than read: LinkedIn splits the text into several chunks, so the parser collects the human-looking strings in the card and joins them. It can pick up unrelated card copy, so do not hang hard product logic on it."
                  logo_url:
                    type: string
                    nullable: true
                    description: "Group logo, widest rendition available. Best effort: the card renders several images and the most repeated asset is taken as the logo, so cross-card bleed is possible."
                  position:
                    type: integer
                    nullable: true
                    description: The card's slot on THIS page, 0 based and page local, so it is not a rank across pages. Numbering happens before duplicate ids are dropped, which can leave gaps. The parser always fills it, so null means the key was missing from the wire row.
                required:
                  - group_ln_id
                  - group_url
                  - name
                  - privacy
                  - member_count
                  - members_text
                  - description
                  - logo_url
                  - position
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more. total carries LinkedIn's own result count when the page printed one, best effort and null otherwise, so drive the loop from has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchJobsRequest:
      type: object
      description: Request body of `scrape_linkedin_search_jobs`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/jobs\/search-results\/
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/jobs/search-results/ : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              maxLength: 256
              description: "REQUIRED: this engine has no wire form without a query, so a filter object carrying only geo_id or only a company is refused rather than run wide."
            geo_id:
              type: string
              nullable: true
              pattern: ^\d+$
              description: "ONE numeric LinkedIn geo id, from scrape_linkedin_param_id_lookup(type: \"job_location\"). Resolve it with THAT type: the ids type \"location\" answers feed the people search's locations member and are a different family, so the two must not be crossed. One location per search; a second one, or a radius around it, needs the url half of this tool."
            time_posted:
              type: string
              nullable: true
              enum:
                - past_24h
                - past_week
                - past_month
              description: Keep only postings listed inside this window; the node maps it onto LinkedIn's own recency value.
            company_ids:
              type: array
              nullable: true
              items:
                type: string
                pattern: ^\d+$
              maxItems: 10
              description: "LinkedIn's own numeric company ids, hiring company. scrape_linkedin_param_id_lookup(type: \"company\") answers in what looks like the same numeric org-id space, which is our reading of the wire rather than a mapping verified on this engine. A vanity slug is refused here, because the node would accept it and quietly match nothing."
            easy_apply:
              type: boolean
              nullable: true
              description: "true keeps only postings with LinkedIn's one-click Easy Apply. false and omitted are the same thing: the filter is simply not sent."
            remote:
              type: boolean
              nullable: true
              description: "true keeps only REMOTE postings. Hybrid and on-site cannot be asked for: LinkedIn encodes all three as attributes of one workplace facet and only the remote attribute id is known from real traffic, so the other two would be a guess. Rows still come back labelled with workplace_type, so you can read the whole axis; to FILTER on hybrid or on-site, set it in the LinkedIn UI and paste the URL into this tool's url field."
            experience_level:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - entry
                  - senior
                  - manager
                  - director
                  - executive
              maxItems: 5
              description: "Seniority the posting asks for, in LinkedIn's own dropdown order. Send these readable names: the node maps each onto LinkedIn's opaque attribute id itself, and a numeric id is refused."
            employment_type:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - part_time
                  - contract
                  - internship
                  - full_time
                  - volunteer
              maxItems: 5
              description: Engagement type, in LinkedIn's own dropdown order. Readable names only, mapped node-side like experience_level.
            early_applicant:
              type: boolean
              nullable: true
              description: 'true keeps postings LinkedIn tags "Be an early applicant" (few applications so far). UNPROVEN: the wire parameter behind this one toggle was reasoned out by symmetry with easy_apply and in_your_network, which were both read off captured traffic, and no live run has confirmed it yet. If a page comes back looking unfiltered on this axis, that is the likely cause.'
            in_your_network:
              type: boolean
              nullable: true
              description: true keeps only postings at companies where someone in your network works.
          required:
            - keywords
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). LinkedIn jobs-search filters. keywords is REQUIRED; everything else is optional, and a false boolean is the same as an absent one. Anything this vocabulary cannot express (hybrid or on-site work, more than one location, a radius around one, verified-jobs, and the other facet segments LinkedIn ships) is reachable by pasting the UI URL into the url field instead."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: "LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
    ScrapeLinkedinSearchJobsResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  job_ln_id:
                    type: string
                    description: LinkedIn's numeric posting id, the only stable identity a job row carries. A card whose id cannot be read is dropped rather than returned half-formed.
                  job_url:
                    type: string
                    description: https://www.linkedin.com/jobs/view/{job_ln_id}/ , composed from the id, so it is stable and free of tracking parameters.
                  title:
                    type: string
                    description: Posting title. A card whose title cannot be read is dropped, so this is never null.
                  company_name:
                    type: string
                    nullable: true
                  company_logo_url:
                    type: string
                    nullable: true
                    description: "Best effort: a card renders several images and the employer logo is picked as the most frequently repeated one."
                  location:
                    type: string
                    nullable: true
                    description: The card's location line VERBATIM, workplace parenthetical included ("Yerevan, Armenia (Hybrid)"). null whenever the card shows no parenthetical, even when a city is plainly on screen.
                  workplace_type:
                    type: string
                    nullable: true
                    enum:
                      - On-site
                      - Remote
                      - Hybrid
                    description: Read out of the same parenthetical as location, so the two are null together and consistent together.
                  listed_date_text:
                    type: string
                    nullable: true
                    description: Posting age the way LinkedIn writes it ("Posted 3 hours ago", "Posted 1 month ago"). Free text, not a timestamp.
                  salary_text:
                    type: string
                    nullable: true
                    description: 'Compensation as printed on the card ("$18K/yr - $25K/yr"): currency, range and period all live inside the one string, nothing is broken out. Best effort.'
                  easy_apply:
                    type: boolean
                    description: The posting takes LinkedIn's one-click Easy Apply.
                  is_early_applicant:
                    type: boolean
                    description: The card carries LinkedIn's "Be an early applicant" hint.
                  is_verified:
                    type: boolean
                    description: LinkedIn marks this as a verified job.
                  social_proof_text:
                    type: string
                    nullable: true
                    description: The card's connection or alumni line ("1 connection works here", "93 school alumni work here"). Both kinds land here undifferentiated. Best effort.
                  position:
                    type: integer
                    nullable: true
                    description: The card's slot on THIS page, 0 based and page local. It is not a rank across pages, so do not use it as a cross-page ordinal. The parser always fills it, so null here means the key was missing from the wire row, not that the card had no slot.
                required:
                  - job_ln_id
                  - job_url
                  - title
                  - company_name
                  - company_logo_url
                  - location
                  - workplace_type
                  - listed_date_text
                  - salary_text
                  - easy_apply
                  - is_early_applicant
                  - is_verified
                  - social_proof_text
                  - position
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more. total carries LinkedIn's own result count when the page printed one, best effort and null otherwise, so drive the loop from has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchPeopleRequest:
      type: object
      description: Request body of `scrape_linkedin_search_people`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/search\/results\/people\/
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/search/results/people/ : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              nullable: true
              maxLength: 256
              description: Free-text query.
            first_name:
              type: string
              nullable: true
              maxLength: 100
            last_name:
              type: string
              nullable: true
              maxLength: 100
            title:
              type: string
              nullable: true
              maxLength: 256
              description: Current-title keywords.
            company:
              type: string
              nullable: true
              maxLength: 256
              description: Current-company keywords (free text; prefer current_companies).
            school:
              type: string
              nullable: true
              maxLength: 256
              description: 'School free-text: this engine has no school-id facet, so lookup(type: "school") ids fit nowhere here.'
            network:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - 1st
                  - 2nd
                  - 3rd_plus
              maxItems: 3
              description: Relationship-degree facet; the node maps each degree onto the LinkedIn wire code (F/S/O) itself.
            locations:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: 'Numeric geo ids, via lookup(type: "location").'
            industries:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: 'Numeric industry ids, via lookup(type: "industry").'
            current_companies:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: 'Numeric company ids, via lookup(type: "company").'
            past_companies:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: 'Numeric company ids. The typeahead has no past-company axis; lookup(type: "company") answers in what looks like the same org-id space, which is our reading of the wire rather than a verified mapping.'
            service_categories:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: 'Numeric service-category ids, via lookup(type: "service_category").'
            connections_of:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: 'Profile ids (ACoA…): people in these profiles’ connections. Via lookup(type: "connections").'
            followers_of:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: 'Profile ids (ACoA…): people following these profiles. Via lookup(type: "people").'
            profile_languages:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: ISO 639-1 language codes.
            open_to_volunteer:
              type: boolean
              nullable: true
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). Regular people-search filters. At least one member must be non-empty. Members are LinkedIn-ready wire values (passed through untranslated), except network, whose degrees the node maps onto LinkedIn codes. lookup = scrape_linkedin_param_id_lookup, and each id-bearing member names the type it takes."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more.
    ScrapeLinkedinSearchPeopleResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                    description: Canonical member id (decoded in-process).
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                    description: The card's headline line on the regular and Recruiter engines; null on Sales Navigator people search.
                  position:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured position (read the headline).
                  company_name:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured company (read the headline).
                  location:
                    type: string
                    nullable: true
                    description: The card's location line on the regular and Recruiter engines; null on Sales Navigator people search.
                  avatar_url:
                    type: string
                    nullable: true
                    description: Best effort on the regular engines (a DOM lookup, null when the card image had not rendered).
                  connection_degree:
                    type: string
                    nullable: true
                    description: "The degree badge as the card prints it: 1st, 2nd, 3rd or 3rd+ on the regular engines; Recruiter spells 1st, 2nd, 3rd, out_of_network."
                required:
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - full_name
                  - headline
                  - position
                  - company_name
                  - location
                  - avatar_url
                  - connection_degree
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
            commercial_use_limit_hit:
              type: boolean
              description: LinkedIn’s people-search commercial-use-limit upsell fired (wire wasStrike), so rows may be truncated; switch to the SN engine or wait for the monthly reset.
          required:
            - rows
            - paging
            - data_request
            - commercial_use_limit_hit
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchPostsRequest:
      type: object
      description: Request body of `scrape_linkedin_search_posts`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/search\/results\/content\/
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/search/results/content/ : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              maxLength: 256
              description: "REQUIRED: content search needs a query."
            date_posted:
              type: string
              nullable: true
              enum:
                - past_24h
                - past_week
                - past_month
            sort_by:
              type: string
              nullable: true
              enum:
                - relevance
                - date_posted
              description: Default relevance.
            content_type:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - videos
                  - photos
                  - jobs
                  - liveVideos
                  - documents
              maxItems: 5
              description: Post media/format facet; wire-ready content-type tokens.
            posted_by:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - following
                  - me
                  - first
              maxItems: 3
              description: "Author-relationship facet: following / me / first (1st-degree)."
            author_job_title:
              type: string
              nullable: true
              maxLength: 256
              description: Author current-title keywords.
            from_member:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: Posts authored by these members (facet ids/urns). This is the real author-by-member facet.
            from_organization:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: Posts authored by these organizations (facet ids/urns).
            author_company:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: Author-company facet ids.
            author_industry:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: Author-industry facet ids.
            mentions_member:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: Posts mentioning these members (facet ids/urns).
            mentions_organization:
              type: array
              nullable: true
              items:
                type: string
              maxItems: 10
              description: Posts mentioning these organizations (facet ids/urns).
          required:
            - keywords
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). Content-search filters; keywords required."
        page_size:
          type: integer
          nullable: true
          minimum: 1
          maximum: 50
          description: "Rows per page (1..50); default 10. The cap is LinkedIn's: its content search serves at most 50 posts per page and answers a larger request with an empty page, so 51+ is refused (422 page_size_above_linkedin_max) rather than returned as 3 rows with has_more false. Ask for 50 or fewer and follow paging.next_cursor. The first page may carry up to 3 rows when you ask for fewer: every content search opens with a cluster of 3."
        cursor:
          type: string
          nullable: true
          maxLength: 2048
          description: Opaque resume token from paging.next_cursor; null/omitted = first page.
    ScrapeLinkedinSearchPostsResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  post_ln_id:
                    type: string
                    nullable: true
                  author_nickname:
                    type: string
                    nullable: true
                    description: "The /in/ slug. Null for an ORGANIZATION author: the parser detects the company case and skips member parsing."
                  author_full_name:
                    type: string
                    nullable: true
                  author_headline:
                    type: string
                    nullable: true
                  author_profile_url:
                    type: string
                    nullable: true
                    description: Clean /in/ URL, no query string. Null for an organization author, exactly like author_nickname - a filled name with a null profile_url is today the only signal that a post was published by a company page.
                  author_picture_url:
                    type: string
                    nullable: true
                    description: Author avatar, filled for members and organizations alike.
                  content:
                    type: string
                    nullable: true
                  posted_at:
                    type: string
                    nullable: true
                  reactions_count:
                    type: integer
                    nullable: true
                  comments_count:
                    type: integer
                    nullable: true
                  reshares_count:
                    type: integer
                    nullable: true
                required:
                  - post_ln_id
                  - author_nickname
                  - author_full_name
                  - author_headline
                  - author_profile_url
                  - author_picture_url
                  - content
                  - posted_at
                  - reactions_count
                  - comments_count
                  - reshares_count
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page_size:
                  type: integer
                next_cursor:
                  type: string
                  nullable: true
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page_size
                - next_cursor
                - has_more
                - total
              description: "Cursor paging: feed next_cursor back verbatim; null = terminal page."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchProductsRequest:
      type: object
      description: Request body of `scrape_linkedin_search_products`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/search\/results\/products\/
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/search/results/products/ : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              maxLength: 256
              description: "REQUIRED: this engine has no wire form without a query, so a filter object carrying only a category or only the free-version toggle is refused rather than run wide."
            free_version:
              type: boolean
              nullable: true
              description: ONE-WAY toggle. true narrows to products offering a free version; false is identical to omitting it, because the node writes the facet only when the value is truthy. There is no way to ask for products WITHOUT a free version on this wire.
            product_category:
              type: array
              nullable: true
              items:
                type: string
                pattern: ^\d+$
              minItems: 1
              maxItems: 10
              description: LinkedIn product-category ids, digit strings. Resolve them with param-id-lookup type=product_category, which is this filter's only source; this search is that lookup type's first consumer. Not interchangeable with product_company.
            product_company:
              type: array
              nullable: true
              items:
                type: string
                pattern: ^\d+$
              minItems: 1
              maxItems: 10
              description: 'Vendor organization ids, digit strings. NOT a param-id-lookup type of its own: resolve them with type=company, whose ids this filter accepts (verified live: type=company "Salesforce" gives 3185, and that id narrows a crm search from 1600 results to 3, all published by Salesforce). A category id used here matches nothing and returns an ordinary empty page.'
          required:
            - keywords
          additionalProperties: false
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). LinkedIn product-search filters. keywords is REQUIRED; free_version is a one-way toggle; product_category and product_company are arrays of digit-string ids from two DIFFERENT id spaces, and nothing validates one against the other, so a category id in the company slot returns an ordinary empty page. Any other key is REFUSED rather than ignored."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: "LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
    ScrapeLinkedinSearchProductsResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  product_slug:
                    type: string
                    description: "The /products/{slug} path segment, and the ONLY identity a product row carries: this wire has no numeric id anywhere. ⚠️ The node calls this field product_id; it is NOT an id and must never be sent as one into product_category or product_company. A card whose slug cannot be read is dropped, and a repeat of a slug already seen on this page is dropped too."
                  product_url:
                    type: string
                    description: "https://www.linkedin.com/products/{product_slug}/ , composed from the slug, so it is stable and free of tracking parameters. Pasting it back into this tool's url field is refused: it is one product's page, not a search."
                  name:
                    type: string
                    description: Product name, read off the card's single bold text run rather than out of English copy, so it survives a non-English interface. A card without one is dropped, so this is never null.
                  category_text:
                    type: string
                    nullable: true
                    description: 'The category line as printed ("CRM Software"). ⚠️ Derived by elimination: it is the first small text run that is NOT the "By:" line, so on a non-English interface, where the By: test stops matching, this field can carry the COMPANY name instead. Unreliable rather than absent off English.'
                  company:
                    type: string
                    nullable: true
                    description: "The vendor, from the card's \"By: <name>\" line with the prefix stripped. A bare NAME: no organization id and no link, so it cannot be fed into product_company without a separate lookup. Null on a non-English interface."
                  tagline:
                    type: string
                    nullable: true
                    description: The product's one-line pitch. ⚠️ Picked as the longest remaining small-print run after the Top-Features and connections lines are excluded by their English prefixes. On a non-English interface both exclusions stop working, so this most often holds the TOP-FEATURES list (usually the longest run) and sometimes the connections line.
                  top_features:
                    type: string
                    nullable: true
                    description: The "Top Features:" line with the prefix stripped, a single comma-joined string rather than a list. Null when the card does not print one, and null on a non-English interface.
                  connections_count:
                    type: integer
                    nullable: true
                    description: 'How many of your connections can be asked about this product, parsed from the text below, so "1.2K" becomes 1200. ROUNDED, because the string it came from was: LinkedIn never printed an exact number.'
                  connections_text:
                    type: string
                    nullable: true
                    description: That same counter exactly as printed ("1.2K connections to ask about this product"). Kept alongside the number because the number is a rounding of it.
                  logo_url:
                    type: string
                    nullable: true
                    description: "Product artwork, widest rendition available. Best effort: a card renders several images and the most repeated asset is taken as the logo."
                  position:
                    type: integer
                    nullable: true
                    description: The card's slot on THIS page, 0 based and page local, so it is not a rank across pages. Numbering happens before dropped and duplicate cards are removed, which can leave gaps.
                required:
                  - product_slug
                  - product_url
                  - name
                  - category_text
                  - company
                  - tagline
                  - top_features
                  - connections_count
                  - connections_text
                  - logo_url
                  - position
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more. total carries LinkedIn's own result count when the page printed one, best effort and null otherwise, so drive the loop from has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchRecruiterPeopleRequest:
      type: object
      description: Request body of `scrape_linkedin_search_recruiter_people`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/talent\/search
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/talent/search : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing. The URL LinkedIn Recruiter shows after a search (/talent/search?...searchHistoryId=N...): it names the search by its searchHistoryId only, so a URL without one is refused (422) rather than run as a keywords-only search. Use the search_url a previous answer returned to page on."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              nullable: true
              maxLength: 256
            first_name:
              type: string
              nullable: true
              maxLength: 100
            last_name:
              type: string
              nullable: true
              maxLength: 100
            job_titles:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                  scope:
                    type: string
                    nullable: true
                    enum:
                      - CURRENT
                      - PAST
                      - CURRENT_OR_PAST
                      - PAST_NOT_CURRENT
                    description: Where in the career the chip must sit; omitted = CURRENT_OR_PAST.
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: "Job titles. Ids via lookup(type: \"occupation\") (urn:li:ts_title:N) or free text: [{text: \"Head of Growth\"}]. scope: 'CURRENT' | 'PAST' | 'CURRENT_OR_PAST' (default) | 'PAST_NOT_CURRENT'."
            occupations:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                  scope:
                    type: string
                    nullable: true
                    enum:
                      - CURRENT
                      - PAST
                      - CURRENT_OR_PAST
                      - PAST_NOT_CURRENT
                    description: Where in the career the chip must sit; omitted = CURRENT_OR_PAST.
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: "Standardized titles (LinkedIn's title taxonomy), id REQUIRED via lookup(type: \"occupation\"). scope: 'CURRENT' | 'PAST' | 'CURRENT_OR_PAST' (default) | 'PAST_NOT_CURRENT'."
            skills:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: 'Skills. Ids via lookup(type: "skill") (urn:li:ts_skill:N) or free text.'
            companies:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                  scope:
                    type: string
                    nullable: true
                    enum:
                      - CURRENT
                      - PAST
                      - CURRENT_OR_PAST
                      - PAST_NOT_CURRENT
                    description: Where in the career the chip must sit; omitted = CURRENT_OR_PAST.
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: "Employers, current or past. Ids via lookup(type: \"company\") (urn:li:ts_company:N) or free text; exclude: true is the classic \"not my own company\". scope: 'CURRENT' | 'PAST' | 'CURRENT_OR_PAST' (default) | 'PAST_NOT_CURRENT'."
            current_companies:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: 'The employer right now (the CURRENT_COMPANY facet). Ids via lookup(type: "company").'
            locations:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                  scope:
                    type: string
                    nullable: true
                    enum:
                      - CURRENT
                      - PREFERRED_NOT_CURRENT
                      - CURRENT_OR_PREFERRED
                    description: "'CURRENT' lives there, 'PREFERRED_NOT_CURRENT' would move there, 'CURRENT_OR_PREFERRED' either."
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: "Geography. Ids via lookup(type: \"geo\") (urn:li:ts_geo:N). scope: 'CURRENT' (lives there) | 'PREFERRED_NOT_CURRENT' (would move there) | 'CURRENT_OR_PREFERRED'."
            postal_codes:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: 'Postal codes. id via lookup(type: "zip") (urn:li:ts_geo:N) REQUIRED, plus its text; a text-only postal code is refused. Pair with postal_code_distance.'
            postal_code_distance:
              type: integer
              nullable: true
              minimum: 1
              maximum: 500
              description: Radius around every postal code, miles. Default 50.
            industries:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: 'Industries. Ids via lookup(type: "industry") (urn:li:ts_industry:N).'
            schools:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: "Schools attended. Ids via lookup(type: \"school\"): the row id is the school's urn:li:ts_organization:N, which is what this facet matches on (a ts_school id answers zero)."
            fields_of_study:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: 'Fields of study. Ids via lookup(type: "fieldOfStudy") (urn:li:ts_field_of_study:N).'
            degrees:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: 'Degrees. Ids via lookup(type: "degree") (urn:li:ts_degree:N).'
            spoken_languages:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: The typeahead row id VERBATIM (urn:li:ts_*:N; the lowercase language name for spoken_languages). A bare numeric id is accepted for the urn kinds.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: "The chip label (the typeahead row's display_name). REQUIRED on job_titles / occupations / skills / companies / postal_codes, id or no id: LinkedIn refuses an entity chip without its label. On job_titles / skills / companies a text-only chip is a free-text search term."
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → the chip is a negative filter.
                  required:
                    type: boolean
                    nullable: true
                    description: true → a must-have chip (the Recruiter UI "required" toggle); omitted → nice-to-have.
                  scope:
                    type: string
                    nullable: true
                    enum:
                      - ELEMENTARY
                      - LIMITED_WORKING
                      - PROFESSIONAL_WORKING
                      - FULL_PROFESSIONAL
                      - NATIVE_OR_BILINGUAL
                    description: Minimum proficiency of the spoken language.
                description: "One Recruiter facet chip: at least one of id / text."
              maxItems: 20
              description: "Languages the member speaks. Ids via lookup(type: \"language\") - the lowercase language name, e.g. \"danish\". scope = minimum proficiency: 'ELEMENTARY' | 'LIMITED_WORKING' | 'PROFESSIONAL_WORKING' | 'FULL_PROFESSIONAL' | 'NATIVE_OR_BILINGUAL'."
            network:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - F
                  - S
                  - A
                  - O
              maxItems: 4
              description: "Relationship: 'F' 1st, 'S' 2nd, 'A' group members, 'O' 3rd+ and everyone else."
            seniority_levels:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
                  - "6"
                  - "7"
                  - "8"
                  - "9"
                  - "10"
              maxItems: 10
              description: "Seniority: '1' Unpaid, '2' Training, '3' Entry, '4' Senior, '5' Manager, '6' Director, '7' VP, '8' CXO, '9' Partner, '10' Owner. NOT the Sales Navigator codes."
            functions:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
                  - "6"
                  - "7"
                  - "8"
                  - "9"
                  - "10"
                  - "11"
                  - "12"
                  - "13"
                  - "14"
                  - "15"
                  - "16"
                  - "17"
                  - "18"
                  - "19"
                  - "20"
                  - "21"
                  - "22"
                  - "23"
                  - "24"
                  - "25"
                  - "26"
              maxItems: 26
              description: "Job function: '1' Accounting, '2' Administrative, '3' Arts and Design, '4' Business Development, '5' Community and Social Services, '6' Consulting, '7' Education, '8' Engineering, '9' Entrepreneurship, '10' Finance, '11' Healthcare Services, '12' Human Resources, '13' Information Technology, '14' Legal, '15' Marketing, '16' Media and Communication, '17' Military and Protective Services, '18' Operations, '19' Product Management, '20' Program and Project Management, '21' Purchasing, '22' Quality Assurance, '23' Real Estate, '24' Research, '25' Sales, '26' Customer Success and Support."
            company_sizes:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - A
                  - B
                  - C
                  - D
                  - E
                  - F
                  - G
                  - H
                  - I
              maxItems: 9
              description: "Company size: 'A' Self-employed, 'B' 1-10, 'C' 11-50, 'D' 51-200, 'E' 201-500, 'F' 501-1000, 'G' 1001-5000, 'H' 5001-10000, 'I' 10001+."
            company_types:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - P
                  - C
                  - D
                  - N
                  - G
                  - S
                  - O
                  - E
                  - A
              maxItems: 9
              description: "Company type: 'P' Privately Held, 'C' Public Company, 'D' Educational Institution, 'N' Non Profit, 'G' Government Agency, 'S' Partnership, 'O' Self Owned, 'E' Self Employed, 'A' College Page."
            profile_languages:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - en
                  - es
                  - fr
                  - pt
                  - zh
                  - de
                  - it
                  - in
                  - tr
                  - pl
                  - nl
                  - ru
                  - ar
                  - cs
                  - sv
                  - ro
                  - ko
                  - da
                  - no
                  - uk
                  - ms
                  - ja
                  - _o
              maxItems: 23
              description: Profile language, ISO 639-1 ('_o' = others).
            recently_joined:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
              maxItems: 5
              description: "Joined LinkedIn: '1' 1 day ago, '2' 2-7 days, '3' 8-14 days, '4' 15-30 days, '5' 1-3 months ago."
            workplace_preferences:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - O
                  - R
                  - H
              maxItems: 3
              description: "Workplace: 'O' on-site, 'R' remote, 'H' hybrid."
            employment_types:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - F
                  - P
                  - C
                  - I
              maxItems: 4
              description: "Employment type: 'F' full-time, 'P' part-time, 'C' contract, 'I' internship (the only codes LinkedIn Recruiter accepts here)."
            us_military_background:
              type: boolean
              nullable: true
              description: true → members with a US military background (IS_VETERAN); false dispatches nothing.
            years_in_current_position:
              type: object
              nullable: true
              properties:
                min:
                  type: integer
                  minimum: 1
                  maximum: 30
                max:
                  type: integer
                  minimum: 1
                  maximum: 30
              required:
                - min
                - max
              description: Years in the current position, {min, max} in 1..30 (30 = 30+).
            years_in_current_company:
              type: object
              nullable: true
              properties:
                min:
                  type: integer
                  minimum: 1
                  maximum: 30
                max:
                  type: integer
                  minimum: 1
                  maximum: 30
              required:
                - min
                - max
              description: Years at the current company, {min, max} in 1..30.
            years_of_experience:
              type: object
              nullable: true
              properties:
                min:
                  type: integer
                  minimum: 1
                  maximum: 30
                max:
                  type: integer
                  minimum: 1
                  maximum: 30
              required:
                - min
                - max
              description: Total years of experience, {min, max} in 1..30.
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). LinkedIn Recruiter people-search filters, the COMPLETE Recruiter facet vocabulary. At least one member must be non-empty. lookup = scrape_linkedin_recruiter_param_id_lookup; chip facets take [{id, text, exclude, required, scope}], closed enums take flat code arrays (their full sets are inline), the three year sliders take {min, max}."
        page:
          type: integer
          minimum: 1
          maximum: 40
          description: LinkedIn Recruiter page number, default 1; 25 hits a page, 40 pages at most (1000 hits per search). Re-call with page + 1 while paging.has_more. On the url half OUR number wins over the start= in the URL.
    ScrapeLinkedinSearchRecruiterPeopleResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                    description: Canonical member id (decoded in-process).
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                    description: The card's headline line on the regular and Recruiter engines; null on Sales Navigator people search.
                  position:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured position (read the headline).
                  company_name:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured company (read the headline).
                  location:
                    type: string
                    nullable: true
                    description: The card's location line on the regular and Recruiter engines; null on Sales Navigator people search.
                  avatar_url:
                    type: string
                    nullable: true
                    description: Best effort on the regular engines (a DOM lookup, null when the card image had not rendered).
                  connection_degree:
                    type: string
                    nullable: true
                    description: "The degree badge as the card prints it: 1st, 2nd, 3rd or 3rd+ on the regular engines; Recruiter spells 1st, 2nd, 3rd, out_of_network."
                  recruiter_id:
                    type: string
                    description: "The Recruiter (talent) profile id, AEMAA…: what send_linkedin_recruiter_message addresses as recipient_profile_id. Same member as ln_member_id."
                  industry:
                    type: string
                    nullable: true
                  can_send_inmail:
                    type: boolean
                    nullable: true
                    description: LinkedIn says this seat may InMail the member right now.
                  open_to_work:
                    type: boolean
                    nullable: true
                    description: The member signalled openness to new opportunities.
                  connections_count:
                    type: integer
                    nullable: true
                  anonymized:
                    type: boolean
                    description: LinkedIn hid the name (out-of-network privacy); the names are what it showed.
                required:
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - full_name
                  - headline
                  - position
                  - company_name
                  - location
                  - avatar_url
                  - connection_degree
                  - recruiter_id
                  - industry
                  - can_send_inmail
                  - open_to_work
                  - connections_count
                  - anonymized
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: Page-numbered paging with LinkedIn Recruiter's own total; has_more is false at the 40-page ceiling even when total says more.
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
            search_history_id:
              type: string
              nullable: true
              description: The searchHistoryId LinkedIn Recruiter gave this search (the seat's "Recent searches" entry); null only when the wire returned none.
            search_url:
              type: string
              nullable: true
              description: "https://www.linkedin.com/talent/search?searchHistoryId=N&start=0: pass it as `url` (with page) to page on, or to re-run this exact search later, without re-sending the filters."
          required:
            - rows
            - paging
            - data_request
            - search_history_id
            - search_url
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchSalesNavCompaniesRequest:
      type: object
      description: Request body of `scrape_linkedin_search_sales_nav_companies`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/sales\/search\/company
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/sales/search/company : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              nullable: true
              maxLength: 256
            company_headquarters:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    maxLength: 128
                    description: "Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup. REQUIRED: LinkedIn ignores a value without its id on this facet."
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: The id's label, optional.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                required:
                  - id
                description: One facet value, by id.
              maxItems: 10
              description: 'HQ region, by id via lookup(type: "BING_GEO"); exclude supported (e.g. exclude APAC).'
            industries:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    maxLength: 128
                    description: "Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup. REQUIRED: LinkedIn ignores a value without its id on this facet."
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: The id's label, optional.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                required:
                  - id
                description: One facet value, by id.
              maxItems: 10
              description: 'Industries, by id via lookup(type: "INDUSTRY").'
            account_lists:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    maxLength: 128
                    description: "Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup. REQUIRED: LinkedIn ignores a value without its id on this facet."
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: The id's label, optional.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                required:
                  - id
                description: One facet value, by id.
              maxItems: 10
              description: 'Your SN account lists, by id via lookup(type: "ACCOUNT_LIST") - numeric list ids or the "ALL" sentinel; exclude: true skips a list (e.g. current book of business).'
            company_headcounts:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - B
                  - C
                  - D
                  - E
                  - F
                  - G
                  - H
                  - I
              maxItems: 10
              description: "Company size: 'B' 1-10, 'C' 11-50, 'D' 51-200, 'E' 201-500, 'F' 501-1000, 'G' 1001-5000, 'H' 5001-10000, 'I' 10001+ (account search has no 'A')."
            num_of_followers:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - NFR1
                  - NFR2
                  - NFR3
                  - NFR4
                  - NFR5
              maxItems: 5
              description: "LinkedIn page followers: NFR1 1-50, NFR2 51-100, NFR3 101-1000, NFR4 1001-5000, NFR5 5001+."
            fortune:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
              maxItems: 4
              description: "Fortune 500 tier: '1' Fortune 50, '2' 51-100, '3' 101-250, '4' 251-500."
            account_activities:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - SLC
                  - RFE
              maxItems: 2
              description: "Buying signals: 'SLC' senior-leadership changes in the last 3 months, 'RFE' funding event in the past 12 months."
            annual_revenue:
              type: object
              nullable: true
              properties:
                min:
                  type: integer
                  minimum: 0
                  maximum: 100000000
                max:
                  type: integer
                  minimum: 0
                  maximum: 100000000
                currency:
                  type: string
                  nullable: true
                  pattern: ^[A-Z]{3}$
                  description: ISO-4217 code; default USD.
              required:
                - min
                - max
              description: "Annual revenue range in MILLIONS (e.g. {min: 10, max: 100} = $10M-$100M)."
            company_headcount_growth:
              type: object
              nullable: true
              properties:
                min:
                  type: integer
                  minimum: -100
                  maximum: 1000
                max:
                  type: integer
                  minimum: -100
                  maximum: 1000
              required:
                - min
                - max
              description: Company-wide headcount growth range, percent (negative = shrinking).
            department_headcount:
              type: object
              nullable: true
              properties:
                department:
                  type: string
                  enum:
                    - "1"
                    - "2"
                    - "3"
                    - "4"
                    - "5"
                    - "6"
                    - "7"
                    - "8"
                    - "9"
                    - "10"
                    - "11"
                    - "12"
                    - "13"
                    - "14"
                    - "15"
                    - "16"
                    - "17"
                    - "18"
                    - "19"
                    - "20"
                    - "21"
                    - "22"
                    - "23"
                    - "24"
                    - "25"
                    - "26"
                  description: 'Numeric SN department id - the same taxonomy as the people-search functions facet (see its legend, or lookup(type: "FUNCTION")).'
                min:
                  type: integer
                  minimum: 0
                  maximum: 1000000
                max:
                  type: integer
                  minimum: 0
                  maximum: 1000000
              required:
                - department
                - min
                - max
              description: 'Headcount of ONE department (e.g. department "25" Sales, {min: 20, max: 99999}).'
            department_headcount_growth:
              type: object
              nullable: true
              properties:
                department:
                  type: string
                  enum:
                    - "1"
                    - "2"
                    - "3"
                    - "4"
                    - "5"
                    - "6"
                    - "7"
                    - "8"
                    - "9"
                    - "10"
                    - "11"
                    - "12"
                    - "13"
                    - "14"
                    - "15"
                    - "16"
                    - "17"
                    - "18"
                    - "19"
                    - "20"
                    - "21"
                    - "22"
                    - "23"
                    - "24"
                    - "25"
                    - "26"
                  description: 'Numeric SN department id - the same taxonomy as the people-search functions facet (see its legend, or lookup(type: "FUNCTION")).'
                min:
                  type: integer
                  minimum: -100
                  maximum: 1000
                max:
                  type: integer
                  minimum: -100
                  maximum: 1000
              required:
                - department
                - min
                - max
              description: Growth of ONE department, percent - e.g. engineering team growing 10%+.
            hiring_on_linkedin:
              type: boolean
              nullable: true
              description: true → only accounts currently hiring on LinkedIn.
            first_degree_connection:
              type: boolean
              nullable: true
              description: true → only accounts where you have a 1st-degree connection.
            saved_accounts_only:
              type: boolean
              nullable: true
              description: true → only your saved SN accounts.
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). Sales Navigator account-search filters, the COMPLETE SN vocabulary. At least one member must be non-empty (a false toggle counts as empty). lookup = scrape_linkedin_sales_nav_param_id_lookup."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more.
    ScrapeLinkedinSearchSalesNavCompaniesResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  company_ln_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                    description: "Vanity slug; regular and similar-companies engines only (Sales Navigator: null, resolve via get-company-public-identifier)."
                  name:
                    type: string
                    nullable: true
                  industry:
                    type: string
                    nullable: true
                  employees_size:
                    type: string
                    nullable: true
                    description: Sales Navigator size bucket ("11-50"); null on the regular engine.
                  followers:
                    type: integer
                    nullable: true
                    description: Regular and similar-companies engines; the regular card's rounded "4K followers" reads 4000.
                  location:
                    type: string
                    nullable: true
                    description: "Regular engine: the card's location line; many cards print none."
                  tagline:
                    type: string
                    nullable: true
                    description: Sales Navigator only.
                  logo_url:
                    type: string
                    nullable: true
                  website:
                    type: string
                    nullable: true
                    description: On no search wire; always null.
                required:
                  - company_ln_id
                  - nickname
                  - name
                  - industry
                  - employees_size
                  - followers
                  - location
                  - tagline
                  - logo_url
                  - website
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchSalesNavPeopleRequest:
      type: object
      description: Request body of `scrape_linkedin_search_sales_nav_people`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/sales\/search\/people
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/sales/search/people : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              nullable: true
              maxLength: 256
            first_name:
              type: string
              nullable: true
              maxLength: 100
              description: Text-only wire facet (no id space).
            last_name:
              type: string
              nullable: true
              maxLength: 100
              description: Text-only wire facet (no id space).
            current_titles:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Free text when no id is given (SN matches it on titles and companies), else the id's label.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One facet value: at least one of id / text."
              maxItems: 10
              description: 'Current job titles. Ids via lookup(type: "TITLE") (numeric, e.g. "5" Director) - or just free text: [{text: "VP Marketing"}].'
            past_titles:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Free text when no id is given (SN matches it on titles and companies), else the id's label.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One facet value: at least one of id / text."
              maxItems: 10
              description: 'Past job titles. Ids via lookup(type: "TITLE") or free text.'
            locations:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    maxLength: 128
                    description: "Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup. REQUIRED: LinkedIn ignores a value without its id on this facet."
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: The id's label, optional.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                required:
                  - id
                description: One facet value, by id.
              maxItems: 10
              description: 'Person geography, by id via lookup(type: "BING_GEO") (e.g. "103644278" United States); regions like DACH/EMEA exist too.'
            company_headquarters:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    maxLength: 128
                    description: "Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup. REQUIRED: LinkedIn ignores a value without its id on this facet."
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: The id's label, optional.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                required:
                  - id
                description: One facet value, by id.
              maxItems: 10
              description: 'CURRENT COMPANY HQ region (not the person’s own location), by id via lookup(type: "BING_GEO").'
            industries:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    maxLength: 128
                    description: "Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup. REQUIRED: LinkedIn ignores a value without its id on this facet."
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: The id's label, optional.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                required:
                  - id
                description: One facet value, by id.
              maxItems: 10
              description: 'Industries, by id via lookup(type: "INDUSTRY") (numeric).'
            current_companies:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Free text when no id is given (SN matches it on titles and companies), else the id's label.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One facet value: at least one of id / text."
              maxItems: 10
              description: 'Current employer. Ids via lookup(type: "COMPANY_WITH_LIST") - id shape urn:li:organization:N - or free text. exclude: true is the classic "not my customers" move.'
            past_companies:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    nullable: true
                    maxLength: 128
                    description: Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup.
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: Free text when no id is given (SN matches it on titles and companies), else the id's label.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                description: "One facet value: at least one of id / text."
              maxItems: 10
              description: 'Past employer. Ids via lookup(type: "COMPANY_WITH_LIST") or free text.'
            groups:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    maxLength: 128
                    description: "Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup. REQUIRED: LinkedIn ignores a value without its id on this facet."
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: The id's label, optional.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                required:
                  - id
                description: One facet value, by id.
              maxItems: 10
              description: 'LinkedIn group membership, by id via lookup(type: "GROUP").'
            schools:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  id:
                    type: string
                    maxLength: 128
                    description: "Opaque SN facet id, VERBATIM from scrape_linkedin_sales_nav_param_id_lookup. REQUIRED: LinkedIn ignores a value without its id on this facet."
                  text:
                    type: string
                    nullable: true
                    maxLength: 256
                    description: The id's label, optional.
                  exclude:
                    type: boolean
                    nullable: true
                    description: true → EXCLUDED (negative filter); omitted/false → INCLUDED.
                required:
                  - id
                description: One facet value, by id.
              maxItems: 10
              description: 'Schools attended, by id via lookup(type: "SCHOOL").'
            seniority_levels:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "100"
                  - "110"
                  - "120"
                  - "130"
                  - "200"
                  - "210"
                  - "220"
                  - "300"
                  - "310"
                  - "320"
              maxItems: 10
              description: "SENIORITY_V2: '100' In Training, '110' Entry Level, '120' Senior, '130' Strategic, '200' Entry Level Manager, '210' Experienced Manager, '220' Director, '300' Vice President, '310' CXO, '320' Owner/Partner."
            functions:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
                  - "6"
                  - "7"
                  - "8"
                  - "9"
                  - "10"
                  - "11"
                  - "12"
                  - "13"
                  - "14"
                  - "15"
                  - "16"
                  - "17"
                  - "18"
                  - "19"
                  - "20"
                  - "21"
                  - "22"
                  - "23"
                  - "24"
                  - "25"
                  - "26"
              maxItems: 10
              description: "Job function: '1' Accounting, '2' Administrative, '3' Arts and Design, '4' Business Development, '5' Community and Social Services, '6' Consulting, '7' Education, '8' Engineering, '9' Entrepreneurship, '10' Finance, '11' Healthcare Services, '12' Human Resources, '13' Information Technology, '14' Legal, '15' Marketing, '16' Media and Communication, '17' Military and Protective Services, '18' Operations, '19' Product Management, '20' Program and Project Management, '21' Purchasing, '22' Quality Assurance, '23' Real Estate, '24' Research, '25' Sales, '26' Customer Success and Support."
            years_in_current_company:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
              maxItems: 5
              description: "Tenure at current company: '1' <1 year, '2' 1-2, '3' 3-5, '4' 6-10, '5' 10+ years."
            years_in_current_position:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
              maxItems: 5
              description: "Tenure in current position: '1' <1 year, '2' 1-2, '3' 3-5, '4' 6-10, '5' 10+ years."
            years_of_experience:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - "1"
                  - "2"
                  - "3"
                  - "4"
                  - "5"
              maxItems: 5
              description: "Total career length: '1' <1 year, '2' 1-2, '3' 3-5, '4' 6-10, '5' 10+ years."
            company_headcounts:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - A
                  - B
                  - C
                  - D
                  - E
                  - F
                  - G
                  - H
                  - I
              maxItems: 10
              description: "Company size: 'A' Self-employed, 'B' 1-10, 'C' 11-50, 'D' 51-200, 'E' 201-500, 'F' 501-1000, 'G' 1001-5000, 'H' 5001-10000, 'I' 10001+."
            company_types:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - C
                  - P
                  - N
                  - D
                  - S
                  - E
                  - O
                  - G
              maxItems: 10
              description: "Company type: 'C' Public, 'P' Privately Held, 'N' Non-profit, 'D' Educational, 'S' Partnership, 'E' Self-Employed, 'O' Self-Owned, 'G' Government."
            profile_languages:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - ar
                  - en
                  - es
                  - pt
                  - zh
                  - fr
                  - it
                  - ru
                  - de
                  - nl
                  - tr
                  - tl
                  - pl
                  - ko
                  - ja
                  - ms
                  - no
                  - da
                  - ro
                  - sv
                  - in
                  - cs
              maxItems: 10
              description: Profile language, ISO 639-1.
            network:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - F
                  - S
                  - A
                  - O
              maxItems: 4
              description: "Relationship degree: 'F' 1st, 'S' 2nd, 'A' group members, 'O' 3rd+."
            connections_of:
              type: array
              nullable: true
              items:
                type: string
                maxLength: 64
              maxItems: 10
              description: 'People connected to these members. Tokens (ACwA…) via lookup(type: "CONNECTION_OF").'
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). Sales Navigator people-search filters, the COMPLETE SN facet vocabulary. At least one member must be non-empty. lookup = scrape_linkedin_sales_nav_param_id_lookup."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more.
    ScrapeLinkedinSearchSalesNavPeopleResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                    description: Canonical member id (decoded in-process).
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                    description: The card's headline line on the regular and Recruiter engines; null on Sales Navigator people search.
                  position:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured position (read the headline).
                  company_name:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured company (read the headline).
                  location:
                    type: string
                    nullable: true
                    description: The card's location line on the regular and Recruiter engines; null on Sales Navigator people search.
                  avatar_url:
                    type: string
                    nullable: true
                    description: Best effort on the regular engines (a DOM lookup, null when the card image had not rendered).
                  connection_degree:
                    type: string
                    nullable: true
                    description: "The degree badge as the card prints it: 1st, 2nd, 3rd or 3rd+ on the regular engines; Recruiter spells 1st, 2nd, 3rd, out_of_network."
                required:
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - full_name
                  - headline
                  - position
                  - company_name
                  - location
                  - avatar_url
                  - connection_degree
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchSchoolsRequest:
      type: object
      description: Request body of `scrape_linkedin_search_schools`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/search\/results\/schools\/
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/search/results/schools/ : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              maxLength: 256
              description: "REQUIRED, and the WHOLE vocabulary: the schools search has no wire form without a query and no second axis to combine with it. Passed to LinkedIn verbatim."
          required:
            - keywords
          additionalProperties: false
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). LinkedIn school-search filters. keywords is the ONLY member the node reads, so any other key is REFUSED rather than ignored. In particular there is NO school-id member: the ids param_id_lookup returns for type=school fit no filter on this engine and reach LinkedIn only inside a pasted people-search URL. Every facet the schools screen offers beyond the keyword box is reachable only by building the search in the LinkedIn UI and pasting that URL into the url field."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: "LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more. On the url half OUR number wins: the offset or page parameter baked into the pasted URL is overwritten, while every other parameter rides through untouched."
    ScrapeLinkedinSearchSchoolsResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  school_slug:
                    type: string
                    description: The /school/{slug} path segment, and the ONLY identity a school row carries. ⚠️ The node calls this field school_id; it is a vanity slug, NOT the numeric id param_id_lookup returns for type=school, and the two are unrelated. ⚠️ It can be URL-ENCODED (an apostrophe arrives as %27) because the parser never decodes it; pass it through as-is or school_url stops matching.
                  school_url:
                    type: string
                    description: "https://www.linkedin.com/school/{school_slug}/ , composed from the slug, so it is stable and free of tracking parameters. Pasting it back into this tool's url field is refused: it is one school's page, not a search."
                  name:
                    type: string
                    description: School name, read off the card's single bold text run rather than out of English copy, so it survives a non-English interface. A card without one is dropped, so this is never null.
                  location_text:
                    type: string
                    nullable: true
                    description: The location line as printed ("Stanford, California"). Free text, never parsed into city / country. Positional rather than prefix-matched, so unlike the products category line it stays correct on a non-English interface; simply absent on schools that print none.
                  students_alumni_count:
                    type: integer
                    nullable: true
                    description: 'How many students and alumni LinkedIn reports, parsed from the text below, so "448K" becomes 448000. ROUNDED, because the string it came from was: LinkedIn never printed an exact number. Not an employee count and not comparable to a company headcount.'
                  students_alumni_text:
                    type: string
                    nullable: true
                    description: That same counter exactly as printed ("448K students and alumni on LinkedIn"). ⚠️ Read through the one English pattern on this card, so it goes null on a non-English interface, and see the description warning below.
                  description:
                    type: string
                    nullable: true
                    description: The school blurb. ⚠️ Picked as the longest small-print run once the students-and-alumni line is excluded by its English wording. On a non-English interface that exclusion stops working, so this field can silently hold the STUDENTS line instead of a description.
                  logo_url:
                    type: string
                    nullable: true
                    description: "School logo, widest rendition available. Best effort: a card renders several images and the most repeated asset is taken as the logo."
                  position:
                    type: integer
                    nullable: true
                    description: The card's slot on THIS page, 0 based and page local, so it is not a rank across pages. Numbering happens before dropped cards are removed, which can leave gaps.
                required:
                  - school_slug
                  - school_url
                  - name
                  - location_text
                  - students_alumni_count
                  - students_alumni_text
                  - description
                  - logo_url
                  - position
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more. total carries LinkedIn's own result count when the page printed one, best effort and null otherwise, so drive the loop from has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSearchServiceProvidersRequest:
      type: object
      description: Request body of `scrape_linkedin_search_service_providers`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        url:
          type: string
          nullable: true
          maxLength: 2048
          pattern: ^https:\/\/www\.linkedin\.com\/search\/results\/services\/
          description: "EXCLUSIVE with `filters`: send url OR filters, never both (422) and never neither (422). A search URL built in the LinkedIn UI, and the escape hatch for everything the filter vocabulary cannot express. MUST start with https://www.linkedin.com/search/results/services/ : a URL from another LinkedIn search screen is refused here and again by the backend (422 invalid_search_url), because running it would silently scrape the wrong thing."
        filters:
          type: object
          nullable: true
          properties:
            keywords:
              type: string
              nullable: true
              maxLength: 256
            service_categories:
              type: array
              nullable: true
              items:
                type: string
                pattern: ^\d+$
              maxItems: 10
              description: "LinkedIn's own numeric service-category ids, from scrape_linkedin_param_id_lookup(type: \"service_category\"). The same ids the people search takes in its own service_categories member."
            locations:
              type: array
              nullable: true
              items:
                type: string
                pattern: ^\d+$
              maxItems: 10
              description: 'Numeric LinkedIn geo ids, from scrape_linkedin_param_id_lookup(type: "location").'
            network:
              type: array
              nullable: true
              items:
                type: string
                enum:
                  - 1st
                  - 2nd
                  - 3rd_plus
              maxItems: 3
              description: Relationship-degree facet; the node maps each degree onto the LinkedIn wire code (F/S/O) itself.
            profile_languages:
              type: array
              nullable: true
              items:
                type: string
                pattern: ^[a-z]{2}$
              maxItems: 10
              description: ISO 639-1 language codes.
          description: "EXCLUSIVE with `url`: send filters OR url, never both (422) and never neither (422). Service-provider marketplace filters. At least one member must be non-empty. Anything these five cannot express is reachable by pasting the UI URL into this tool's own url field instead."
        page:
          type: integer
          minimum: 1
          maximum: 100
          description: LinkedIn page number, default 1; ONE page per call, so re-call with page + 1 while paging.has_more.
    ScrapeLinkedinSearchServiceProvidersResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                    description: Canonical member id (decoded in-process).
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                    description: The card's headline line on the regular and Recruiter engines; null on Sales Navigator people search.
                  position:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured position (read the headline).
                  company_name:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured company (read the headline).
                  location:
                    type: string
                    nullable: true
                    description: The card's location line on the regular and Recruiter engines; null on Sales Navigator people search.
                  avatar_url:
                    type: string
                    nullable: true
                    description: Best effort on the regular engines (a DOM lookup, null when the card image had not rendered).
                  connection_degree:
                    type: string
                    nullable: true
                    description: "The degree badge as the card prints it: 1st, 2nd, 3rd or 3rd+ on the regular engines; Recruiter spells 1st, 2nd, 3rd, out_of_network."
                required:
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - full_name
                  - headline
                  - position
                  - company_name
                  - location
                  - avatar_url
                  - connection_degree
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging:
              type: object
              properties:
                page:
                  type: integer
                page_size:
                  type: integer
                has_more:
                  type: boolean
                total:
                  type: integer
                  nullable: true
              required:
                - page
                - page_size
                - has_more
                - total
              description: "Page-numbered paging: re-call with page + 1 while has_more."
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSimilarCompaniesRequest:
      type: object
      description: Request body of `scrape_linkedin_similar_companies`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        company:
          type: object
          properties:
            company_url:
              type: string
              nullable: true
              maxLength: 512
              description: https://www.linkedin.com/company/{slug}/
            company_ln_id:
              type: string
              nullable: true
              maxLength: 64
              description: Numeric LinkedIn company id.
          description: "Target company: exactly one of company_url / company_ln_id."
        limit:
          type: integer
          minimum: 1
          maximum: 50
          description: Default 10.
      required:
        - company
    ScrapeLinkedinSimilarCompaniesResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  company_ln_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                    description: "Vanity slug; regular and similar-companies engines only (Sales Navigator: null, resolve via get-company-public-identifier)."
                  name:
                    type: string
                    nullable: true
                  industry:
                    type: string
                    nullable: true
                  employees_size:
                    type: string
                    nullable: true
                    description: Sales Navigator size bucket ("11-50"); null on the regular engine.
                  followers:
                    type: integer
                    nullable: true
                    description: Regular and similar-companies engines; the regular card's rounded "4K followers" reads 4000.
                  location:
                    type: string
                    nullable: true
                    description: "Regular engine: the card's location line; many cards print none."
                  tagline:
                    type: string
                    nullable: true
                    description: Sales Navigator only.
                  logo_url:
                    type: string
                    nullable: true
                  website:
                    type: string
                    nullable: true
                    description: On no search wire; always null.
                required:
                  - company_ln_id
                  - nickname
                  - name
                  - industry
                  - employees_size
                  - followers
                  - location
                  - tagline
                  - logo_url
                  - website
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging: {}
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    ScrapeLinkedinSimilarProfilesRequest:
      type: object
      description: Request body of `scrape_linkedin_similar_profiles`.
      properties:
        linkedin_account_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "Executor account (ln_ac_...). OPTIONAL everywhere on this surface. Given: the call runs on that account ONLY; a saturated or held scraping bucket refuses 429 bucket_saturated (with retry_after). Omitted: the service auto-picks one of your connected accounts with remaining capacity (SN verbs pick only Sales-Navigator seats; 422 no_connected_accounts when none is ready, 429 when all are at capacity)."
        idempotency_key:
          type: string
          nullable: true
          maxLength: 128
          description: "Ledger replay guard: a repeat call with the same (team, key) returns the stored outcome; no re-execution. Recommended on every search run. The KEY ALONE decides: the probe does not compare arguments, so reusing one key after changing the arguments hands back the FIRST result. On the twelve search verbs that matters twice over, because switching a call from filters to url (or back) under one key replays instead of running the new search. New search, new key."
        profile:
          type: object
          properties:
            ln_id:
              type: string
              nullable: true
              maxLength: 128
              description: Regular-profile URN (ACoAA…).
            sn_id:
              type: string
              nullable: true
              maxLength: 64
              description: Sales Navigator URN (ACwAA…).
            nickname:
              type: string
              nullable: true
              maxLength: 100
              description: Vanity slug.
          description: "Target profile: exactly one of ln_id / sn_id / nickname (ln_member_id is not dispatchable, KNOWLEDGE §3d)."
        limit:
          type: integer
          minimum: 1
          maximum: 100
          description: Default 25.
      required:
        - profile
    ScrapeLinkedinSimilarProfilesResponse:
      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: {}
        result:
          type: object
          properties:
            rows:
              type: array
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                    description: Canonical member id (decoded in-process).
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                    description: The card's headline line on the regular and Recruiter engines; null on Sales Navigator people search.
                  position:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured position (read the headline).
                  company_name:
                    type: string
                    nullable: true
                    description: Recruiter search only; the regular card prints no structured company (read the headline).
                  location:
                    type: string
                    nullable: true
                    description: The card's location line on the regular and Recruiter engines; null on Sales Navigator people search.
                  avatar_url:
                    type: string
                    nullable: true
                    description: Best effort on the regular engines (a DOM lookup, null when the card image had not rendered).
                  connection_degree:
                    type: string
                    nullable: true
                    description: "The degree badge as the card prints it: 1st, 2nd, 3rd or 3rd+ on the regular engines; Recruiter spells 1st, 2nd, 3rd, out_of_network."
                required:
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - full_name
                  - headline
                  - position
                  - company_name
                  - location
                  - avatar_url
                  - connection_degree
              description: The transient result list, in LinkedIn’s order; NOTHING persisted.
            paging: {}
            data_request:
              type: object
              properties: {}
              description: 'The kind="scrape" DataRequest journal row for this call (terminal completed), embedded as result.data_request; served_from_cache always false. A receipt: its result_ref is null here, the page is result.rows next to it; get_data_request by sid reads the stored payload back. Full DataRequestDomain shape owned by ./data_requests.md, so it is left passthrough here.'
          required:
            - rows
            - paging
            - data_request
        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
              nullable: true
              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
              nullable: true
              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
    SearchAntidetectBrowserLogsRequest:
      type: object
      description: Request body of `search_antidetect_browser_logs`.
      properties:
        filter:
          type: object
          properties:
            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
            automation_server_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            level:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            event_type:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            code:
              type: object
              properties:
                eq:
                  type: integer
                ne:
                  type: integer
                in:
                  type: array
                  items:
                    type: integer
                nin:
                  type: array
                  items:
                    type: integer
                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
        include:
          type: array
          items:
            type: string
            enum:
              - antidetect_browser
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchAntidetectBrowserLogsResponse:
      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
                  automation_server_sid:
                    type: string
                    nullable: true
                  level:
                    type: string
                    enum:
                      - info
                      - error
                  event_type:
                    type: string
                    enum:
                      - started_on_schedule
                      - stopped_on_schedule
                      - started_by_user
                      - stopped_by_user
                      - started_after_maintenance
                      - stopped_before_delete
                      - stopped_for_maintenance
                      - released_after_maintenance
                      - start_failure
                      - proxy_error
                      - login_issue
                      - runtime_error
                      - started_after_error
                      - server_unreachable
                      - error_escalation
                      - account_restricted
                      - proxy_replaced
                  code:
                    type: number
                    nullable: true
                  body:
                    anyOf:
                      - type: object
                        additionalProperties: {}
                      - type: string
                      - {}
                  created_at:
                    type: string
                required:
                  - sid
                  - team_sid
                  - antidetect_browser_sid
                  - automation_server_sid
                  - level
                  - event_type
                  - code
                  - body
                  - created_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: number
            groups:
              type: object
              additionalProperties: {}
          required:
            - total_count
            - groups
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchAntidetectBrowserProxiesRequest:
      type: object
      description: Request body of `search_antidetect_browser_proxies`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            type:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            country_code:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            vendor_zone:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            status:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            last_health_check_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            avg_connection_time_ms:
              type: object
              properties:
                gte:
                  type: number
                lte:
                  type: number
                gt:
                  type: number
                lt:
                  type: number
                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 proxies)."
        sort:
          type: object
          properties:
            field:
              type: string
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchAntidetectBrowserProxiesResponse:
      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
                  type:
                    type: string
                    enum:
                      - residential
                      - datacenter
                  country_code:
                    type: string
                  vendor_zone:
                    type: string
                    nullable: true
                  ip:
                    type: string
                    nullable: true
                  port:
                    type: number
                    nullable: true
                  username:
                    type: string
                    nullable: true
                  password:
                    type: string
                    nullable: true
                  status:
                    type: string
                    enum:
                      - active
                      - no_connect
                      - country_mismatch
                      - fraud_flagged
                      - replaced
                  last_health_check_at:
                    type: string
                    nullable: true
                  avg_connection_time_ms:
                    type: number
                    nullable: true
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - type
                  - country_code
                  - vendor_zone
                  - ip
                  - port
                  - username
                  - password
                  - status
                  - last_health_check_at
                  - avg_connection_time_ms
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchAntidetectBrowsersRequest:
      type: object
      description: Request body of `search_antidetect_browsers`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            status:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            browser_owner:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            vendor_provider:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            vendor_name:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: Vendor profile display name (the supported name lookup path).
            vendor_profile_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            account_share_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: The share a browser came in with; is_null:false = every browser that belongs to a shared account.
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            automation_server_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:true = ops scan for browsers not assigned to a server.
            antidetect_browser_proxy_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            proxy_country_code:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            proxy_5g:
              type: object
              properties:
                eq:
                  type: boolean
              additionalProperties: false
              description: eq:true = the browsers occupying a 5G Proxy add-on slot (that is how slot usage is counted).
            fail_count:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            logout_count:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            last_start_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            last_fail_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            last_logout_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 browsers)."
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
              - antidetect_browser_proxy
              - antidetect_browser_logs
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
                - updated_at
                - last_start_at
                - last_fail_at
                - last_logout_at
                - fail_count
                - logout_count
                - vendor_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
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchAntidetectBrowsersResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                    nullable: true
                  automation_server_sid:
                    type: string
                    nullable: true
                  account_share_sid:
                    type: string
                    nullable: true
                  share_role:
                    type: string
                    nullable: true
                    enum:
                      - owner
                      - holder
                      - giver
                      - receiver
                  vendor_provider:
                    type: string
                    enum:
                      - gologin
                      - multilogin
                      - adspower
                      - dolphin
                  vendor_name:
                    type: string
                    nullable: true
                  vendor_profile_id:
                    type: string
                    nullable: true
                  browser_owner:
                    type: string
                    enum:
                      - platform
                      - customer
                  status:
                    type: string
                    enum:
                      - stopped
                      - queued_to_start
                      - initializing
                      - running
                      - idle
                      - queued_to_stop
                      - start_issue
                      - running_issue
                      - login_issue
                      - restricted
                      - client_error_investigation
                      - support_error_investigation
                      - maintenance
                      - shared_out
                      - subscription_required
                  error_reason:
                    type: string
                    nullable: true
                  fail_count:
                    type: number
                  last_fail_at:
                    type: string
                    nullable: true
                  logout_count:
                    type: number
                  last_logout_at:
                    type: string
                    nullable: true
                  last_start_at:
                    type: string
                    nullable: true
                  last_health_check_at:
                    type: string
                    nullable: true
                  last_activity_at:
                    type: string
                    nullable: true
                  antidetect_browser_proxy_sid:
                    type: string
                    nullable: true
                  proxy_country_code:
                    type: string
                    nullable: true
                  custom_proxy:
                    type: object
                    nullable: true
                    properties:
                      ip:
                        type: string
                      port:
                        type: integer
                      mode:
                        type: string
                      username:
                        type: string
                        nullable: true
                      exit_ip:
                        type: string
                        nullable: true
                      latency_ms:
                        type: integer
                        nullable: true
                    required:
                      - ip
                      - port
                      - mode
                      - username
                      - exit_ip
                      - latency_ms
                  proxy_5g:
                    type: boolean
                    description: "5G Proxy add-on: the browser runs on the dedicated 5G mobile route (faster command execution, fewer retries). Each flagged browser occupies one add-on slot."
                  cloud_browser_access:
                    type: array
                    items:
                      type: object
                      properties:
                        key:
                          type: string
                          nullable: true
                          minLength: 18
                          maxLength: 18
                          pattern: ^cb_ak_
                          description: "The bearer token itself, in full, for a caller holding can_manage_cloud_browser_external_links (the permission that mints it: reading a key is the same power as minting one, since the public connect checks nothing but the key). null for every other caller; the entry stays so the link, its expiry and its use can still be listed. On cloud-browser-sessions it is masked to the last 4."
                        expires_at:
                          type: string
                          nullable: true
                          description: ISO 8601 expiry; null means it never expires. Checked at connect and never again, so a session can outlive its own key.
                        max_connects:
                          type: number
                          nullable: true
                          description: Cap on CONCURRENT sessions on this key; null means unlimited.
                        allowed_ips:
                          type: array
                          nullable: true
                          items:
                            type: string
                        allowed_countries:
                          type: array
                          nullable: true
                          items:
                            type: string
                        purpose:
                          type: string
                          enum:
                            - relogin
                            - recruiter_relogin
                            - share
                          description: What the public page behind the link does. Stamped at mint and never re-negotiated at connect, because the visitor is unauthenticated. Absent on keys minted before the field existed, which the backend reads as relogin.
                      required:
                        - key
                        - expires_at
                        - max_connects
                        - allowed_ips
                        - allowed_countries
                    description: The smart links minted on this browser; the key itself only for a caller holding can_manage_cloud_browser_external_links, null otherwise (2026-09-16). Each console open used to leave a throwaway entry here; minting now sweeps entries that expired over 24h ago, so this is the live link list rather than a log.
                  vendor_profile_shares:
                    type: array
                    nullable: true
                    items:
                      type: object
                      properties:
                        email:
                          type: string
                        role:
                          type: string
                        shared_at:
                          type: string
                          nullable: true
                        shared_by:
                          type: string
                          nullable: true
                        vendor_share_id:
                          type: string
                          nullable: true
                      required:
                        - email
                        - role
                        - shared_at
                        - shared_by
                        - vendor_share_id
                  created_by:
                    type: object
                    properties:
                      actor_type:
                        type: string
                        enum:
                          - user
                          - support
                          - api_key
                          - system
                          - agent
                      actor_sid:
                        type: string
                        nullable: true
                      team_sid:
                        type: string
                      actor_name:
                        type: string
                        nullable: true
                        description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                      oauth_client_sid:
                        type: string
                        nullable: true
                        description: The acting OAuth client (id_oc_*); null off the OAuth path.
                      reason:
                        type: string
                        nullable: true
                        description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                      permissions:
                        type: object
                        additionalProperties: {}
                        description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                      cluster_id:
                        type: integer
                        nullable: true
                        description: "Internal audit context: the cluster that served the write."
                      trace_id:
                        type: string
                        nullable: true
                        description: "Internal audit context: the trace id of the request that wrote the row."
                    required:
                      - actor_type
                      - actor_sid
                      - team_sid
                      - permissions
                  deleted_by:
                    type: object
                    nullable: true
                    properties:
                      actor_type:
                        type: string
                        enum:
                          - user
                          - support
                          - api_key
                          - system
                          - agent
                      actor_sid:
                        type: string
                        nullable: true
                      team_sid:
                        type: string
                      actor_name:
                        type: string
                        nullable: true
                        description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                      oauth_client_sid:
                        type: string
                        nullable: true
                        description: The acting OAuth client (id_oc_*); null off the OAuth path.
                      reason:
                        type: string
                        nullable: true
                        description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                      permissions:
                        type: object
                        additionalProperties: {}
                        description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                      cluster_id:
                        type: integer
                        nullable: true
                        description: "Internal audit context: the cluster that served the write."
                      trace_id:
                        type: string
                        nullable: true
                        description: "Internal audit context: the trace id of the request that wrote the row."
                    required:
                      - actor_type
                      - actor_sid
                      - team_sid
                      - permissions
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - automation_server_sid
                  - account_share_sid
                  - share_role
                  - vendor_provider
                  - vendor_name
                  - vendor_profile_id
                  - browser_owner
                  - status
                  - error_reason
                  - fail_count
                  - last_fail_at
                  - logout_count
                  - last_logout_at
                  - last_start_at
                  - last_health_check_at
                  - last_activity_at
                  - antidetect_browser_proxy_sid
                  - proxy_country_code
                  - custom_proxy
                  - proxy_5g
                  - cloud_browser_access
                  - vendor_profile_shares
                  - created_by
                  - deleted_by
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: number
            groups:
              type: object
              additionalProperties: {}
          required:
            - total_count
            - groups
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchCloudBrowserSessionsRequest:
      type: object
      description: Request body of `search_cloud_browser_sessions`.
      properties:
        filter:
          type: object
          properties:
            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
            cloud_browser_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            connected_user_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            access_type:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            ip:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            ip_country:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            ip_city:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            fingerprint_hash:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            is_login_case:
              type: object
              properties:
                eq:
                  type: boolean
              additionalProperties: false
            login_result:
              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
            login_confirmed_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            connected_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            disconnected_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            session_duration_seconds:
              type: object
              properties:
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
                is_null:
                  type: boolean
              additionalProperties: false
            disconnect_cause:
              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
            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
        sort:
          type: object
          properties:
            field:
              type: string
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchCloudBrowserSessionsResponse:
      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
                  cloud_browser_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                    nullable: true
                  connected_user_sid:
                    type: string
                    nullable: true
                  access_key:
                    type: string
                    nullable: true
                    description: "Masked smart-link key: cb_ak_ followed by asterisks and the key's last 4 characters. Null when the session used no key at all (access_type internal). Join it to antidetect_browsers.cloud_browser_access[].key on the last 4 characters, never on equality."
                  access_type:
                    type: string
                    enum:
                      - internal
                      - external
                  ip:
                    type: string
                  ip_country:
                    type: string
                    nullable: true
                  ip_city:
                    type: string
                    nullable: true
                  fingerprint:
                    type: object
                    nullable: true
                    properties:
                      user_agent:
                        type: string
                      screen_resolution:
                        type: string
                      timezone:
                        type: string
                      language:
                        type: string
                      platform:
                        type: string
                    required:
                      - user_agent
                      - screen_resolution
                      - timezone
                      - language
                      - platform
                  fingerprint_hash:
                    type: string
                    nullable: true
                  referrer:
                    type: string
                    nullable: true
                  is_login_case:
                    type: boolean
                  login_confirmed_at:
                    type: string
                    nullable: true
                  login_result:
                    type: string
                    nullable: true
                    enum:
                      - success
                      - cookie_save_failed
                      - browser_start_failed
                      - abandoned
                  login_error_reason:
                    type: string
                    nullable: true
                  connected_at:
                    type: string
                  disconnected_at:
                    type: string
                    nullable: true
                  session_duration_seconds:
                    type: number
                    nullable: true
                  disconnect_cause:
                    type: string
                    nullable: true
                    enum:
                      - user
                      - keep_alive_stale
                      - ttl_expired
                      - stuck_disconnecting
                      - maintenance
                  disconnect_reason:
                    type: string
                    nullable: true
                  created_at:
                    type: string
                required:
                  - sid
                  - team_sid
                  - antidetect_browser_sid
                  - cloud_browser_sid
                  - linkedin_account_sid
                  - connected_user_sid
                  - access_key
                  - access_type
                  - ip
                  - ip_country
                  - ip_city
                  - fingerprint
                  - fingerprint_hash
                  - referrer
                  - is_login_case
                  - login_confirmed_at
                  - login_result
                  - login_error_reason
                  - connected_at
                  - disconnected_at
                  - session_duration_seconds
                  - disconnect_cause
                  - disconnect_reason
                  - created_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchDataRequestsRequest:
      type: object
      description: Request body of `search_data_requests`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            kind:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - enrich
                    - scrape
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - enrich
                      - scrape
              additionalProperties: false
            method:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - person_lite_profile
                    - person_basic_profile
                    - person_full_profile
                    - person_experience
                    - person_skills
                    - person_education
                    - person_posts
                    - person_featured
                    - person_contact_info
                    - person_languages
                    - person_certifications
                    - person_recommendations
                    - person_comment_activity
                    - person_reaction_activity
                    - person_interests
                    - person_services
                    - company_profile
                    - company_lite_profile
                    - company_public_identifier
                    - company_posts
                    - post_details
                    - get_activity_urn_by_url
                    - search_people_by_url
                    - search_people_by_params
                    - search_sales_nav_people_by_url
                    - search_sales_nav_people_by_params
                    - search_service_providers
                    - search_service_providers_by_url
                    - similar_profiles
                    - search_jobs
                    - search_jobs_by_url
                    - search_events
                    - search_events_by_url
                    - search_groups
                    - search_groups_by_url
                    - search_courses
                    - search_courses_by_url
                    - search_products
                    - search_products_by_url
                    - search_schools
                    - search_schools_by_url
                    - search_companies_by_url
                    - search_companies_by_params
                    - search_sales_nav_companies_by_url
                    - search_sales_nav_companies_by_params
                    - similar_companies
                    - company_employees
                    - company_decision_makers
                    - search_posts
                    - search_posts_by_url
                    - get_post_comments
                    - get_post_reactors
                    - get_post_resharers
                    - search_param_id_lookup
                    - search_sales_nav_param_id_lookup
                    - search_recruiter_people_by_params
                    - search_recruiter_people_by_url
                    - search_recruiter_param_id_lookup
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - person_lite_profile
                      - person_basic_profile
                      - person_full_profile
                      - person_experience
                      - person_skills
                      - person_education
                      - person_posts
                      - person_featured
                      - person_contact_info
                      - person_languages
                      - person_certifications
                      - person_recommendations
                      - person_comment_activity
                      - person_reaction_activity
                      - person_interests
                      - person_services
                      - company_profile
                      - company_lite_profile
                      - company_public_identifier
                      - company_posts
                      - post_details
                      - get_activity_urn_by_url
                      - search_people_by_url
                      - search_people_by_params
                      - search_sales_nav_people_by_url
                      - search_sales_nav_people_by_params
                      - search_service_providers
                      - search_service_providers_by_url
                      - similar_profiles
                      - search_jobs
                      - search_jobs_by_url
                      - search_events
                      - search_events_by_url
                      - search_groups
                      - search_groups_by_url
                      - search_courses
                      - search_courses_by_url
                      - search_products
                      - search_products_by_url
                      - search_schools
                      - search_schools_by_url
                      - search_companies_by_url
                      - search_companies_by_params
                      - search_sales_nav_companies_by_url
                      - search_sales_nav_companies_by_params
                      - similar_companies
                      - company_employees
                      - company_decision_makers
                      - search_posts
                      - search_posts_by_url
                      - get_post_comments
                      - get_post_reactors
                      - get_post_resharers
                      - search_param_id_lookup
                      - search_sales_nav_param_id_lookup
                      - search_recruiter_people_by_params
                      - search_recruiter_people_by_url
                      - search_recruiter_param_id_lookup
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - person_lite_profile
                      - person_basic_profile
                      - person_full_profile
                      - person_experience
                      - person_skills
                      - person_education
                      - person_posts
                      - person_featured
                      - person_contact_info
                      - person_languages
                      - person_certifications
                      - person_recommendations
                      - person_comment_activity
                      - person_reaction_activity
                      - person_interests
                      - person_services
                      - company_profile
                      - company_lite_profile
                      - company_public_identifier
                      - company_posts
                      - post_details
                      - get_activity_urn_by_url
                      - search_people_by_url
                      - search_people_by_params
                      - search_sales_nav_people_by_url
                      - search_sales_nav_people_by_params
                      - search_service_providers
                      - search_service_providers_by_url
                      - similar_profiles
                      - search_jobs
                      - search_jobs_by_url
                      - search_events
                      - search_events_by_url
                      - search_groups
                      - search_groups_by_url
                      - search_courses
                      - search_courses_by_url
                      - search_products
                      - search_products_by_url
                      - search_schools
                      - search_schools_by_url
                      - search_companies_by_url
                      - search_companies_by_params
                      - search_sales_nav_companies_by_url
                      - search_sales_nav_companies_by_params
                      - similar_companies
                      - company_employees
                      - company_decision_makers
                      - search_posts
                      - search_posts_by_url
                      - get_post_comments
                      - get_post_reactors
                      - get_post_resharers
                      - search_param_id_lookup
                      - search_sales_nav_param_id_lookup
                      - search_recruiter_people_by_params
                      - search_recruiter_people_by_url
                      - search_recruiter_param_id_lookup
              additionalProperties: false
            status:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - pending
                    - running
                    - completed
                    - rejected
                    - failed
                ne:
                  type: string
                  enum:
                    - pending
                    - running
                    - completed
                    - rejected
                    - failed
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - pending
                      - running
                      - completed
                      - rejected
                      - failed
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - pending
                      - running
                      - completed
                      - rejected
                      - failed
              additionalProperties: false
            executed_on:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - own_account
                    - infra_pool
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - own_account
                      - infra_pool
                is_null:
                  type: boolean
              additionalProperties: false
              description: "is_null:true ⇒ never dispatched (rejected / cache-served). `own_account` is what every dispatched row records. `infra_pool` is HISTORICAL: no run since 2026-08-16 produces it, so filtering on it matches only rows stored before that date."
            served_from_cache:
              type: object
              properties:
                eq:
                  type: boolean
              additionalProperties: false
            ln_member_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Canonical person axis; ln_id/sn_id inputs normalize to this.
            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
            completed_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:true = still running or never ran.
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: The account that executed (or was asked to execute) the request.
            input_kind:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - ln_id
                    - sn_id
                    - nickname
                    - ln_member_id
                    - url
                    - activity_urn
                    - params
                    - domain
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - ln_id
                      - sn_id
                      - nickname
                      - ln_member_id
                      - url
                      - activity_urn
                      - params
                      - domain
              additionalProperties: false
            input_value:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: 'The raw input as it was given, exact match: "did we already fetch this url / this slug".'
            ln_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: A profile URN; matches the PERSON (normalized to the member id), so a row stored under the Sales Navigator id is found too.
            sn_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: A Sales Navigator id; matches the person, like ln_id.
            nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            cached_from_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: The row a cache-served request was answered from; eq = every request one fetch has served.
            error_code:
              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: Why a request failed (not_found, linkedin_429, browser_not_alive, ...); is_null:false = everything that failed.
            idempotency_key:
              type: object
              properties:
                eq:
                  type: string
              additionalProperties: false
              description: Exact-match retry-replay lookup.
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
              - cached_from
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
                - completed_at
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchDataRequestsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                    nullable: true
                  kind:
                    type: string
                    enum:
                      - enrich
                      - scrape
                  method:
                    type: string
                    enum:
                      - person_lite_profile
                      - person_basic_profile
                      - person_full_profile
                      - person_experience
                      - person_skills
                      - person_education
                      - person_posts
                      - person_featured
                      - person_contact_info
                      - person_languages
                      - person_certifications
                      - person_recommendations
                      - person_comment_activity
                      - person_reaction_activity
                      - person_interests
                      - person_services
                      - company_profile
                      - company_lite_profile
                      - company_public_identifier
                      - company_posts
                      - post_details
                      - get_activity_urn_by_url
                      - search_people_by_url
                      - search_people_by_params
                      - search_sales_nav_people_by_url
                      - search_sales_nav_people_by_params
                      - search_service_providers
                      - search_service_providers_by_url
                      - similar_profiles
                      - search_jobs
                      - search_jobs_by_url
                      - search_events
                      - search_events_by_url
                      - search_groups
                      - search_groups_by_url
                      - search_courses
                      - search_courses_by_url
                      - search_products
                      - search_products_by_url
                      - search_schools
                      - search_schools_by_url
                      - search_companies_by_url
                      - search_companies_by_params
                      - search_sales_nav_companies_by_url
                      - search_sales_nav_companies_by_params
                      - similar_companies
                      - company_employees
                      - company_decision_makers
                      - search_posts
                      - search_posts_by_url
                      - get_post_comments
                      - get_post_reactors
                      - get_post_resharers
                      - search_param_id_lookup
                      - search_sales_nav_param_id_lookup
                      - search_recruiter_people_by_params
                      - search_recruiter_people_by_url
                      - search_recruiter_param_id_lookup
                  status:
                    type: string
                    enum:
                      - pending
                      - running
                      - completed
                      - rejected
                      - failed
                  input_kind:
                    type: string
                    enum:
                      - ln_id
                      - sn_id
                      - nickname
                      - ln_member_id
                      - url
                      - activity_urn
                      - params
                      - domain
                  input_value:
                    type: string
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  executed_on:
                    type: string
                    nullable: true
                    enum:
                      - own_account
                      - infra_pool
                  served_from_cache:
                    type: boolean
                  cached_from_sid:
                    type: string
                    nullable: true
                  idempotency_key:
                    type: string
                    nullable: true
                  result_ref:
                    anyOf:
                      - type: string
                      - type: object
                        additionalProperties: {}
                      - type: array
                        items: {}
                      - {}
                    description: "The stored result payload (inline object/array, or a string pointer). Null on the receipt a scrape / enrich response embeds as result.data_request: that response carries the data as rows / the item, and get_data_request by sid reads the stored payload back."
                  error_code:
                    type: string
                    nullable: true
                  created_by:
                    type: object
                    nullable: true
                    properties:
                      actor_type:
                        type: string
                        enum:
                          - user
                          - support
                          - api_key
                          - system
                          - agent
                      actor_sid:
                        type: string
                      team_sid:
                        type: string
                      permissions:
                        type: object
                        additionalProperties: {}
                      trace_id:
                        type: string
                        nullable: true
                      reason:
                        type: string
                        nullable: true
                    required:
                      - actor_type
                      - actor_sid
                      - team_sid
                      - permissions
                      - reason
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  completed_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - kind
                  - method
                  - status
                  - input_kind
                  - input_value
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - executed_on
                  - served_from_cache
                  - cached_from_sid
                  - idempotency_key
                  - result_ref
                  - error_code
                  - created_by
                  - created_at
                  - updated_at
                  - completed_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinAccountActivityLogRequest:
      type: object
      description: Request body of `search_linkedin_account_activity_log`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: Required for metrics (service-layer guardrail).
            trace_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: Grafana Tempo / Loki cross-lookup.
            action_type:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            status:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: pending | success | failed | skipped.
            sync_run_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            error_code:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: §6.4 open taxonomy; eq:'target_blocked' surfaces backend-derived block outcomes.
            target_ln_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            target_ln_member_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Canonical cross-surface key.
            target_sn_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            target_nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            target_recruiter_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: The Recruiter (talent) envelope of the person the action addressed; matches the person, like target_ln_id.
            target_entity_urn:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: 'The object the action acted on: the post a reaction or a comment landed on (urn:li:activity / ugcPost), the comment a delete removed. "What did this account like?" is target_entity_type:post on like_post rows.'
            target_entity_type:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - post
                    - comment
                    - message
                    - conversation
                    - invitation
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - post
                      - comment
                      - message
                      - conversation
                      - invitation
                is_null:
                  type: boolean
              additionalProperties: false
            duration_ms:
              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: is_null:true ⇒ pending row.
            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_null: true }."
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
              - linkedin_account_smart_limit
              - sync_run
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
                - duration_ms
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinAccountActivityLogResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  trace_id:
                    type: string
                  action_type:
                    type: string
                  status:
                    type: string
                    enum:
                      - pending
                      - success
                      - failed
                      - skipped
                  sync_run_sid:
                    type: string
                    nullable: true
                  limit_type_override:
                    type: string
                    nullable: true
                  target_ln_member_id:
                    type: string
                    nullable: true
                  target_ln_id:
                    type: string
                    nullable: true
                  target_sn_id:
                    type: string
                    nullable: true
                  target_nickname:
                    type: string
                    nullable: true
                  error_code:
                    type: string
                    nullable: true
                    description: "§6.4 OPEN taxonomy: string, not enum."
                  error_message:
                    type: string
                    nullable: true
                  duration_ms:
                    type: number
                    nullable: true
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - trace_id
                  - action_type
                  - status
                  - sync_run_sid
                  - limit_type_override
                  - target_ln_member_id
                  - target_ln_id
                  - target_sn_id
                  - target_nickname
                  - error_code
                  - error_message
                  - duration_ms
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
            pending_count:
              type: integer
            success_count:
              type: integer
            failed_count:
              type: integer
            skipped_count:
              type: integer
            groups:
              type: object
              additionalProperties: {}
          required:
            - total_count
            - pending_count
            - success_count
            - failed_count
            - skipped_count
            - groups
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinAccountBlockLogRequest:
      type: object
      description: Request body of `search_linkedin_account_block_log`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            target_ln_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: Raw regular-profile URN; normalized to target_ln_member_id on filter.
            target_ln_member_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Canonical permanent-dedup key (cross-account hostile-target lookup).
            target_sn_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            target_nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Exact-match only.
            linkedin_account_activity_log_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: Reverse lookup from a failed task.
            linkedin_connection_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:true ⇒ blocks against profiles that were never our connections.
            created_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
              - linkedin_account_activity_log
              - linkedin_connection
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinAccountBlockLogResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  target_ln_member_id:
                    type: string
                  target_ln_id:
                    type: string
                    nullable: true
                  target_sn_id:
                    type: string
                    nullable: true
                  target_nickname:
                    type: string
                    nullable: true
                  linkedin_account_activity_log_sid:
                    type: string
                  linkedin_connection_sid:
                    type: string
                    nullable: true
                  created_at:
                    type: string
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - target_ln_member_id
                  - target_ln_id
                  - target_sn_id
                  - target_nickname
                  - linkedin_account_activity_log_sid
                  - linkedin_connection_sid
                  - created_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: number
            last_24h_count:
              type: number
            last_7d_count:
              type: number
            last_30d_count:
              type: number
            with_connection_count:
              type: number
            without_connection_count:
              type: number
            groups:
              type: object
              additionalProperties: {}
          required:
            - total_count
            - last_24h_count
            - last_7d_count
            - last_30d_count
            - with_connection_count
            - without_connection_count
            - groups
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinAccountQuotaHitsRequest:
      type: object
      description: Request body of `search_linkedin_account_quota_hits`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_snapshot_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            reason:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            limit_type:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: The smart-limit bucket the refusal locked (send_messages, send_connection_requests, ...). One reason can lock more than one bucket.
            has_premium:
              type: object
              properties:
                eq:
                  type: boolean
              additionalProperties: false
            has_sn:
              type: object
              properties:
                eq:
                  type: boolean
              additionalProperties: false
            has_recruiter:
              type: object
              properties:
                eq:
                  type: boolean
              additionalProperties: false
            daily_count:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            seven_days_count:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            thirty_days_count:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            linkedin_quota_hit_till:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
              description: '"currently in effect" ⇒ { gt: "<now>" }.'
            created_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
              - linkedin_account_snapshot
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
                - linkedin_quota_hit_till
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinAccountQuotaHitsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  reason:
                    type: string
                    enum:
                      - connection_request
                      - inmail
                      - other
                    description: LinkedinAccountQuotaHitReasonEnum. The two send-class refusals keep their typed reasons (connection_request locks 1h, inmail 3h). 'other' (2026-08-14) is a LinkedIn 429 on any other action bucket - comment, react, follow, posting and the rest - locking that bucket for 24h; which bucket it was is in limit_type.
                  limit_type:
                    type: string
                    nullable: true
                    description: The smart-limit bucket this refusal locked (comment_posts, react_posts, send_connection_requests, …). The disambiguator under reason 'other'. Null on rows written before 2026-08-14.
                  daily_count:
                    type: number
                  seven_days_count:
                    type: number
                  thirty_days_count:
                    type: number
                  linkedin_quota_hit_till:
                    type: string
                    description: LinkedIn-side hard-lock expiry (ISO 8601, UTC).
                  linkedin_account_snapshot_sid:
                    type: string
                    nullable: true
                  has_premium:
                    type: boolean
                  has_sn:
                    type: boolean
                  has_recruiter:
                    type: boolean
                  created_at:
                    type: string
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - reason
                  - limit_type
                  - daily_count
                  - seven_days_count
                  - thirty_days_count
                  - linkedin_quota_hit_till
                  - linkedin_account_snapshot_sid
                  - has_premium
                  - has_sn
                  - has_recruiter
                  - created_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinAccountSmartLimitsRequest:
      type: object
      description: Request body of `search_linkedin_account_smart_limits`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            limit_type:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            daily_limit:
              type: object
              properties:
                eq:
                  type: integer
                ne:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            smart_limit:
              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
            target_limit:
              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
            delay_in_seconds:
              type: object
              properties:
                eq:
                  type: integer
                ne:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            learning_enabled:
              type: object
              properties:
                eq:
                  type: boolean
              additionalProperties: false
              description: false = the adaptive ceiling is pinned off for this row.
            learned_ceiling:
              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 cap LinkedIn refusals taught this bucket; is_null:false = every row the learner has lowered.
            learned_ceiling_source:
              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: backoff (a LinkedIn refusal lowered it) | probe (a clean streak raised it).
            learned_ceiling_updated_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            probe_not_before:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: When the learner may next try a higher ceiling.
            clean_saturation_streak:
              type: object
              properties:
                eq:
                  type: integer
                ne:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
              description: Days in a row the bucket spent its whole budget without a LinkedIn refusal.
            done_today_count:
              type: object
              properties:
                eq:
                  type: integer
                ne:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
              description: Live read of today's usage.
            last_reset_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            status:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: "Primary state filter: active | held | linkedin_blocked (held = daily budget spent OR a live hold, the same thing)."
            hold_till:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Platform-side pause clock.
            linkedin_quota_hit_till:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: LinkedIn-block clock.
            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
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
              - linkedin_account_quota_hits
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
                - updated_at
                - last_reset_at
                - daily_limit
                - smart_limit
                - target_limit
                - done_today_count
                - status
                - hold_till
                - linkedin_quota_hit_till
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinAccountSmartLimitsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  limit_type:
                    type: string
                    enum:
                      - send_connection_requests
                      - networking_general
                      - send_messages
                      - send_inmails
                      - messaging_general
                      - comment_posts
                      - react_posts
                      - endorse_skills
                      - visit_profiles
                      - edit_profile
                      - self_account_sync
                      - scraping
                      - enrichment
                      - posting
                      - custom_request
                      - data_requests
                  daily_limit:
                    type: number
                  smart_limit:
                    type: number
                    nullable: true
                  target_limit:
                    type: number
                    nullable: true
                  delay_in_seconds:
                    type: number
                  done_today_count:
                    type: number
                  done_7d_count:
                    type: number
                    nullable: true
                  last_reset_at:
                    type: string
                  status:
                    type: string
                    enum:
                      - active
                      - held
                      - linkedin_blocked
                  hold_till:
                    type: string
                    nullable: true
                  linkedin_quota_hit_till:
                    type: string
                    nullable: true
                  created_at:
                    type: string
                  updated_at:
                    type: string
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - limit_type
                  - daily_limit
                  - smart_limit
                  - target_limit
                  - delay_in_seconds
                  - done_today_count
                  - last_reset_at
                  - status
                  - hold_till
                  - linkedin_quota_hit_till
                  - created_at
                  - updated_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinAccountSnapshotsRequest:
      type: object
      description: Request body of `search_linkedin_account_snapshots`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: Primary filter for per-account history / trend views.
            warmup_score:
              type: object
              properties:
                eq:
                  type: integer
                ne:
                  type: integer
                in:
                  type: array
                  items:
                    type: integer
                nin:
                  type: array
                  items:
                    type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
              description: Score-band queries (warmup_score < 50 = "New" accounts).
            network_size:
              type: object
              properties:
                eq:
                  type: integer
                ne:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            has_verification:
              type: object
              properties:
                eq:
                  type: boolean
              additionalProperties: false
            account_completeness:
              type: object
              properties:
                eq:
                  type: integer
                ne:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            account_age_months:
              type: object
              properties:
                eq:
                  type: integer
                ne:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            last_post_days:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:true ⇒ never posted.
            account_diff:
              type: object
              properties:
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            sessions_count:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            sessions_diff:
              type: object
              properties:
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
              description: IP-stability signal.
            last_month_connection_requests_sent:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            last_month_connection_requests_accepted:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            last_month_messages_sent:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            last_month_messages_received:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            last_month_messages_blocked:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
              description: Elevated value ⇒ risk.
            withdrawal_queue:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            smart_limits_enabled:
              type: object
              properties:
                eq:
                  type: boolean
              additionalProperties: false
            created_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
              description: Primary time filter.
            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_null: true }."
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
                - warmup_score
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinAccountSnapshotsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  warmup_score:
                    type: number
                  warmup_breakdown:
                    type: array
                    items:
                      type: object
                      properties:
                        driver:
                          type: string
                          enum:
                            - account_age
                            - limit_hits
                            - blocks
                            - activity
                            - sessions_ip
                            - completeness
                        penalty_pct:
                          type: number
                      required:
                        - driver
                        - penalty_pct
                  account:
                    type: object
                    additionalProperties: {}
                  account_diff:
                    type: number
                  sessions:
                    type: array
                    nullable: true
                    items:
                      type: object
                      additionalProperties: {}
                  sessions_count:
                    type: number
                  sessions_diff:
                    type: number
                  network_size:
                    type: number
                  has_verification:
                    type: boolean
                  account_completeness:
                    type: number
                  account_age_months:
                    type: number
                  last_post_days:
                    type: number
                    nullable: true
                  last_month_connection_requests_sent:
                    type: number
                  last_month_connection_requests_accepted:
                    type: number
                  last_month_messages_sent:
                    type: number
                  last_month_messages_received:
                    type: number
                  last_month_messages_blocked:
                    type: number
                  withdrawal_queue:
                    type: number
                  tips:
                    type: object
                    additionalProperties: {}
                  smart_limits_enabled:
                    type: boolean
                  smart_limits:
                    type: object
                    additionalProperties: {}
                  fact_limits:
                    type: object
                    additionalProperties: {}
                  executed_actions:
                    type: object
                    additionalProperties:
                      type: number
                  created_by:
                    type: object
                    properties:
                      actor_type:
                        type: string
                        enum:
                          - user
                          - support
                          - api_key
                          - system
                          - agent
                      actor_sid:
                        type: string
                        nullable: true
                      team_sid:
                        type: string
                      actor_name:
                        type: string
                        nullable: true
                        description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                      oauth_client_sid:
                        type: string
                        nullable: true
                        description: The acting OAuth client (id_oc_*); null off the OAuth path.
                      reason:
                        type: string
                        nullable: true
                        description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                      permissions:
                        type: object
                        additionalProperties: {}
                        description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                      cluster_id:
                        type: integer
                        nullable: true
                        description: "Internal audit context: the cluster that served the write."
                      trace_id:
                        type: string
                        nullable: true
                        description: "Internal audit context: the trace id of the request that wrote the row."
                    required:
                      - actor_type
                      - actor_sid
                      - team_sid
                      - permissions
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - warmup_score
                  - warmup_breakdown
                  - account
                  - account_diff
                  - sessions
                  - sessions_count
                  - sessions_diff
                  - network_size
                  - has_verification
                  - account_completeness
                  - account_age_months
                  - last_post_days
                  - last_month_connection_requests_sent
                  - last_month_connection_requests_accepted
                  - last_month_messages_sent
                  - last_month_messages_received
                  - last_month_messages_blocked
                  - withdrawal_queue
                  - tips
                  - smart_limits_enabled
                  - smart_limits
                  - fact_limits
                  - executed_actions
                  - created_by
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinAccountSyncRunsRequest:
      type: object
      description: Request body of `search_linkedin_account_sync_runs`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            sync_type:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            sync_mode:
              type: object
              properties:
                eq:
                  type: string
              additionalProperties: false
            scope_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            triggered_by:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            status:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: 'Dominant query: { status: { in: ["pending","in_progress"] } }.'
            next_attempt_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            wait_reason:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            started_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
              additionalProperties: false
            finished_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            archived_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            created_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
              additionalProperties: false
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
              - activity_log_pages
              - limit
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
                - started_at
                - finished_at
                - last_progress_at
                - next_attempt_at
                - items_saved
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinAccountSyncRunsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  sync_type:
                    type: string
                    enum:
                      - connections
                      - connection_requests
                      - connection_invitations
                      - conversations
                      - sales_navigator_conversations
                      - recruiter_conversations
                      - messages
                      - sales_navigator_messages
                      - followers
                      - following
                      - snapshot
                      - premium_check
                  sync_mode:
                    type: string
                    enum:
                      - initial
                      - incremental
                  scope_sid:
                    type: string
                    nullable: true
                  triggered_by:
                    type: string
                    enum:
                      - scheduler
                      - account_created
                      - reset_sync
                      - event_handler
                  next_cursor:
                    type: string
                    nullable: true
                  status:
                    type: string
                    enum:
                      - pending
                      - in_progress
                      - completed
                      - cancelled
                    description: "No failed state: dispatch failure is a browser problem, run is deferred."
                  items_saved:
                    type: number
                  items_deleted:
                    type: number
                  pages_fetched:
                    type: number
                  last_progress_at:
                    type: string
                    nullable: true
                  attempt_count:
                    type: number
                  next_attempt_at:
                    type: string
                    nullable: true
                  wait_reason:
                    type: string
                    nullable: true
                  started_at:
                    type: string
                    nullable: true
                  finished_at:
                    type: string
                    nullable: true
                  error_message:
                    type: string
                    nullable: true
                  created_by:
                    type: object
                    properties:
                      actor_type:
                        type: string
                        enum:
                          - user
                          - support
                          - api_key
                          - system
                          - agent
                      actor_sid:
                        type: string
                        nullable: true
                      team_sid:
                        type: string
                      actor_name:
                        type: string
                        nullable: true
                        description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                      oauth_client_sid:
                        type: string
                        nullable: true
                        description: The acting OAuth client (id_oc_*); null off the OAuth path.
                      reason:
                        type: string
                        nullable: true
                        description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                      permissions:
                        type: object
                        additionalProperties: {}
                        description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                      cluster_id:
                        type: integer
                        nullable: true
                        description: "Internal audit context: the cluster that served the write."
                      trace_id:
                        type: string
                        nullable: true
                        description: "Internal audit context: the trace id of the request that wrote the row."
                    required:
                      - actor_type
                      - actor_sid
                      - team_sid
                      - permissions
                  created_at:
                    type: string
                  updated_at:
                    type: string
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - sync_type
                  - sync_mode
                  - scope_sid
                  - triggered_by
                  - next_cursor
                  - status
                  - items_saved
                  - items_deleted
                  - pages_fetched
                  - last_progress_at
                  - attempt_count
                  - next_attempt_at
                  - wait_reason
                  - started_at
                  - finished_at
                  - error_message
                  - created_by
                  - created_at
                  - updated_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - 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:<now> = 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
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    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
                    nullable: true
                  share_role:
                    type: string
                    nullable: true
                    enum:
                      - owner
                      - holder
                      - giver
                      - receiver
                  ln_id:
                    type: string
                    nullable: true
                  ln_member_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  recruiter_seat_id:
                    type: string
                    nullable: true
                    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
                    nullable: true
                    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
                    nullable: true
                    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
                    nullable: true
                  avatar_url:
                    type: string
                    nullable: true
                  label:
                    type: string
                    nullable: true
                  has_premium:
                    type: boolean
                  has_sn:
                    type: boolean
                  recruiter_status:
                    type: string
                    nullable: true
                    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
                    nullable: true
                    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
                    nullable: true
                    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
                    nullable: true
                    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
                    nullable: true
                  last_connections_sync_at:
                    type: string
                    nullable: true
                  last_conversations_sync_at:
                    type: string
                    nullable: true
                  last_sales_navigator_conversations_sync_at:
                    type: string
                    nullable: true
                  last_recruiter_conversations_sync_at:
                    type: string
                    nullable: true
                  last_connection_requests_sync_at:
                    type: string
                    nullable: true
                  last_connection_invitations_sync_at:
                    type: string
                    nullable: true
                  last_followers_sync_at:
                    type: string
                    nullable: true
                  last_snapshot_at:
                    type: string
                    nullable: true
                  initial_sync_completed_at:
                    type: string
                    nullable: true
                  initial_sync_held_at:
                    type: string
                    nullable: true
                    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
                    nullable: true
                    description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
                  last_heartbeat_at:
                    type: string
                    nullable: true
                  sync_config:
                    type: object
                    nullable: true
                    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
                    nullable: true
                    properties:
                      connections:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          since:
                            type: string
                            nullable: true
                        required:
                          - enabled
                          - since
                      connection_requests:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          since:
                            type: string
                            nullable: true
                        required:
                          - enabled
                          - since
                      connection_invitations:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          since:
                            type: string
                            nullable: true
                        required:
                          - enabled
                          - since
                      conversations:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          since:
                            type: string
                            nullable: true
                        required:
                          - enabled
                          - since
                      sales_navigator_conversations:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          since:
                            type: string
                            nullable: true
                        required:
                          - enabled
                          - since
                      recruiter_conversations:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          since:
                            type: string
                            nullable: true
                        required:
                          - enabled
                          - since
                      messages:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          since:
                            type: string
                            nullable: true
                        required:
                          - enabled
                          - since
                      followers:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          since:
                            type: string
                            nullable: true
                        required:
                          - enabled
                          - since
                      snapshot:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          since:
                            type: string
                            nullable: true
                        required:
                          - enabled
                          - since
                      strike_log:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          since:
                            type: string
                            nullable: true
                        required:
                          - enabled
                          - since
                      limits:
                        type: object
                        properties:
                          enabled:
                            type: boolean
                          since:
                            type: string
                            nullable: true
                        required:
                          - enabled
                          - since
                  created_by:
                    type: object
                    properties:
                      actor_type:
                        type: string
                        enum:
                          - user
                          - support
                          - api_key
                          - system
                          - agent
                      actor_sid:
                        type: string
                        nullable: true
                      team_sid:
                        type: string
                      permissions:
                        type: object
                        additionalProperties: {}
                      request_sid:
                        type: string
                        nullable: true
                      reason:
                        type: string
                        nullable: true
                    required:
                      - actor_type
                      - actor_sid
                      - team_sid
                      - permissions
                      - reason
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                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
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    SearchLinkedinAutoScrapeResultsRequest:
      type: object
      description: Request body of `search_linkedin_auto_scrape_results`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_auto_scrape_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: "Parent collector (ln_as_...): the whole registry of one job."
            first_seen_run_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: The new-lead delta of one run (ln_ar_...). This is the ingest filter after a run completes.
            last_seen_run_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            result_kind:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - person
                    - company
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - person
                      - company
              additionalProperties: false
            seen_runs_count:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
              description: "Recurrence: gte 3 selects leads still showing up in the source. Pair with the parent sid."
            dedup_key:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: "Requires a linkedin_auto_scrape_sid partner, else 422 bounded_scan_required: the key is per collector."
            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
              description: Canonical member id, exact match. The cross-surface bridge between classic and Sales Navigator sightings.
            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
            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
            nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Vanity slug, exact match only (no partial or fuzzy matching).
            company_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
            created_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
              description: First-seen moment of the lead.
            updated_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
              description: Last re-sighting.
            deleted_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
        include:
          type: array
          items:
            type: string
            enum:
              - first_seen_run
              - last_seen_run
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
                - updated_at
                - seen_runs_count
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinAutoScrapeResultsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_auto_scrape_sid:
                    type: string
                  first_seen_run_sid:
                    type: string
                  last_seen_run_sid:
                    type: string
                  seen_runs_count:
                    type: number
                  result_kind:
                    type: string
                    enum:
                      - person
                      - company
                  dedup_key:
                    type: string
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  company_ln_id:
                    type: string
                    nullable: true
                  payload:
                    type: object
                    additionalProperties: {}
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_auto_scrape_sid
                  - first_seen_run_sid
                  - last_seen_run_sid
                  - seen_runs_count
                  - result_kind
                  - dedup_key
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - company_ln_id
                  - payload
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinAutoScrapeRunsRequest:
      type: object
      description: Request body of `search_linkedin_auto_scrape_runs`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_auto_scrape_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: "Parent collector (ln_as_...). The dominant scope: one job history."
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            mass_action_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Which runs fed one mass-action. is_null:true = the run was minted collect-only.
            run_number:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
              description: "Requires a linkedin_auto_scrape_sid partner, else 422 bounded_scan_required: the ordinal is per parent."
            trigger:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - initial
                    - scheduled
                    - manual
                ne:
                  type: string
                  enum:
                    - initial
                    - scheduled
                    - manual
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - initial
                      - scheduled
                      - manual
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - initial
                      - scheduled
                      - manual
              additionalProperties: false
            status:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - pending
                    - in_progress
                    - completed
                    - failed
                ne:
                  type: string
                  enum:
                    - pending
                    - in_progress
                    - completed
                    - failed
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - pending
                      - in_progress
                      - completed
                      - failed
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - pending
                      - in_progress
                      - completed
                      - failed
              additionalProperties: false
            new_count:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            enrolled_count:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            completed_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            failed_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
        include:
          type: array
          items:
            type: string
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
                - run_number
                - completed_at
                - new_count
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinAutoScrapeRunsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_auto_scrape_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  run_number:
                    type: number
                  trigger:
                    type: string
                    enum:
                      - initial
                      - scheduled
                      - manual
                  status:
                    type: string
                    enum:
                      - pending
                      - in_progress
                      - completed
                      - failed
                  page_cursor:
                    type: number
                  pages_applied:
                    type: number
                  results_seen:
                    type: number
                  new_count:
                    type: number
                  seen_count:
                    type: number
                  enrolled_count:
                    type: number
                  mass_action_sid:
                    type: string
                    nullable: true
                  completed_at:
                    type: string
                    nullable: true
                  failed_at:
                    type: string
                    nullable: true
                  error_message:
                    type: string
                    nullable: true
                  created_at:
                    type: string
                  updated_at:
                    type: string
                required:
                  - sid
                  - team_sid
                  - linkedin_auto_scrape_sid
                  - linkedin_account_sid
                  - run_number
                  - trigger
                  - status
                  - page_cursor
                  - pages_applied
                  - results_seen
                  - new_count
                  - seen_count
                  - enrolled_count
                  - mass_action_sid
                  - completed_at
                  - failed_at
                  - error_message
                  - created_at
                  - updated_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinAutoScrapesRequest:
      type: object
      description: Request body of `search_linkedin_auto_scrapes`.
      properties:
        filter:
          type: object
          properties:
            q:
              type: string
              description: "Free-text LIKE over title + sid + source_input.url (the pasted list URL of the url-family sources; params, anchor and post sources have no url and match on title + sid only). The executor name and the mass-action title are not searched: slice by linkedin_account_sid / mass_action_sid."
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            source_method:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - search-people-by-url
                    - search-people-by-params
                    - search-sales-nav-people-by-url
                    - search-sales-nav-people-by-params
                    - similar-profiles
                    - company-employees
                    - company-decision-makers
                    - get-post-comments
                    - get-post-reactors
                    - get-post-resharers
                    - search-service-providers
                    - search-service-providers-by-url
                    - search-companies-by-url
                    - search-companies-by-params
                    - search-sales-nav-companies-by-url
                    - search-sales-nav-companies-by-params
                    - similar-companies
                ne:
                  type: string
                  enum:
                    - search-people-by-url
                    - search-people-by-params
                    - search-sales-nav-people-by-url
                    - search-sales-nav-people-by-params
                    - similar-profiles
                    - company-employees
                    - company-decision-makers
                    - get-post-comments
                    - get-post-reactors
                    - get-post-resharers
                    - search-service-providers
                    - search-service-providers-by-url
                    - search-companies-by-url
                    - search-companies-by-params
                    - search-sales-nav-companies-by-url
                    - search-sales-nav-companies-by-params
                    - similar-companies
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - search-people-by-url
                      - search-people-by-params
                      - search-sales-nav-people-by-url
                      - search-sales-nav-people-by-params
                      - similar-profiles
                      - company-employees
                      - company-decision-makers
                      - get-post-comments
                      - get-post-reactors
                      - get-post-resharers
                      - search-service-providers
                      - search-service-providers-by-url
                      - search-companies-by-url
                      - search-companies-by-params
                      - search-sales-nav-companies-by-url
                      - search-sales-nav-companies-by-params
                      - similar-companies
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - search-people-by-url
                      - search-people-by-params
                      - search-sales-nav-people-by-url
                      - search-sales-nav-people-by-params
                      - similar-profiles
                      - company-employees
                      - company-decision-makers
                      - get-post-comments
                      - get-post-reactors
                      - get-post-resharers
                      - search-service-providers
                      - search-service-providers-by-url
                      - search-companies-by-url
                      - search-companies-by-params
                      - search-sales-nav-companies-by-url
                      - search-sales-nav-companies-by-params
                      - similar-companies
              additionalProperties: false
            detected_platform:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - linkedin
                    - sales_navigator
                    - recruiter
                ne:
                  type: string
                  enum:
                    - linkedin
                    - sales_navigator
                    - recruiter
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
              additionalProperties: false
            result_kind:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - person
                    - company
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - person
                      - company
              additionalProperties: false
            replay_frequency:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - hourly
                    - daily
                    - weekly
                    - monthly
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - hourly
                      - daily
                      - weekly
                      - monthly
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:true selects the one-shot jobs (no cadence).
            status:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - active
                    - paused
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - active
                      - paused
              additionalProperties: false
            paused_reason:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - manual
                    - too_many_failures
                    - account_unavailable
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - manual
                      - too_many_failures
                      - account_unavailable
                is_null:
                  type: boolean
              additionalProperties: false
              description: Why a paused job stopped. account_unavailable is the only reason the platform lifts by itself.
            mass_action_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:true selects collect-only jobs; eq finds every collector feeding one mass-action.
            next_run_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Due horizon. is_null:true means paused, an exhausted one-shot, or a run already in flight.
            last_run_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            total_new_results:
              type: object
              properties:
                eq:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              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: Omit for live jobs only; send any operator to bring deleted collectors into scope.
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
              - last_run
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
                - updated_at
                - next_run_at
                - last_run_at
                - total_new_results
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinAutoScrapesResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  source_method:
                    type: string
                    enum:
                      - search-people-by-url
                      - search-people-by-params
                      - search-sales-nav-people-by-url
                      - search-sales-nav-people-by-params
                      - similar-profiles
                      - company-employees
                      - company-decision-makers
                      - get-post-comments
                      - get-post-reactors
                      - get-post-resharers
                      - search-service-providers
                      - search-service-providers-by-url
                      - search-companies-by-url
                      - search-companies-by-params
                      - search-sales-nav-companies-by-url
                      - search-sales-nav-companies-by-params
                      - similar-companies
                  source_input:
                    type: object
                    additionalProperties: {}
                  detected_platform:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                  result_kind:
                    type: string
                    enum:
                      - person
                      - company
                  status:
                    type: string
                    enum:
                      - active
                      - paused
                  consecutive_failures:
                    type: number
                  runs_count:
                    type: number
                  total_new_results:
                    type: number
                  title:
                    type: string
                    nullable: true
                  replay_frequency:
                    type: string
                    nullable: true
                    enum:
                      - hourly
                      - daily
                      - weekly
                      - monthly
                  paused_reason:
                    type: string
                    nullable: true
                    enum:
                      - manual
                      - too_many_failures
                      - account_unavailable
                  next_run_at:
                    type: string
                    nullable: true
                  last_run_at:
                    type: string
                    nullable: true
                  mass_action_sid:
                    type: string
                    nullable: true
                  created_by:
                    type: object
                    nullable: true
                    properties:
                      actor_type:
                        type: string
                        enum:
                          - user
                          - support
                          - api_key
                          - system
                          - agent
                      actor_sid:
                        type: string
                        nullable: true
                      team_sid:
                        type: string
                      actor_name:
                        type: string
                        nullable: true
                        description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                      oauth_client_sid:
                        type: string
                        nullable: true
                        description: The acting OAuth client (id_oc_*); null off the OAuth path.
                      reason:
                        type: string
                        nullable: true
                        description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                      permissions:
                        type: object
                        additionalProperties: {}
                        description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                      cluster_id:
                        type: integer
                        nullable: true
                        description: "Internal audit context: the cluster that served the write."
                      trace_id:
                        type: string
                        nullable: true
                        description: "Internal audit context: the trace id of the request that wrote the row."
                    required:
                      - actor_type
                      - actor_sid
                      - team_sid
                      - permissions
                  deleted_by:
                    type: object
                    nullable: true
                    properties:
                      actor_type:
                        type: string
                        enum:
                          - user
                          - support
                          - api_key
                          - system
                          - agent
                      actor_sid:
                        type: string
                        nullable: true
                      team_sid:
                        type: string
                      actor_name:
                        type: string
                        nullable: true
                        description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                      oauth_client_sid:
                        type: string
                        nullable: true
                        description: The acting OAuth client (id_oc_*); null off the OAuth path.
                      reason:
                        type: string
                        nullable: true
                        description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                      permissions:
                        type: object
                        additionalProperties: {}
                        description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                      cluster_id:
                        type: integer
                        nullable: true
                        description: "Internal audit context: the cluster that served the write."
                      trace_id:
                        type: string
                        nullable: true
                        description: "Internal audit context: the trace id of the request that wrote the row."
                    required:
                      - actor_type
                      - actor_sid
                      - team_sid
                      - permissions
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - source_method
                  - source_input
                  - detected_platform
                  - result_kind
                  - status
                  - consecutive_failures
                  - runs_count
                  - total_new_results
                  - title
                  - replay_frequency
                  - paused_reason
                  - next_run_at
                  - last_run_at
                  - mass_action_sid
                  - created_by
                  - deleted_by
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinConnectionInvitationsRequest:
      type: object
      description: Request body of `search_linkedin_connection_invitations`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            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
            nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            linkedin_invitation_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: LinkedIn's own id of the invitation, as a webhook or the wire names it.
            note:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: Exact-match on the accompanying note (is_null:false = invitation carries a note). There is no free-text q on this entity.
            removal_kind:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - accepted
                    - ignored
                    - expired
                ne:
                  type: string
                  enum:
                    - accepted
                    - ignored
                    - expired
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - accepted
                      - ignored
                      - expired
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - accepted
                      - ignored
                      - expired
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:true = pending; eq to split accepted / ignored / expired.
            received_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            last_check_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 } (pending rows)."
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - received_at
                - last_check_at
                - created_at
                - updated_at
                - deleted_at
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinConnectionInvitationsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  ln_member_id:
                    type: string
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  note:
                    type: string
                    nullable: true
                  linkedin_invitation_id:
                    type: string
                    nullable: true
                  shared_secret:
                    type: string
                    nullable: true
                  received_at:
                    type: string
                  last_check_at:
                    type: string
                    nullable: true
                  removal_kind:
                    type: string
                    nullable: true
                    enum:
                      - accepted
                      - ignored
                      - expired
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - note
                  - linkedin_invitation_id
                  - shared_secret
                  - received_at
                  - last_check_at
                  - removal_kind
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinConnectionRequestsRequest:
      type: object
      description: Request body of `search_linkedin_connection_requests`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            ln_id:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              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
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            client_reference:
              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 key the caller gave at send time; exact match, is_null:true = sends made without one.
            removal_kind:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - accepted
                    - withdrawn
                    - expired
                ne:
                  type: string
                  enum:
                    - accepted
                    - withdrawn
                    - expired
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - accepted
                      - withdrawn
                      - expired
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - accepted
                      - withdrawn
                      - expired
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:true = pending; eq to split accepted / withdrawn / expired.
            sent_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            resend_available_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 } (pending rows)."
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - sent_at
                - resend_available_at
                - deleted_at
                - created_at
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinConnectionRequestsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  ln_member_id:
                    type: string
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  note:
                    type: string
                    nullable: true
                  client_reference:
                    type: string
                    nullable: true
                  sent_at:
                    type: string
                    nullable: true
                  invitation_id:
                    type: string
                    nullable: true
                  resend_available_at:
                    type: string
                    nullable: true
                  last_check_at:
                    type: string
                    nullable: true
                  removal_kind:
                    type: string
                    nullable: true
                    enum:
                      - accepted
                      - withdrawn
                      - expired
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - note
                  - client_reference
                  - sent_at
                  - invitation_id
                  - resend_available_at
                  - last_check_at
                  - removal_kind
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinConnectionsRequest:
      type: object
      description: Request body of `search_linkedin_connections`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            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
            nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            q:
              type: string
              description: Full-text LIKE over the contact display name (full_name).
            connected_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            last_check_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            linkedin_connection_request_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:false ⇒ born from one of our outbound requests.
            linkedin_connection_invitation_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:false ⇒ born from an inbound invitation we accepted.
            removal_kind:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - removed
                    - blocked
                ne:
                  type: string
                  enum:
                    - removed
                    - blocked
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - removed
                      - blocked
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - removed
                      - blocked
                is_null:
                  type: boolean
              additionalProperties: false
              description: is_null:true = live row; is_null:false = all churn; eq to split by reason.
            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 rows)."
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
              - linkedin_connection_request
              - linkedin_connection_invitation
              - conversations
              - last_messages
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - connected_at
                - last_check_at
                - created_at
                - updated_at
                - deleted_at
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinConnectionsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  ln_member_id:
                    type: string
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  connected_at:
                    type: string
                    nullable: true
                  linkedin_connection_request_sid:
                    type: string
                    nullable: true
                  linkedin_connection_invitation_sid:
                    type: string
                    nullable: true
                  last_check_at:
                    type: string
                    nullable: true
                  removal_kind:
                    type: string
                    nullable: true
                    enum:
                      - removed
                      - blocked
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - full_name
                  - connected_at
                  - linkedin_connection_request_sid
                  - linkedin_connection_invitation_sid
                  - last_check_at
                  - removal_kind
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: number
            live_count:
              type: number
            removed_count:
              type: number
            blocked_count:
              type: number
            from_request_count:
              type: number
            from_invitation_count:
              type: number
            sync_only_count:
              type: number
            groups:
              type: object
              additionalProperties: {}
          required:
            - total_count
            - live_count
            - removed_count
            - blocked_count
            - from_request_count
            - from_invitation_count
            - sync_only_count
            - groups
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinConversationsRequest:
      type: object
      description: Request body of `search_linkedin_conversations`.
      properties:
        filter:
          type: object
          properties:
            q:
              type: string
              description: Full-text LIKE over nickname (the only free-text column).
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            messenger_type:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - linkedin
                    - sales_navigator
                    - recruiter
                  description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
                ne:
                  type: string
                  enum:
                    - linkedin
                    - sales_navigator
                    - recruiter
                  description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                    description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                    description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
              additionalProperties: false
            conversation_hash:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
              description: "Exact match on LinkedIn's own thread id (the 2-…== value from a messaging URL or a raw payload). THE way to resolve a thread the user named by id into its sid: filter.conversation_hash.eq, never q (which only LIKEs nickname) and never sid (our ln_cv_ space). Unique per (linkedin_account_sid, messenger_type), so pass the account too when the same thread could exist on both surfaces."
            ln_id:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            ln_member_id:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            sn_id:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            recruiter_id:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            recruiter_contract_id:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: The Recruiter contract the thread was synced or sent under (a seat holder with several contracts switches with select_recruiter_contract; each contract is its own inbox). Null off the recruiter surface and on rows synced before 2026-09-19.
            nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            is_muted:
              type: object
              properties:
                eq:
                  type: boolean
                ne:
                  type: boolean
                is_null:
                  type: boolean
              additionalProperties: false
            is_group:
              type: object
              properties:
                eq:
                  type: boolean
                ne:
                  type: boolean
                is_null:
                  type: boolean
              additionalProperties: false
              description: A group chat (2026-09-24). is_null:true finds threads synced before the flag existed, which read as 1:1 until their next sync.
            unread_count:
              type: object
              properties:
                eq:
                  type: integer
                ne:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
                is_null:
                  type: boolean
              additionalProperties: false
              description: The unread-only inbox view is unread_count gt 0. is_null:true finds threads that have never synced the counter.
            event_count:
              type: object
              properties:
                eq:
                  type: integer
                ne:
                  type: integer
                gte:
                  type: integer
                lte:
                  type: integer
                gt:
                  type: integer
                lt:
                  type: integer
              additionalProperties: false
            last_activity_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            last_stored_message_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            last_message_sync_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
            created_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            updated_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            deleted_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
              - last_messages
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - last_activity_at
                - event_count
                - last_message_sync_at
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinConversationsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  conversation_hash:
                    type: string
                    description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
                  messenger_type:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                    description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                    description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
                  nickname:
                    type: string
                    nullable: true
                  participants:
                    type: array
                    nullable: true
                    items:
                      type: object
                      properties:
                        ln_member_id:
                          type: string
                          nullable: true
                        ln_id:
                          type: string
                          nullable: true
                        sn_id:
                          type: string
                          nullable: true
                        recruiter_id:
                          type: string
                          nullable: true
                        nickname:
                          type: string
                          nullable: true
                        full_name:
                          type: string
                          nullable: true
                        headline:
                          type: string
                          nullable: true
                        picture_url:
                          type: string
                          nullable: true
                  is_muted:
                    type: boolean
                    nullable: true
                  unread_count:
                    type: integer
                    nullable: true
                    description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
                  event_count:
                    type: number
                  last_activity_at:
                    type: string
                    nullable: true
                  last_stored_message_at:
                    type: string
                    nullable: true
                  last_message_sync_at:
                    type: string
                    nullable: true
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - conversation_hash
                  - messenger_type
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - recruiter_id
                  - nickname
                  - participants
                  - is_muted
                  - unread_count
                  - event_count
                  - last_activity_at
                  - last_stored_message_at
                  - last_message_sync_at
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinFollowersRequest:
      type: object
      description: Request body of `search_linkedin_followers`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            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
              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
            nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            q:
              type: string
              description: Full-text LIKE over the follower display name (full_name).
            last_check_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            created_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            updated_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            deleted_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_account
              - linkedin_connection
              - linkedin_connection_request
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - created_at
                - last_check_at
                - updated_at
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinFollowersResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  ln_member_id:
                    type: string
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  last_check_at:
                    type: string
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - nickname
                  - full_name
                  - last_check_at
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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: number
            groups:
              type: object
              additionalProperties: {}
          required:
            - total_count
            - groups
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    SearchLinkedinMessagesRequest:
      type: object
      description: Request body of `search_linkedin_messages`.
      properties:
        filter:
          type: object
          properties:
            sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_account_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            linkedin_conversation_sid:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            messenger_type:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - linkedin
                    - sales_navigator
                    - recruiter
                  description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                    description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
              additionalProperties: false
            linkedin_type:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - message
                    - inmail
                    - connection_note
                    - system
                  description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
                ne:
                  type: string
                  enum:
                    - message
                    - inmail
                    - connection_note
                    - system
                  description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - message
                      - inmail
                      - connection_note
                      - system
                    description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - message
                      - inmail
                      - connection_note
                      - system
                    description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
              additionalProperties: false
            type:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - inbox
                    - outbox
                  description: "Direction relative to our account: received / sent."
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - inbox
                      - outbox
                    description: "Direction relative to our account: received / sent."
              additionalProperties: false
            automation:
              type: object
              properties:
                eq:
                  type: string
                  enum:
                    - auto
                    - manual
                    - synced
                  description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
                ne:
                  type: string
                  enum:
                    - auto
                    - manual
                    - synced
                  description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
                in:
                  type: array
                  items:
                    type: string
                    enum:
                      - auto
                      - manual
                      - synced
                    description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
                nin:
                  type: array
                  items:
                    type: string
                    enum:
                      - auto
                      - manual
                      - synced
                    description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
              additionalProperties: false
            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
              additionalProperties: false
            sn_id:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            recruiter_id:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            recruiter_contract_id:
              type: object
              properties:
                eq:
                  type: string
                ne:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                nin:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: The Recruiter contract the thread was synced or sent under (a seat holder with several contracts switches with select_recruiter_contract; each contract is its own inbox). Null off the recruiter surface and on rows synced before 2026-09-19.
            nickname:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
            message_hash:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
              additionalProperties: false
            client_reference:
              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 caller's own key given at send time. The way to ask whether a send landed before repeating it: search by the key you sent."
            subject:
              type: object
              properties:
                eq:
                  type: string
                in:
                  type: array
                  items:
                    type: string
                is_null:
                  type: boolean
              additionalProperties: false
              description: The InMail subject, exact match; is_null:false = every message that carried one. For a text search use q.
            q:
              type: string
              maxLength: 128
              description: "A LIKE (substring, case-insensitive) over message text + InMail subject. Message text only: it does not search contact names."
            sent_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            created_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            updated_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                gt:
                  type: string
                lt:
                  type: string
              additionalProperties: false
            deleted_at:
              type: object
              properties:
                gte:
                  type: string
                lte:
                  type: string
                is_null:
                  type: boolean
              additionalProperties: false
        include:
          type: array
          items:
            type: string
            enum:
              - linkedin_conversation
              - linkedin_account
          description: Relations to eager-load (see entity Includes).
        sort:
          type: object
          properties:
            field:
              type: string
              enum:
                - sent_at
                - created_at
                - updated_at
            direction:
              type: string
              enum:
                - asc
                - desc
              description: Default desc.
          required:
            - field
        page_size:
          type: integer
          minimum: 0
          maximum: 200
          description: 0..200, default 50. page_size=0 = count-only, page_size=1 = getFirst.
        cursor:
          type: string
          nullable: true
          description: Opaque forward cursor from a previous response pagination.next_cursor.
    SearchLinkedinMessagesResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - search
        items:
          type: array
          items:
            type: object
            properties:
              item:
                type: object
                properties:
                  sid:
                    type: string
                  team_sid:
                    type: string
                  linkedin_account_sid:
                    type: string
                  linkedin_conversation_sid:
                    type: string
                  messenger_type:
                    type: string
                    enum:
                      - linkedin
                      - sales_navigator
                      - recruiter
                    description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
                  linkedin_type:
                    type: string
                    enum:
                      - message
                      - inmail
                      - connection_note
                      - system
                    description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
                  type:
                    type: string
                    enum:
                      - inbox
                      - outbox
                    description: "Direction relative to our account: received / sent."
                  automation:
                    type: string
                    enum:
                      - auto
                      - manual
                      - synced
                    description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
                  ln_member_id:
                    type: string
                    nullable: true
                    description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                    description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
                  nickname:
                    type: string
                    nullable: true
                  subject:
                    type: string
                    nullable: true
                  text:
                    type: string
                  client_reference:
                    type: string
                    nullable: true
                  attachments:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        urn:
                          type: string
                          description: digitalmediaAsset URN; the attachment_urn the download tools take.
                        name:
                          type: string
                        content_type:
                          type: string
                        content_url:
                          type: string
                        file_byte_size:
                          type: number
                        file_name:
                          type: string
                          description: "Rows our send verbs wrote: the file name as sent."
                        file_type:
                          type: string
                          description: "Rows our send verbs wrote: the MIME type as sent."
                  reactions:
                    type: array
                    nullable: true
                    items:
                      type: object
                      properties:
                        emoji:
                          type: string
                        count:
                          type: number
                        is_viewer_reacted:
                          type: boolean
                        first_reacted_at:
                          type: string
                          nullable: true
                      required:
                        - emoji
                        - count
                        - is_viewer_reacted
                        - first_reacted_at
                  is_deleted:
                    type: boolean
                  message_hash:
                    type: string
                  sent_at:
                    type: string
                  custom_content:
                    type: object
                    nullable: true
                    additionalProperties: {}
                  created_at:
                    type: string
                  updated_at:
                    type: string
                  deleted_at:
                    type: string
                    nullable: true
                required:
                  - sid
                  - team_sid
                  - linkedin_account_sid
                  - linkedin_conversation_sid
                  - messenger_type
                  - linkedin_type
                  - type
                  - automation
                  - ln_member_id
                  - ln_id
                  - sn_id
                  - recruiter_id
                  - nickname
                  - subject
                  - text
                  - client_reference
                  - attachments
                  - reactions
                  - is_deleted
                  - message_hash
                  - sent_at
                  - custom_content
                  - created_at
                  - updated_at
                  - deleted_at
              included:
                type: object
                additionalProperties: {}
            required:
              - item
              - included
        pagination:
          type: object
          properties:
            next_cursor:
              type: string
              nullable: true
            has_more:
              type: boolean
            total_count:
              type: integer
              nullable: true
          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
              nullable: true
              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
              nullable: true
              description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.
          required:
            - trace_id
            - span_id
            - timestamp
            - duration_ms
        counts:
          type: object
          additionalProperties: {}
      required:
        - success
        - operation
        - items
        - pagination
        - applied_filters
        - includes
        - meta
    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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              properties:
                contract_id:
                  type: string
                  description: "The ts_contract number: what select_linkedin_account_recruiter_contract takes. Never a urn."
                contract_urn:
                  type: string
                  nullable: true
                  description: urn:li:ts_contract:N, verbatim.
                contract_name:
                  type: string
                  nullable: true
                category:
                  type: string
                  nullable: true
                  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
                  nullable: true
                sso_enabled:
                  type: boolean
                  nullable: true
                application_instance_urn:
                  type: string
                  nullable: true
                enterprise_profile_urn:
                  type: string
                  nullable: true
                enterprise_account_id:
                  type: string
                  nullable: true
                  description: Parsed from enterprise_profile_urn; null when its shape did not match.
                enterprise_profile_id:
                  type: string
                  nullable: true
              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
              nullable: true
              description: The ts_seat under the bound contract, off LinkedIn's answer; null when the answer carried none.
            profile_id:
              type: string
              nullable: true
              description: The talent (AEMAA…) id of the recruiter under the bound contract.
            redirect_url:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
    SendLinkedinConnectionRequestRequest:
      type: object
      description: Request body of `send_linkedin_connection_request`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…) of the sending account.
        profile_id:
          type: string
          maxLength: 128
          description: "Target URN: ln_id (ACoAA…) OR sn_id (ACwAA…); both accepted as profile_id. Exactly one of profile_id / public_identifier."
        public_identifier:
          type: string
          maxLength: 2048
          description: "The person's vanity slug (jane-doe) or their linkedin.com/in/<slug> URL, when that is all you have (a signup, a CRM). Resolved server-side to the URN: the team's own rows first (connections, invitations, followers), then the corpus, then a lite-profile read on the sender (spends enrichment, one extra browser call, cached afterwards). Exactly one of profile_id / public_identifier."
        note:
          type: string
          nullable: true
          maxLength: 300
          description: "Invitation note; server caps at 200 chars when the sender is not premium. Over the cap it is 422 unless allow_no_note_fallback is set. Sent verbatim: the platform renders no merge fields, a {{first_name}} goes out as those braces."
        allow_no_note_fallback:
          type: boolean
          description: "Default false. When the note is longer than the sender's cap (200 free / 300 premium), send the invite WITHOUT it instead of refusing 422, for campaigns where reaching the person beats personalizing. The response says which happened in result.note_fallback_used, and the stored row carries note=null, so a follow-up does not assume a note the prospect never saw. Scope, stated plainly: this covers the length cap, which the server evaluates itself. LinkedIn's own monthly with-note quota is only visible at send time and arrives untyped, so a refusal there still fails the call rather than being retried blind (a retry after an ambiguous send can invite the person twice)."
        client_reference:
          type: string
          nullable: true
          maxLength: 255
          description: "Your key for this ONE invitation (max 255, byte for byte): one key per invitation, the same key on every repeat of it. The key and the person (the member the URN decodes to) are one invitation whatever its note says, and a repeat never goes out twice: it answers 200 with the request the first send stored (result.idempotent_replay, result.content_differs when this note differs) or 409 naming error.context.send_outcome (in_flight, unknown with retry_after and send_decisive_at, or sent; not_sent with blocking_activity_log_sid when another invitation to the person is on its way or in doubt). Without a key the same note to the same person counts as a repeat for an hour after it went out. Stored on the row and searchable; check_linkedin_connection_request_sent asks by it."
        confirmed_not_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS invitation is not on LinkedIn: its activity_log_sid (ln_al_...), from the 409 or check_linkedin_connection_request_sent, given only after someone looked at the account's sent invitations. Taken once the attempt can no longer land (before that: 409 send_outcome_unknown, waiting_for may_still_land, retry_after and send_decisive_at that moment): it settles that attempt not_sent and this request goes out. Moot when the attempt is no longer in doubt; another invitation's sid is 422 not_this_message."
        confirmed_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS invitation IS on LinkedIn: its activity_log_sid, as for confirmed_not_sent (never both). Taken at once; it settles the attempt sent and sends nothing: the answer is 409 concurrent_send_in_flight with send_outcome sent, or 200 with the request once it is stored. Another invitation's sid is 422 not_this_message; an attempt already proved not sent is 409 confirmed_sent_contradicts."
      required:
        - linkedin_account_sid
    SendLinkedinConnectionRequestResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            ln_member_id:
              type: string
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            note:
              type: string
              nullable: true
            client_reference:
              type: string
              nullable: true
            sent_at:
              type: string
              nullable: true
            invitation_id:
              type: string
              nullable: true
            resend_available_at:
              type: string
              nullable: true
            last_check_at:
              type: string
              nullable: true
            removal_kind:
              type: string
              nullable: true
              enum:
                - accepted
                - withdrawn
                - expired
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - ln_member_id
            - ln_id
            - sn_id
            - nickname
            - note
            - client_reference
            - sent_at
            - invitation_id
            - resend_available_at
            - last_check_at
            - removal_kind
            - 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
              nullable: true
              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
              nullable: true
              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
    SendLinkedinInmailRequest:
      type: object
      description: Request body of `send_linkedin_inmail`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
        ln_id:
          type: string
          nullable: true
          maxLength: 128
          description: Regular-profile URN (ACoAA…); one URN required.
        sn_id:
          type: string
          nullable: true
          maxLength: 64
          description: Sales Navigator URN; interchangeable with ln_id.
        subject:
          type: string
          minLength: 1
          maxLength: 200
          description: REQUIRED InMail subject; 1..200 chars.
        text:
          type: string
          minLength: 1
          maxLength: 1900
          description: "InMail body; 1..1900 chars. Sent verbatim: the platform renders no merge fields, a {{first_name}} goes out as those braces."
        attachments:
          type: array
          items:
            type: object
            properties:
              file_base64:
                type: string
                minLength: 1
                description: "The file itself: a data:<mime>;base64,<...> URL or bare base64. Exactly one of file_base64 / file_url."
              file_url:
                type: string
                maxLength: 2048
                format: uri
                description: "An https URL of the file, downloaded by the backend and encoded for you (public hosts on port 443 only, no credentials in the URL; a request_media_upload file_url works once uploaded). Exactly one of file_base64 / file_url. Refused 422 on this member before anything is dispatched: attachment_url_invalid (not https, a port other than 443, credentials), attachment_url_host_forbidden (a private or reserved address), attachment_fetch_failed, attachments_too_large."
              file_name:
                type: string
                minLength: 1
                maxLength: 255
                description: Display filename shown to the recipient. Derived from the URL path when omitted on the file_url arm.
              file_type:
                type: string
                minLength: 1
                maxLength: 255
                description: "MIME type. Read off the data: prefix or the fetched Content-Type when omitted."
              file_byte_size:
                type: integer
                minimum: 1
                description: "Advisory only: the backend measures the real size and sends that."
            description: Exactly one of file_base64 / file_url per item. Decoded bytes across ALL attachments of one send may not exceed 35 MB, derived from the node's own 50 MB body limit and base64's 4/3 inflation; over it the send is refused with attachments_too_large before a browser dispatch is spent.
          description: Exactly one of file_base64 / file_url per item; 35 MB decoded total per send. An item whose file_type is video/* is delivered as a playable video in the thread; any other type arrives as a generic file attachment.
        stop_if_replied_after:
          type: string
          nullable: true
          format: date-time
          description: "ISO 8601 UTC moment. When given, the thread is read from LinkedIn before the send and the send is refused with 409 replied if the person wrote after this moment (context.linkedin_message_sid names their message: read it before you send again); 503 reply_check_unavailable when that read fails, nothing sent, retry after retry_after. Omit or null to send regardless."
        client_reference:
          type: string
          nullable: true
          maxLength: 255
          description: "Your key for this ONE message (max 255, byte for byte): one key per message, the same key on every repeat of it. The key and its place (the thread, else the person) are one message whatever it says, and a repeat never goes out twice: it answers 200 with the row the first send stored (result.idempotent_replay, result.content_differs when this request says something else) or 409 naming error.context.send_outcome (in_flight, unknown with retry_after and send_decisive_at, or sent; not_sent with blocking_activity_log_sid when another message holds the place). The same key at another place is another message. Without a key the same words to the same place count as a repeat for an hour after they went out. Stored on the row and searchable; check_linkedin_message_sent asks by it."
        confirmed_not_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message is not on LinkedIn: its activity_log_sid (ln_al_...), from the 409 or check_linkedin_message_sent, given only after someone looked at the conversation. Taken once the attempt can no longer land (before that: 409 send_outcome_unknown, waiting_for may_still_land, retry_after and send_decisive_at that moment): it settles that attempt not_sent and this request goes out. Moot when the attempt is no longer in doubt; another message's sid is 422 not_this_message."
        confirmed_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message IS on LinkedIn: its activity_log_sid, as for confirmed_not_sent (never both). Taken at once; it settles the attempt sent and sends nothing: the answer is 409 concurrent_send_in_flight with send_outcome sent, or 200 with the row once it is stored. Another message's sid is 422 not_this_message; an attempt already proved not sent is 409 confirmed_sent_contradicts."
      required:
        - linkedin_account_sid
        - subject
        - text
    SendLinkedinInmailResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            linkedin_conversation_sid:
              type: string
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
            linkedin_type:
              type: string
              enum:
                - message
                - inmail
                - connection_note
                - system
              description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
            type:
              type: string
              enum:
                - inbox
                - outbox
              description: "Direction relative to our account: received / sent."
            automation:
              type: string
              enum:
                - auto
                - manual
                - synced
              description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
            ln_member_id:
              type: string
              nullable: true
              description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
            nickname:
              type: string
              nullable: true
            subject:
              type: string
              nullable: true
            text:
              type: string
            client_reference:
              type: string
              nullable: true
            attachments:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  urn:
                    type: string
                    description: digitalmediaAsset URN; the attachment_urn the download tools take.
                  name:
                    type: string
                  content_type:
                    type: string
                  content_url:
                    type: string
                  file_byte_size:
                    type: number
                  file_name:
                    type: string
                    description: "Rows our send verbs wrote: the file name as sent."
                  file_type:
                    type: string
                    description: "Rows our send verbs wrote: the MIME type as sent."
            reactions:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  emoji:
                    type: string
                  count:
                    type: number
                  is_viewer_reacted:
                    type: boolean
                  first_reacted_at:
                    type: string
                    nullable: true
                required:
                  - emoji
                  - count
                  - is_viewer_reacted
                  - first_reacted_at
            is_deleted:
              type: boolean
            message_hash:
              type: string
            sent_at:
              type: string
            custom_content:
              type: object
              nullable: true
              additionalProperties: {}
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - linkedin_conversation_sid
            - messenger_type
            - linkedin_type
            - type
            - automation
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - subject
            - text
            - client_reference
            - attachments
            - reactions
            - is_deleted
            - message_hash
            - sent_at
            - custom_content
            - 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
              nullable: true
              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
              nullable: true
              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
    SendLinkedinMessageRequest:
      type: object
      description: Request body of `send_linkedin_message`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
        linkedin_conversation_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_cv_
          description: "Existing basic-messenger thread; provide this OR a profile URN. Our sid only: a raw LinkedIn 2-…== thread id is NOT accepted here, resolve it first with search_linkedin_conversations filter.conversation_hash.eq."
        ln_id:
          type: string
          nullable: true
          maxLength: 128
          description: Regular-profile URN (ACoAA…) for a new thread.
        sn_id:
          type: string
          nullable: true
          maxLength: 64
          description: Sales Navigator URN (ACwAA…); interchangeable with ln_id.
        public_identifier:
          type: string
          nullable: true
          maxLength: 2048
          description: "For a new thread when all you have is the person's vanity slug or linkedin.com/in/<slug> URL: resolved server-side to the URN (own rows, then the corpus, then a lite-profile read on the sender that spends enrichment). One addressing form per call: linkedin_conversation_sid, ln_id / sn_id, or public_identifier."
        text:
          type: string
          minLength: 1
          maxLength: 8000
          description: "Message body; 1..8000 chars. Sent verbatim: the platform renders no merge fields, a {{first_name}} goes out as those braces."
        attachments:
          type: array
          items:
            type: object
            properties:
              file_base64:
                type: string
                minLength: 1
                description: "The file itself: a data:<mime>;base64,<...> URL or bare base64. Exactly one of file_base64 / file_url."
              file_url:
                type: string
                maxLength: 2048
                format: uri
                description: "An https URL of the file, downloaded by the backend and encoded for you (public hosts on port 443 only, no credentials in the URL; a request_media_upload file_url works once uploaded). Exactly one of file_base64 / file_url. Refused 422 on this member before anything is dispatched: attachment_url_invalid (not https, a port other than 443, credentials), attachment_url_host_forbidden (a private or reserved address), attachment_fetch_failed, attachments_too_large."
              file_name:
                type: string
                minLength: 1
                maxLength: 255
                description: Display filename shown to the recipient. Derived from the URL path when omitted on the file_url arm.
              file_type:
                type: string
                minLength: 1
                maxLength: 255
                description: "MIME type. Read off the data: prefix or the fetched Content-Type when omitted."
              file_byte_size:
                type: integer
                minimum: 1
                description: "Advisory only: the backend measures the real size and sends that."
            description: Exactly one of file_base64 / file_url per item. Decoded bytes across ALL attachments of one send may not exceed 35 MB, derived from the node's own 50 MB body limit and base64's 4/3 inflation; over it the send is refused with attachments_too_large before a browser dispatch is spent.
          description: Exactly one of file_base64 / file_url per item; 35 MB decoded total per send. An item whose file_type is video/* is delivered as a playable video in the thread; any other type arrives as a generic file attachment.
        stop_if_replied_after:
          type: string
          nullable: true
          format: date-time
          description: "ISO 8601 UTC moment. When given, the thread is read from LinkedIn before the send and the send is refused with 409 replied if the person wrote after this moment (context.linkedin_message_sid names their message: read it before you send again); 503 reply_check_unavailable when that read fails, nothing sent, retry after retry_after. Omit or null to send regardless."
        client_reference:
          type: string
          nullable: true
          maxLength: 255
          description: "Your key for this ONE message (max 255, byte for byte): one key per message, the same key on every repeat of it. The key and its place (the thread, else the person) are one message whatever it says, and a repeat never goes out twice: it answers 200 with the row the first send stored (result.idempotent_replay, result.content_differs when this request says something else) or 409 naming error.context.send_outcome (in_flight, unknown with retry_after and send_decisive_at, or sent; not_sent with blocking_activity_log_sid when another message holds the place). The same key at another place is another message. Without a key the same words to the same place count as a repeat for an hour after they went out. Stored on the row and searchable; check_linkedin_message_sent asks by it."
        confirmed_not_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message is not on LinkedIn: its activity_log_sid (ln_al_...), from the 409 or check_linkedin_message_sent, given only after someone looked at the conversation. Taken once the attempt can no longer land (before that: 409 send_outcome_unknown, waiting_for may_still_land, retry_after and send_decisive_at that moment): it settles that attempt not_sent and this request goes out. Moot when the attempt is no longer in doubt; another message's sid is 422 not_this_message."
        confirmed_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message IS on LinkedIn: its activity_log_sid, as for confirmed_not_sent (never both). Taken at once; it settles the attempt sent and sends nothing: the answer is 409 concurrent_send_in_flight with send_outcome sent, or 200 with the row once it is stored. Another message's sid is 422 not_this_message; an attempt already proved not sent is 409 confirmed_sent_contradicts."
      required:
        - linkedin_account_sid
        - text
    SendLinkedinMessageResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            linkedin_conversation_sid:
              type: string
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
            linkedin_type:
              type: string
              enum:
                - message
                - inmail
                - connection_note
                - system
              description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
            type:
              type: string
              enum:
                - inbox
                - outbox
              description: "Direction relative to our account: received / sent."
            automation:
              type: string
              enum:
                - auto
                - manual
                - synced
              description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
            ln_member_id:
              type: string
              nullable: true
              description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
            nickname:
              type: string
              nullable: true
            subject:
              type: string
              nullable: true
            text:
              type: string
            client_reference:
              type: string
              nullable: true
            attachments:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  urn:
                    type: string
                    description: digitalmediaAsset URN; the attachment_urn the download tools take.
                  name:
                    type: string
                  content_type:
                    type: string
                  content_url:
                    type: string
                  file_byte_size:
                    type: number
                  file_name:
                    type: string
                    description: "Rows our send verbs wrote: the file name as sent."
                  file_type:
                    type: string
                    description: "Rows our send verbs wrote: the MIME type as sent."
            reactions:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  emoji:
                    type: string
                  count:
                    type: number
                  is_viewer_reacted:
                    type: boolean
                  first_reacted_at:
                    type: string
                    nullable: true
                required:
                  - emoji
                  - count
                  - is_viewer_reacted
                  - first_reacted_at
            is_deleted:
              type: boolean
            message_hash:
              type: string
            sent_at:
              type: string
            custom_content:
              type: object
              nullable: true
              additionalProperties: {}
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - linkedin_conversation_sid
            - messenger_type
            - linkedin_type
            - type
            - automation
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - subject
            - text
            - client_reference
            - attachments
            - reactions
            - is_deleted
            - message_hash
            - sent_at
            - custom_content
            - 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
              nullable: true
              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
              nullable: true
              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
    SendLinkedinRecruiterMessageRequest:
      type: object
      description: Request body of `send_linkedin_recruiter_message`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
        linkedin_conversation_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_cv_
          description: Existing recruiter thread (messenger_type='recruiter'); provide this OR a recipient. A reply dispatches with the thread's own counterpart as the recipient.
        recruiter_id:
          type: string
          nullable: true
          maxLength: 64
          description: The recipient's Recruiter (talent) profile id (AEMAA…), from a recruiter thread's recruiter_id or participants[].recruiter_id. New-thread mode.
        ln_id:
          type: string
          nullable: true
          maxLength: 128
          description: A regular-profile URN (ACoAA…) for a new thread; the wire resolves it too.
        sn_id:
          type: string
          nullable: true
          maxLength: 64
          description: A Sales Navigator URN (ACwAA…) for a new thread; the wire resolves it too.
        subject:
          type: string
          minLength: 1
          maxLength: 200
          description: InMail subject; 1..200 chars, required on both wires.
        text:
          type: string
          minLength: 1
          maxLength: 1900
          description: "InMail body; 1..1900 chars, \\n line breaks. Sent verbatim: the platform renders no merge fields, a {{first_name}} goes out as those braces."
        attributes:
          type: array
          items:
            type: object
            properties:
              start:
                type: integer
                minimum: 0
                description: Offset into text in UTF-16 code units (JS String offsets).
              length:
                type: integer
                minimum: 1
                description: Run length in UTF-16 code units; start + length must fit inside text.
              kind:
                type: object
                additionalProperties: {}
                description: 'The formatting, an object with exactly one key: {"bold":{}}, {"italic":{}}, {"listItem":{}}, {"list":{"ordered":false}}, {"hyperlink":{"url":"https://..."}}.'
            required:
              - start
              - length
              - kind
          maxItems: 200
          description: "Rich-text runs over text. NEW THREAD ONLY: a reply with attributes is refused 422 attributes_not_supported_in_thread."
        client_reference:
          type: string
          nullable: true
          maxLength: 255
          description: "Your key for this ONE message (max 255, byte for byte): one key per message, the same key on every repeat of it. The key and its place (the thread, else the person) are one message whatever it says, and a repeat never goes out twice: it answers 200 with the row the first send stored (result.idempotent_replay, result.content_differs when this request says something else) or 409 naming error.context.send_outcome (in_flight, unknown with retry_after and send_decisive_at, or sent; not_sent with blocking_activity_log_sid when another message holds the place). The same key at another place is another message. Without a key the same words to the same place count as a repeat for an hour after they went out. Stored on the row and searchable; check_linkedin_message_sent asks by it."
        confirmed_not_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message is not on LinkedIn: its activity_log_sid (ln_al_...), from the 409 or check_linkedin_message_sent, given only after someone looked at the conversation. Taken once the attempt can no longer land (before that: 409 send_outcome_unknown, waiting_for may_still_land, retry_after and send_decisive_at that moment): it settles that attempt not_sent and this request goes out. Moot when the attempt is no longer in doubt; another message's sid is 422 not_this_message."
        confirmed_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message IS on LinkedIn: its activity_log_sid, as for confirmed_not_sent (never both). Taken at once; it settles the attempt sent and sends nothing: the answer is 409 concurrent_send_in_flight with send_outcome sent, or 200 with the row once it is stored. Another message's sid is 422 not_this_message; an attempt already proved not sent is 409 confirmed_sent_contradicts."
      required:
        - linkedin_account_sid
        - subject
        - text
    SendLinkedinRecruiterMessageResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            linkedin_conversation_sid:
              type: string
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
            linkedin_type:
              type: string
              enum:
                - message
                - inmail
                - connection_note
                - system
              description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
            type:
              type: string
              enum:
                - inbox
                - outbox
              description: "Direction relative to our account: received / sent."
            automation:
              type: string
              enum:
                - auto
                - manual
                - synced
              description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
            ln_member_id:
              type: string
              nullable: true
              description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
            nickname:
              type: string
              nullable: true
            subject:
              type: string
              nullable: true
            text:
              type: string
            client_reference:
              type: string
              nullable: true
            attachments:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  urn:
                    type: string
                    description: digitalmediaAsset URN; the attachment_urn the download tools take.
                  name:
                    type: string
                  content_type:
                    type: string
                  content_url:
                    type: string
                  file_byte_size:
                    type: number
                  file_name:
                    type: string
                    description: "Rows our send verbs wrote: the file name as sent."
                  file_type:
                    type: string
                    description: "Rows our send verbs wrote: the MIME type as sent."
            reactions:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  emoji:
                    type: string
                  count:
                    type: number
                  is_viewer_reacted:
                    type: boolean
                  first_reacted_at:
                    type: string
                    nullable: true
                required:
                  - emoji
                  - count
                  - is_viewer_reacted
                  - first_reacted_at
            is_deleted:
              type: boolean
            message_hash:
              type: string
            sent_at:
              type: string
            custom_content:
              type: object
              nullable: true
              additionalProperties: {}
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - linkedin_conversation_sid
            - messenger_type
            - linkedin_type
            - type
            - automation
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - subject
            - text
            - client_reference
            - attachments
            - reactions
            - is_deleted
            - message_hash
            - sent_at
            - custom_content
            - 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
              nullable: true
              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
              nullable: true
              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
    SendLinkedinSalesNavMessageRequest:
      type: object
      description: Request body of `send_linkedin_sales_nav_message`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
        linkedin_conversation_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_cv_
          description: Existing SN thread (messenger_type='sales_navigator'); provide this OR a profile URN.
        ln_id:
          type: string
          nullable: true
          maxLength: 128
          description: Regular-profile URN for a new SN thread.
        sn_id:
          type: string
          nullable: true
          maxLength: 64
          description: Sales Navigator URN (preferred on the SN surface); interchangeable with ln_id.
        text:
          type: string
          minLength: 1
          maxLength: 8000
          description: "Message body; 1..8000 chars. Sent verbatim: the platform renders no merge fields, a {{first_name}} goes out as those braces."
        attachments:
          type: array
          items:
            type: object
            properties:
              file_base64:
                type: string
                minLength: 1
                description: "The file itself: a data:<mime>;base64,<...> URL or bare base64. Exactly one of file_base64 / file_url."
              file_url:
                type: string
                maxLength: 2048
                format: uri
                description: "An https URL of the file, downloaded by the backend and encoded for you (public hosts on port 443 only, no credentials in the URL; a request_media_upload file_url works once uploaded). Exactly one of file_base64 / file_url. Refused 422 on this member before anything is dispatched: attachment_url_invalid (not https, a port other than 443, credentials), attachment_url_host_forbidden (a private or reserved address), attachment_fetch_failed, attachments_too_large."
              file_name:
                type: string
                minLength: 1
                maxLength: 255
                description: Display filename shown to the recipient. Derived from the URL path when omitted on the file_url arm.
              file_type:
                type: string
                minLength: 1
                maxLength: 255
                description: "MIME type. Read off the data: prefix or the fetched Content-Type when omitted."
              file_byte_size:
                type: integer
                minimum: 1
                description: "Advisory only: the backend measures the real size and sends that."
            description: Exactly one of file_base64 / file_url per item. Decoded bytes across ALL attachments of one send may not exceed 35 MB, derived from the node's own 50 MB body limit and base64's 4/3 inflation; over it the send is refused with attachments_too_large before a browser dispatch is spent.
          description: Exactly one of file_base64 / file_url per item; 35 MB decoded total per send.
        client_reference:
          type: string
          nullable: true
          maxLength: 255
          description: "Your key for this ONE message (max 255, byte for byte): one key per message, the same key on every repeat of it. The key and its place (the thread, else the person) are one message whatever it says, and a repeat never goes out twice: it answers 200 with the row the first send stored (result.idempotent_replay, result.content_differs when this request says something else) or 409 naming error.context.send_outcome (in_flight, unknown with retry_after and send_decisive_at, or sent; not_sent with blocking_activity_log_sid when another message holds the place). The same key at another place is another message. Without a key the same words to the same place count as a repeat for an hour after they went out. Stored on the row and searchable; check_linkedin_message_sent asks by it."
        confirmed_not_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message is not on LinkedIn: its activity_log_sid (ln_al_...), from the 409 or check_linkedin_message_sent, given only after someone looked at the conversation. Taken once the attempt can no longer land (before that: 409 send_outcome_unknown, waiting_for may_still_land, retry_after and send_decisive_at that moment): it settles that attempt not_sent and this request goes out. Moot when the attempt is no longer in doubt; another message's sid is 422 not_this_message."
        confirmed_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message IS on LinkedIn: its activity_log_sid, as for confirmed_not_sent (never both). Taken at once; it settles the attempt sent and sends nothing: the answer is 409 concurrent_send_in_flight with send_outcome sent, or 200 with the row once it is stored. Another message's sid is 422 not_this_message; an attempt already proved not sent is 409 confirmed_sent_contradicts."
      required:
        - linkedin_account_sid
        - text
    SendLinkedinSalesNavMessageResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            linkedin_conversation_sid:
              type: string
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
            linkedin_type:
              type: string
              enum:
                - message
                - inmail
                - connection_note
                - system
              description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
            type:
              type: string
              enum:
                - inbox
                - outbox
              description: "Direction relative to our account: received / sent."
            automation:
              type: string
              enum:
                - auto
                - manual
                - synced
              description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
            ln_member_id:
              type: string
              nullable: true
              description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
            nickname:
              type: string
              nullable: true
            subject:
              type: string
              nullable: true
            text:
              type: string
            client_reference:
              type: string
              nullable: true
            attachments:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  urn:
                    type: string
                    description: digitalmediaAsset URN; the attachment_urn the download tools take.
                  name:
                    type: string
                  content_type:
                    type: string
                  content_url:
                    type: string
                  file_byte_size:
                    type: number
                  file_name:
                    type: string
                    description: "Rows our send verbs wrote: the file name as sent."
                  file_type:
                    type: string
                    description: "Rows our send verbs wrote: the MIME type as sent."
            reactions:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  emoji:
                    type: string
                  count:
                    type: number
                  is_viewer_reacted:
                    type: boolean
                  first_reacted_at:
                    type: string
                    nullable: true
                required:
                  - emoji
                  - count
                  - is_viewer_reacted
                  - first_reacted_at
            is_deleted:
              type: boolean
            message_hash:
              type: string
            sent_at:
              type: string
            custom_content:
              type: object
              nullable: true
              additionalProperties: {}
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - linkedin_conversation_sid
            - messenger_type
            - linkedin_type
            - type
            - automation
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - subject
            - text
            - client_reference
            - attachments
            - reactions
            - is_deleted
            - message_hash
            - sent_at
            - custom_content
            - 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
              nullable: true
              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
              nullable: true
              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
    SendLinkedinVoiceMessageRequest:
      type: object
      description: Request body of `send_linkedin_voice_message`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
        linkedin_conversation_sid:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_cv_
          description: Existing basic-messenger thread; provide this OR a profile URN.
        ln_id:
          type: string
          nullable: true
          maxLength: 128
          description: Regular-profile URN for a new thread.
        sn_id:
          type: string
          nullable: true
          maxLength: 64
          description: Sales Navigator URN; interchangeable with ln_id.
        audio:
          type: object
          properties:
            url:
              type: string
              description: "An https URL of the audio file, downloaded by the backend (public hosts on port 443 only, no credentials in the URL, up to 32 MB before normalization). Refused 422 before anything is dispatched: audio_url_invalid (not https, a port other than 443, credentials), audio_url_host_forbidden (a private or reserved address), audio_fetch_failed, audio_too_large."
            base64:
              type: string
              description: Inline payload (~15 MB cap pre-normalization).
          description: Exactly one of url / base64; normalized server-side to AAC/m4a ≤ 60 s.
        client_reference:
          type: string
          nullable: true
          maxLength: 255
          description: "Your key for this ONE message (max 255, byte for byte): one key per message, the same key on every repeat of it. The key and its place (the thread, else the person) are one message whatever it says, and a repeat never goes out twice: it answers 200 with the row the first send stored (result.idempotent_replay, result.content_differs when this request says something else) or 409 naming error.context.send_outcome (in_flight, unknown with retry_after and send_decisive_at, or sent; not_sent with blocking_activity_log_sid when another message holds the place). The same key at another place is another message. Without a key the same words to the same place count as a repeat for an hour after they went out. Stored on the row and searchable; check_linkedin_message_sent asks by it."
        confirmed_not_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message is not on LinkedIn: its activity_log_sid (ln_al_...), from the 409 or check_linkedin_message_sent, given only after someone looked at the conversation. Taken once the attempt can no longer land (before that: 409 send_outcome_unknown, waiting_for may_still_land, retry_after and send_decisive_at that moment): it settles that attempt not_sent and this request goes out. Moot when the attempt is no longer in doubt; another message's sid is 422 not_this_message."
        confirmed_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message IS on LinkedIn: its activity_log_sid, as for confirmed_not_sent (never both). Taken at once; it settles the attempt sent and sends nothing: the answer is 409 concurrent_send_in_flight with send_outcome sent, or 200 with the row once it is stored. Another message's sid is 422 not_this_message; an attempt already proved not sent is 409 confirmed_sent_contradicts."
      required:
        - linkedin_account_sid
        - audio
    SendLinkedinVoiceMessageResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            linkedin_conversation_sid:
              type: string
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
            linkedin_type:
              type: string
              enum:
                - message
                - inmail
                - connection_note
                - system
              description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
            type:
              type: string
              enum:
                - inbox
                - outbox
              description: "Direction relative to our account: received / sent."
            automation:
              type: string
              enum:
                - auto
                - manual
                - synced
              description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
            ln_member_id:
              type: string
              nullable: true
              description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
            nickname:
              type: string
              nullable: true
            subject:
              type: string
              nullable: true
            text:
              type: string
            client_reference:
              type: string
              nullable: true
            attachments:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  urn:
                    type: string
                    description: digitalmediaAsset URN; the attachment_urn the download tools take.
                  name:
                    type: string
                  content_type:
                    type: string
                  content_url:
                    type: string
                  file_byte_size:
                    type: number
                  file_name:
                    type: string
                    description: "Rows our send verbs wrote: the file name as sent."
                  file_type:
                    type: string
                    description: "Rows our send verbs wrote: the MIME type as sent."
            reactions:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  emoji:
                    type: string
                  count:
                    type: number
                  is_viewer_reacted:
                    type: boolean
                  first_reacted_at:
                    type: string
                    nullable: true
                required:
                  - emoji
                  - count
                  - is_viewer_reacted
                  - first_reacted_at
            is_deleted:
              type: boolean
            message_hash:
              type: string
            sent_at:
              type: string
            custom_content:
              type: object
              nullable: true
              additionalProperties: {}
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - linkedin_conversation_sid
            - messenger_type
            - linkedin_type
            - type
            - automation
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - subject
            - text
            - client_reference
            - attachments
            - reactions
            - is_deleted
            - message_hash
            - sent_at
            - custom_content
            - 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
              nullable: true
              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
              nullable: true
              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
    SetLinkedinAccountLabelRequest:
      type: object
      description: Request body of `set_linkedin_account_label`.
      properties:
        label:
          type: string
          nullable: true
          maxLength: 255
          description: "The owning team's private tag on the sender; null clears it. Required: send the field on every call."
      required:
        - label
    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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    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
          nullable: true
          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
          nullable: true
          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
          nullable: true
          maxLength: 2000
          description: LinkedIn's cap is 2000.
        skills:
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 100
          description: Skill names, or ProfileSkill:<n> 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.
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              description: The toast LinkedIn showed, when it showed one.
            position_id_source:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
    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/<slug>) 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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              properties: {}
              description: The page's form as read BEFORE the write; null when there was no page.
            page_url:
              type: string
              nullable: true
              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
              nullable: true
              description: The page's vanity slug out of page_url, what an unpublish takes; null when the answer carried none.
            share_text:
              type: string
              nullable: true
              description: The share-box text LinkedIn pre-fills after a save, when it offers one.
            ok:
              type: boolean
            message:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    SetLinkedinAutoScrapeMassActionRequest:
      type: object
      description: Request body of `set_linkedin_auto_scrape_mass_action`.
      properties:
        mass_action_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ma_ac_
          description: Mass-action sid (ma_ac_...) authored beforehand with preview_mass_action then create_mass_action.
      required:
        - mass_action_sid
    SetLinkedinAutoScrapeMassActionResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            source_method:
              type: string
              enum:
                - search-people-by-url
                - search-people-by-params
                - search-sales-nav-people-by-url
                - search-sales-nav-people-by-params
                - similar-profiles
                - company-employees
                - company-decision-makers
                - get-post-comments
                - get-post-reactors
                - get-post-resharers
                - search-service-providers
                - search-service-providers-by-url
                - search-companies-by-url
                - search-companies-by-params
                - search-sales-nav-companies-by-url
                - search-sales-nav-companies-by-params
                - similar-companies
            source_input:
              type: object
              additionalProperties: {}
            detected_platform:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
            result_kind:
              type: string
              enum:
                - person
                - company
            status:
              type: string
              enum:
                - active
                - paused
            consecutive_failures:
              type: number
            runs_count:
              type: number
            total_new_results:
              type: number
            title:
              type: string
              nullable: true
            replay_frequency:
              type: string
              nullable: true
              enum:
                - hourly
                - daily
                - weekly
                - monthly
            paused_reason:
              type: string
              nullable: true
              enum:
                - manual
                - too_many_failures
                - account_unavailable
            next_run_at:
              type: string
              nullable: true
            last_run_at:
              type: string
              nullable: true
            mass_action_sid:
              type: string
              nullable: true
            created_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - source_method
            - source_input
            - detected_platform
            - result_kind
            - status
            - consecutive_failures
            - runs_count
            - total_new_results
            - title
            - replay_frequency
            - paused_reason
            - next_run_at
            - last_run_at
            - mass_action_sid
            - created_by
            - deleted_by
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            mass_action:
              type: object
              additionalProperties: {}
              description: The linked mass-action row, embedded for confirmation.
            previous_mass_action_sid:
              type: string
              nullable: true
              description: What the slot held before. It keeps draining its already-enrolled items; null on the first link.
          required:
            - mass_action
            - previous_mass_action_sid
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    StartLinkedinGroupConversationRequest:
      type: object
      description: Request body of `start_linkedin_group_conversation`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
        attendees:
          type: array
          items:
            type: object
            properties:
              ln_id:
                type: string
                nullable: true
                maxLength: 128
                description: Regular-profile URN.
              sn_id:
                type: string
                nullable: true
                maxLength: 64
                description: Sales Navigator URN; interchangeable with ln_id.
          minItems: 2
          maxItems: 20
          description: 2..20 other participants; each needs a URN.
        text:
          type: string
          minLength: 1
          maxLength: 8000
          description: "Opening message; 1..8000 chars. Sent verbatim: the platform renders no merge fields, a {{first_name}} goes out as those braces."
        conversation_title:
          type: string
          nullable: true
          maxLength: 100
          description: Optional group name, max 100 chars; omitted leaves the thread unnamed.
        attachments:
          type: array
          items:
            type: object
            properties:
              file_base64:
                type: string
                minLength: 1
                description: "The file itself: a data:<mime>;base64,<...> URL or bare base64. Exactly one of file_base64 / file_url."
              file_url:
                type: string
                maxLength: 2048
                format: uri
                description: "An https URL of the file, downloaded by the backend and encoded for you (public hosts on port 443 only, no credentials in the URL; a request_media_upload file_url works once uploaded). Exactly one of file_base64 / file_url. Refused 422 on this member before anything is dispatched: attachment_url_invalid (not https, a port other than 443, credentials), attachment_url_host_forbidden (a private or reserved address), attachment_fetch_failed, attachments_too_large."
              file_name:
                type: string
                minLength: 1
                maxLength: 255
                description: Display filename shown to the recipient. Derived from the URL path when omitted on the file_url arm.
              file_type:
                type: string
                minLength: 1
                maxLength: 255
                description: "MIME type. Read off the data: prefix or the fetched Content-Type when omitted."
              file_byte_size:
                type: integer
                minimum: 1
                description: "Advisory only: the backend measures the real size and sends that."
            description: Exactly one of file_base64 / file_url per item. Decoded bytes across ALL attachments of one send may not exceed 35 MB, derived from the node's own 50 MB body limit and base64's 4/3 inflation; over it the send is refused with attachments_too_large before a browser dispatch is spent.
          description: Exactly one of file_base64 / file_url per item; 35 MB decoded total per send.
        client_reference:
          type: string
          nullable: true
          maxLength: 255
          description: "Your key for this ONE message (max 255, byte for byte): one key per message, the same key on every repeat of it. The key and its place (the attendee set) are one message whatever it says, and a repeat never goes out twice: it answers 200 with the row the first send stored (result.idempotent_replay, result.content_differs when this request says something else) or 409 naming error.context.send_outcome (in_flight, unknown with retry_after and send_decisive_at, or sent; not_sent with blocking_activity_log_sid when another message holds the place). The same key at another place is another message. Without a key the same words to the same place count as a repeat for an hour after they went out. Stored on the row and searchable; check_linkedin_message_sent asks by it."
        confirmed_not_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message is not on LinkedIn: its activity_log_sid (ln_al_...), from the 409 or check_linkedin_message_sent, given only after someone looked at the conversation. Taken once the attempt can no longer land (before that: 409 send_outcome_unknown, waiting_for may_still_land, retry_after and send_decisive_at that moment): it settles that attempt not_sent and this request goes out. Moot when the attempt is no longer in doubt; another message's sid is 422 not_this_message."
        confirmed_sent:
          type: string
          nullable: true
          minLength: 18
          maxLength: 18
          pattern: ^ln_al_
          description: "A person's word that an earlier attempt of THIS message IS on LinkedIn: its activity_log_sid, as for confirmed_not_sent (never both). Taken at once; it settles the attempt sent and sends nothing: the answer is 409 concurrent_send_in_flight with send_outcome sent, or 200 with the row once it is stored. Another message's sid is 422 not_this_message; an attempt already proved not sent is 409 confirmed_sent_contradicts."
      required:
        - linkedin_account_sid
        - attendees
        - text
    StartLinkedinGroupConversationResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            linkedin_conversation_sid:
              type: string
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox."
            linkedin_type:
              type: string
              enum:
                - message
                - inmail
                - connection_note
                - system
              description: "Channel sub-kind: regular DM / premium InMail / system-seeded connection note / a notice LinkedIn posted into the thread on someone's action (system: a rename, a member added or removed, a member leaving; the body is LinkedIn's own sentence, the sender the acting member; not a message: it takes no reaction and no recall, draw it as history)."
            type:
              type: string
              enum:
                - inbox
                - outbox
              description: "Direction relative to our account: received / sent."
            automation:
              type: string
              enum:
                - auto
                - manual
                - synced
              description: "Writer provenance: a sequence runner (auto), a person through a send tool (manual), or the messages sync (synced). An invitation note is a synced row labelled linkedin_type=connection_note; the 'connect' value left on 2026-09-20 with the seeders that were its only writer and never shipped."
            ln_member_id:
              type: string
              nullable: true
              description: The counterpart's member id, decoded from whichever LinkedIn id the thread carries. Null only on a thread with an organization (a Message Ads page names nobody).
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: The counterpart's LinkedIn Recruiter (talent) profile id, denormalized from the parent recruiter thread. Null off the recruiter surface.
            nickname:
              type: string
              nullable: true
            subject:
              type: string
              nullable: true
            text:
              type: string
            client_reference:
              type: string
              nullable: true
            attachments:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  urn:
                    type: string
                    description: digitalmediaAsset URN; the attachment_urn the download tools take.
                  name:
                    type: string
                  content_type:
                    type: string
                  content_url:
                    type: string
                  file_byte_size:
                    type: number
                  file_name:
                    type: string
                    description: "Rows our send verbs wrote: the file name as sent."
                  file_type:
                    type: string
                    description: "Rows our send verbs wrote: the MIME type as sent."
            reactions:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  emoji:
                    type: string
                  count:
                    type: number
                  is_viewer_reacted:
                    type: boolean
                  first_reacted_at:
                    type: string
                    nullable: true
                required:
                  - emoji
                  - count
                  - is_viewer_reacted
                  - first_reacted_at
            is_deleted:
              type: boolean
            message_hash:
              type: string
            sent_at:
              type: string
            custom_content:
              type: object
              nullable: true
              additionalProperties: {}
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - linkedin_conversation_sid
            - messenger_type
            - linkedin_type
            - type
            - automation
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - subject
            - text
            - client_reference
            - attachments
            - reactions
            - is_deleted
            - message_hash
            - sent_at
            - custom_content
            - 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
              nullable: true
              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
              nullable: true
              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
    StopAntidetectBrowserRequest:
      type: object
      description: Request body of `stop_antidetect_browser`.
      properties:
        sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ab_br_
          description: Antidetect browser sid (ab_br_…).
        now:
          type: boolean
          description: "Emergency stop: commit stopped immediately."
      required:
        - sid
    StopAntidetectBrowserResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
              nullable: true
            automation_server_sid:
              type: string
              nullable: true
            account_share_sid:
              type: string
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            vendor_provider:
              type: string
              enum:
                - gologin
                - multilogin
                - adspower
                - dolphin
            vendor_name:
              type: string
              nullable: true
            vendor_profile_id:
              type: string
              nullable: true
            browser_owner:
              type: string
              enum:
                - platform
                - customer
            status:
              type: string
              enum:
                - stopped
                - queued_to_start
                - initializing
                - running
                - idle
                - queued_to_stop
                - start_issue
                - running_issue
                - login_issue
                - restricted
                - client_error_investigation
                - support_error_investigation
                - maintenance
                - shared_out
                - subscription_required
            error_reason:
              type: string
              nullable: true
            fail_count:
              type: number
            last_fail_at:
              type: string
              nullable: true
            logout_count:
              type: number
            last_logout_at:
              type: string
              nullable: true
            last_start_at:
              type: string
              nullable: true
            last_health_check_at:
              type: string
              nullable: true
            last_activity_at:
              type: string
              nullable: true
            antidetect_browser_proxy_sid:
              type: string
              nullable: true
            proxy_country_code:
              type: string
              nullable: true
            custom_proxy:
              type: object
              nullable: true
              properties:
                ip:
                  type: string
                port:
                  type: integer
                mode:
                  type: string
                username:
                  type: string
                  nullable: true
                exit_ip:
                  type: string
                  nullable: true
                latency_ms:
                  type: integer
                  nullable: true
              required:
                - ip
                - port
                - mode
                - username
                - exit_ip
                - latency_ms
            proxy_5g:
              type: boolean
              description: "5G Proxy add-on: the browser runs on the dedicated 5G mobile route (faster command execution, fewer retries). Each flagged browser occupies one add-on slot."
            cloud_browser_access:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                    nullable: true
                    minLength: 18
                    maxLength: 18
                    pattern: ^cb_ak_
                    description: "The bearer token itself, in full, for a caller holding can_manage_cloud_browser_external_links (the permission that mints it: reading a key is the same power as minting one, since the public connect checks nothing but the key). null for every other caller; the entry stays so the link, its expiry and its use can still be listed. On cloud-browser-sessions it is masked to the last 4."
                  expires_at:
                    type: string
                    nullable: true
                    description: ISO 8601 expiry; null means it never expires. Checked at connect and never again, so a session can outlive its own key.
                  max_connects:
                    type: number
                    nullable: true
                    description: Cap on CONCURRENT sessions on this key; null means unlimited.
                  allowed_ips:
                    type: array
                    nullable: true
                    items:
                      type: string
                  allowed_countries:
                    type: array
                    nullable: true
                    items:
                      type: string
                  purpose:
                    type: string
                    enum:
                      - relogin
                      - recruiter_relogin
                      - share
                    description: What the public page behind the link does. Stamped at mint and never re-negotiated at connect, because the visitor is unauthenticated. Absent on keys minted before the field existed, which the backend reads as relogin.
                required:
                  - key
                  - expires_at
                  - max_connects
                  - allowed_ips
                  - allowed_countries
              description: The smart links minted on this browser; the key itself only for a caller holding can_manage_cloud_browser_external_links, null otherwise (2026-09-16). Each console open used to leave a throwaway entry here; minting now sweeps entries that expired over 24h ago, so this is the live link list rather than a log.
            vendor_profile_shares:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  email:
                    type: string
                  role:
                    type: string
                  shared_at:
                    type: string
                    nullable: true
                  shared_by:
                    type: string
                    nullable: true
                  vendor_share_id:
                    type: string
                    nullable: true
                required:
                  - email
                  - role
                  - shared_at
                  - shared_by
                  - vendor_share_id
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - automation_server_sid
            - account_share_sid
            - share_role
            - vendor_provider
            - vendor_name
            - vendor_profile_id
            - browser_owner
            - status
            - error_reason
            - fail_count
            - last_fail_at
            - logout_count
            - last_logout_at
            - last_start_at
            - last_health_check_at
            - last_activity_at
            - antidetect_browser_proxy_sid
            - proxy_country_code
            - custom_proxy
            - proxy_5g
            - cloud_browser_access
            - vendor_profile_shares
            - created_by
            - deleted_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
              nullable: true
              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
              nullable: true
              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
    SyncLinkedinConnectionRequestsRequest:
      type: object
      description: Request body of `sync_linkedin_connection_requests`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…) of the sending account.
      required:
        - linkedin_account_sid
    SyncLinkedinConnectionRequestsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
        async:
          type: boolean
          enum:
            - true
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            ln_member_id:
              type: string
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            note:
              type: string
              nullable: true
            client_reference:
              type: string
              nullable: true
            sent_at:
              type: string
              nullable: true
            invitation_id:
              type: string
              nullable: true
            resend_available_at:
              type: string
              nullable: true
            last_check_at:
              type: string
              nullable: true
            removal_kind:
              type: string
              nullable: true
              enum:
                - accepted
                - withdrawn
                - expired
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - ln_member_id
            - ln_id
            - sn_id
            - nickname
            - note
            - client_reference
            - sent_at
            - invitation_id
            - resend_available_at
            - last_check_at
            - removal_kind
            - 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
              nullable: true
              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
              nullable: true
              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
    SyncMyLinkedinConnectionInvitationsRequest:
      type: object
      description: Request body of `sync_my_linkedin_connection_invitations`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…) of the receiving account.
      required:
        - linkedin_account_sid
    SyncMyLinkedinConnectionInvitationsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
        async:
          type: boolean
          enum:
            - true
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            ln_member_id:
              type: string
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            note:
              type: string
              nullable: true
            linkedin_invitation_id:
              type: string
              nullable: true
            shared_secret:
              type: string
              nullable: true
            received_at:
              type: string
            last_check_at:
              type: string
              nullable: true
            removal_kind:
              type: string
              nullable: true
              enum:
                - accepted
                - ignored
                - expired
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - ln_member_id
            - ln_id
            - sn_id
            - nickname
            - note
            - linkedin_invitation_id
            - shared_secret
            - received_at
            - last_check_at
            - removal_kind
            - 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
              nullable: true
              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
              nullable: true
              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
    SyncMyLinkedinConnectionsRequest:
      type: object
      description: Request body of `sync_my_linkedin_connections`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…) whose network is acted on.
      required:
        - linkedin_account_sid
    SyncMyLinkedinConnectionsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
        async:
          type: boolean
          enum:
            - true
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            ln_member_id:
              type: string
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            full_name:
              type: string
              nullable: true
            connected_at:
              type: string
              nullable: true
            linkedin_connection_request_sid:
              type: string
              nullable: true
            linkedin_connection_invitation_sid:
              type: string
              nullable: true
            last_check_at:
              type: string
              nullable: true
            removal_kind:
              type: string
              nullable: true
              enum:
                - removed
                - blocked
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - ln_member_id
            - ln_id
            - sn_id
            - nickname
            - full_name
            - connected_at
            - linkedin_connection_request_sid
            - linkedin_connection_invitation_sid
            - last_check_at
            - removal_kind
            - 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
              nullable: true
              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
              nullable: true
              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
    SyncMyLinkedinConversationsRequest:
      type: object
      description: Request body of `sync_my_linkedin_conversations`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
      required:
        - linkedin_account_sid
    SyncMyLinkedinConversationsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
        async:
          type: boolean
          enum:
            - true
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            conversation_hash:
              type: string
              description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
            nickname:
              type: string
              nullable: true
            participants:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  picture_url:
                    type: string
                    nullable: true
            is_muted:
              type: boolean
              nullable: true
            unread_count:
              type: integer
              nullable: true
              description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
            event_count:
              type: number
            last_activity_at:
              type: string
              nullable: true
            last_stored_message_at:
              type: string
              nullable: true
            last_message_sync_at:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - conversation_hash
            - messenger_type
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - participants
            - is_muted
            - unread_count
            - event_count
            - last_activity_at
            - last_stored_message_at
            - last_message_sync_at
            - created_at
            - updated_at
            - deleted_at
        pending:
          type: array
          items:
            type: object
            properties:
              activity_log_sid:
                type: string
              expected_completion_seconds:
                type: integer
                minimum: 0
              webhook_events:
                type: array
                items:
                  type: string
            required:
              - expected_completion_seconds
              - webhook_events
        result:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    SyncMyRecruiterConversationsRequest:
      type: object
      description: Request body of `sync_my_recruiter_conversations`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
      required:
        - linkedin_account_sid
    SyncMyRecruiterConversationsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
        async:
          type: boolean
          enum:
            - true
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            conversation_hash:
              type: string
              description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
            nickname:
              type: string
              nullable: true
            participants:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  picture_url:
                    type: string
                    nullable: true
            is_muted:
              type: boolean
              nullable: true
            unread_count:
              type: integer
              nullable: true
              description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
            event_count:
              type: number
            last_activity_at:
              type: string
              nullable: true
            last_stored_message_at:
              type: string
              nullable: true
            last_message_sync_at:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - conversation_hash
            - messenger_type
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - participants
            - is_muted
            - unread_count
            - event_count
            - last_activity_at
            - last_stored_message_at
            - last_message_sync_at
            - created_at
            - updated_at
            - deleted_at
        pending:
          type: array
          items:
            type: object
            properties:
              activity_log_sid:
                type: string
              expected_completion_seconds:
                type: integer
                minimum: 0
              webhook_events:
                type: array
                items:
                  type: string
            required:
              - expected_completion_seconds
              - webhook_events
        result:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    SyncMySalesNavigatorConversationsRequest:
      type: object
      description: Request body of `sync_my_sales_navigator_conversations`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: LinkedIn account sid (ln_ac_…).
      required:
        - linkedin_account_sid
    SyncMySalesNavigatorConversationsResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - action
        action:
          type: string
        async:
          type: boolean
          enum:
            - true
        item:
          type: object
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            conversation_hash:
              type: string
              description: LinkedIn's OWN thread id, the 2-…== value that appears in a messaging URL and in every raw wire payload. Not our sid. This is the id a user has in hand when they name a thread, so filter.conversation_hash is how you turn it into a conversation sid.
            messenger_type:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
              description: "Messenger surface: the basic LinkedIn messenger, Sales Navigator, or the LinkedIn Recruiter inbox (the threads a recruiter seat owns; the counterpart is a recruiter_id)."
            ln_member_id:
              type: string
              nullable: true
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            recruiter_id:
              type: string
              nullable: true
              description: "The counterpart's LinkedIn Recruiter (talent) profile id (AEMAA…): the ONLY id a messenger_type='recruiter' thread carries, and what send_linkedin_recruiter_message dispatches as the reply recipient. It does not decode to ln_member_id. Null on the other two surfaces."
            nickname:
              type: string
              nullable: true
            participants:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  ln_member_id:
                    type: string
                    nullable: true
                  ln_id:
                    type: string
                    nullable: true
                  sn_id:
                    type: string
                    nullable: true
                  recruiter_id:
                    type: string
                    nullable: true
                  nickname:
                    type: string
                    nullable: true
                  full_name:
                    type: string
                    nullable: true
                  headline:
                    type: string
                    nullable: true
                  picture_url:
                    type: string
                    nullable: true
            is_muted:
              type: boolean
              nullable: true
            unread_count:
              type: integer
              nullable: true
              description: "LinkedIn's own unread counter for the thread, synced from both messenger wires. A LEVEL, not a high-water mark: reading the thread elsewhere lowers it. null = never synced, which is not the same as a synced 0. mark-read / mark-unread mirror it immediately (read sets 0; unread sets a floor of 1, because after the verb all we truly know is \"more than zero\")."
            event_count:
              type: number
            last_activity_at:
              type: string
              nullable: true
            last_stored_message_at:
              type: string
              nullable: true
            last_message_sync_at:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - conversation_hash
            - messenger_type
            - ln_member_id
            - ln_id
            - sn_id
            - recruiter_id
            - nickname
            - participants
            - is_muted
            - unread_count
            - event_count
            - last_activity_at
            - last_stored_message_at
            - last_message_sync_at
            - created_at
            - updated_at
            - deleted_at
        pending:
          type: array
          items:
            type: object
            properties:
              activity_log_sid:
                type: string
              expected_completion_seconds:
                type: integer
                minimum: 0
              webhook_events:
                type: array
                items:
                  type: string
            required:
              - expected_completion_seconds
              - webhook_events
        result:
          type: object
          additionalProperties: {}
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              description: The echoed request skill urn urn:li:fsd_profileEndorsedSkill:(<profileId>,<skillId>), read from value.entityUrn; null when LinkedIn omitted it.
            endorsed_by_viewer:
              type: boolean
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              maxLength: 64
              description: Sales Navigator member id.
            nickname:
              type: string
              nullable: true
              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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
    UnreactLinkedinPostRequest:
      type: object
      description: Request body of `unreact_linkedin_post`.
      properties:
        linkedin_account_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ln_ac_
          description: "LinkedIn account sid (ln_ac_…), the authoring account. Identity-bound: REQUIRED, posts publish AS this account."
        entity_urn:
          type: string
          minLength: 1
          maxLength: 512
          description: "The post or comment to react on. LinkedIn files a reaction under the post's social thread and silently drops one sent to any other key (success, null reaction_urn, nothing lands: captured live on the activity urn of a ugcPost company post), so a post handle is re-addressed at its thread before the wire. urn:li:ugcPost:<id> and urn:li:groupPost:<groupId>-<postId> are the thread and go as is. urn:li:activity:<id> and urn:li:share:<id> cost one post read first (the read enrich_linkedin_post_details makes, on this account, cached 7 days): a share post is reacted on at its activity urn, a ugcPost post at its ugcPost urn, a repost without commentary at the original. A post the read returns null for (deleted, or not visible to the account) is refused 422 post_not_resolvable. A COMMENT key targets a comment and passes verbatim, either form: urn:li:comment:((activity|share|ugcPost|groupPost):<id>,<id>) or urn:li:fsd_comment:(<commentId>,<full thread urn>). A post URL works when the id is in it: the feed permalink, the /posts/<slug>-activity-<id>-<hash> share link, the -ugcPost-<id>- share link. A link WITHOUT an id (a shortlink, a bare slug URL) is refused 422 entity_urn_not_resolvable: call enrich_linkedin_get_activity_urn_by_url first. A malformed urn is refused 422 before any dispatch. The post does NOT need to be tracked or owned by us."
      required:
        - linkedin_account_sid
        - entity_urn
    UnreactLinkedinPostResponse:
      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: {}
        result:
          type: object
          properties:
            removed:
              type: boolean
              enum:
                - true
            activity_log:
              type: object
              properties: {}
              description: Full dispatch row (linkedin-account-activity-log) per §4.12a. Poll it there by sid for the terminal outcome.
          required:
            - removed
            - activity_log
        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
              nullable: true
              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
              nullable: true
              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
    UnsetLinkedinAutoScrapeMassActionResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            source_method:
              type: string
              enum:
                - search-people-by-url
                - search-people-by-params
                - search-sales-nav-people-by-url
                - search-sales-nav-people-by-params
                - similar-profiles
                - company-employees
                - company-decision-makers
                - get-post-comments
                - get-post-reactors
                - get-post-resharers
                - search-service-providers
                - search-service-providers-by-url
                - search-companies-by-url
                - search-companies-by-params
                - search-sales-nav-companies-by-url
                - search-sales-nav-companies-by-params
                - similar-companies
            source_input:
              type: object
              additionalProperties: {}
            detected_platform:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
            result_kind:
              type: string
              enum:
                - person
                - company
            status:
              type: string
              enum:
                - active
                - paused
            consecutive_failures:
              type: number
            runs_count:
              type: number
            total_new_results:
              type: number
            title:
              type: string
              nullable: true
            replay_frequency:
              type: string
              nullable: true
              enum:
                - hourly
                - daily
                - weekly
                - monthly
            paused_reason:
              type: string
              nullable: true
              enum:
                - manual
                - too_many_failures
                - account_unavailable
            next_run_at:
              type: string
              nullable: true
            last_run_at:
              type: string
              nullable: true
            mass_action_sid:
              type: string
              nullable: true
            created_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - source_method
            - source_input
            - detected_platform
            - result_kind
            - status
            - consecutive_failures
            - runs_count
            - total_new_results
            - title
            - replay_frequency
            - paused_reason
            - next_run_at
            - last_run_at
            - mass_action_sid
            - created_by
            - deleted_by
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            unset_mass_action_sid:
              type: string
              description: The mass-action that was unlinked. It keeps running.
          required:
            - unset_mass_action_sid
        meta:
          type: object
          properties:
            trace_id:
              type: string
              description: UUID v7; same 128-bit value as the X-Trace-Id header.
            span_id:
              type: string
              pattern: ^[0-9a-f]{16}$
              description: 16 hex chars, root span of this request.
            timestamp:
              type: string
              description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
            duration_ms:
              type: integer
              minimum: 0
              description: Server-side wall clock.
            team_sid:
              type: string
              nullable: true
              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
              nullable: true
              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
    UpdateAntidetectBrowserProxyRequest:
      type: object
      description: Request body of `update_antidetect_browser_proxy`.
      properties:
        sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ab_br_
          description: Antidetect browser sid (ab_br_…).
        antidetect_browser_proxy_sid:
          type: string
          minLength: 18
          maxLength: 18
          pattern: ^ab_px_
          description: Pin a specific pooled proxy. Resolve the sid yourself with search_antidetect_browser_proxies; never ask an end user for one.
        proxy_country_code:
          type: string
          minLength: 2
          maxLength: 2
          description: ISO country. Picks the least-loaded active proxy. The default way to pick a proxy.
        custom_proxy_config:
          type: object
          properties:
            ip:
              type: string
              description: Proxy host.
            port:
              type: integer
              minimum: 1
              maximum: 65535
            username:
              type: string
            password:
              type: string
            mode:
              type: string
              enum:
                - http
                - socks4
                - socks5
              description: Default http.
          required:
            - ip
            - port
          description: Custom proxy connection tuple (customer BYO path). Probed before it is written; 5G Proxy cannot ride it. A password left out keeps the one this browser stores when ip and username stay the same, never for another host.
        proxy_5g:
          type: boolean
          description: "Arm (true) or release (false) the 5G Proxy add-on binding on this browser. Omit to leave the binding untouched. A body carrying proxy_5g alone is a valid source-less call: it moves only the add-on binding and leaves the IP where it is."
      required:
        - sid
    UpdateAntidetectBrowserProxyResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
              nullable: true
            automation_server_sid:
              type: string
              nullable: true
            account_share_sid:
              type: string
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            vendor_provider:
              type: string
              enum:
                - gologin
                - multilogin
                - adspower
                - dolphin
            vendor_name:
              type: string
              nullable: true
            vendor_profile_id:
              type: string
              nullable: true
            browser_owner:
              type: string
              enum:
                - platform
                - customer
            status:
              type: string
              enum:
                - stopped
                - queued_to_start
                - initializing
                - running
                - idle
                - queued_to_stop
                - start_issue
                - running_issue
                - login_issue
                - restricted
                - client_error_investigation
                - support_error_investigation
                - maintenance
                - shared_out
                - subscription_required
            error_reason:
              type: string
              nullable: true
            fail_count:
              type: number
            last_fail_at:
              type: string
              nullable: true
            logout_count:
              type: number
            last_logout_at:
              type: string
              nullable: true
            last_start_at:
              type: string
              nullable: true
            last_health_check_at:
              type: string
              nullable: true
            last_activity_at:
              type: string
              nullable: true
            antidetect_browser_proxy_sid:
              type: string
              nullable: true
            proxy_country_code:
              type: string
              nullable: true
            custom_proxy:
              type: object
              nullable: true
              properties:
                ip:
                  type: string
                port:
                  type: integer
                mode:
                  type: string
                username:
                  type: string
                  nullable: true
                exit_ip:
                  type: string
                  nullable: true
                latency_ms:
                  type: integer
                  nullable: true
              required:
                - ip
                - port
                - mode
                - username
                - exit_ip
                - latency_ms
            proxy_5g:
              type: boolean
              description: "5G Proxy add-on: the browser runs on the dedicated 5G mobile route (faster command execution, fewer retries). Each flagged browser occupies one add-on slot."
            cloud_browser_access:
              type: array
              items:
                type: object
                properties:
                  key:
                    type: string
                    nullable: true
                    minLength: 18
                    maxLength: 18
                    pattern: ^cb_ak_
                    description: "The bearer token itself, in full, for a caller holding can_manage_cloud_browser_external_links (the permission that mints it: reading a key is the same power as minting one, since the public connect checks nothing but the key). null for every other caller; the entry stays so the link, its expiry and its use can still be listed. On cloud-browser-sessions it is masked to the last 4."
                  expires_at:
                    type: string
                    nullable: true
                    description: ISO 8601 expiry; null means it never expires. Checked at connect and never again, so a session can outlive its own key.
                  max_connects:
                    type: number
                    nullable: true
                    description: Cap on CONCURRENT sessions on this key; null means unlimited.
                  allowed_ips:
                    type: array
                    nullable: true
                    items:
                      type: string
                  allowed_countries:
                    type: array
                    nullable: true
                    items:
                      type: string
                  purpose:
                    type: string
                    enum:
                      - relogin
                      - recruiter_relogin
                      - share
                    description: What the public page behind the link does. Stamped at mint and never re-negotiated at connect, because the visitor is unauthenticated. Absent on keys minted before the field existed, which the backend reads as relogin.
                required:
                  - key
                  - expires_at
                  - max_connects
                  - allowed_ips
                  - allowed_countries
              description: The smart links minted on this browser; the key itself only for a caller holding can_manage_cloud_browser_external_links, null otherwise (2026-09-16). Each console open used to leave a throwaway entry here; minting now sweeps entries that expired over 24h ago, so this is the live link list rather than a log.
            vendor_profile_shares:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  email:
                    type: string
                  role:
                    type: string
                  shared_at:
                    type: string
                    nullable: true
                  shared_by:
                    type: string
                    nullable: true
                  vendor_share_id:
                    type: string
                    nullable: true
                required:
                  - email
                  - role
                  - shared_at
                  - shared_by
                  - vendor_share_id
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - automation_server_sid
            - account_share_sid
            - share_role
            - vendor_provider
            - vendor_name
            - vendor_profile_id
            - browser_owner
            - status
            - error_reason
            - fail_count
            - last_fail_at
            - logout_count
            - last_logout_at
            - last_start_at
            - last_health_check_at
            - last_activity_at
            - antidetect_browser_proxy_sid
            - proxy_country_code
            - custom_proxy
            - proxy_5g
            - cloud_browser_access
            - vendor_profile_shares
            - created_by
            - deleted_by
            - created_at
            - updated_at
            - deleted_at
        result:
          type: object
          properties:
            previous_antidetect_browser_proxy_sid:
              type: string
              nullable: true
              description: The pooled proxy the browser was on before the swap, or null if it had none.
            restarted:
              type: boolean
              description: True when the browser was running and was started again on the new proxy.
            restart_error:
              type: string
              nullable: true
              description: Set when the swap committed but the browser could not be restarted.
          required:
            - previous_antidetect_browser_proxy_sid
            - restarted
            - restart_error
        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
              nullable: true
              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
              nullable: true
              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
    UpdateLinkedinAccountSmartLimitRequest:
      type: object
      description: Request body of `update_linkedin_account_smart_limit`.
      properties:
        daily_limit:
          type: integer
          minimum: 1
          maximum: 1000
          description: Active cap (1..1000).
        target_limit:
          type: integer
          nullable: true
          minimum: 0
          maximum: 1000
          description: Warm-up ceiling; null clears it.
        learning_enabled:
          type: boolean
          description: Whether the adaptive ceiling keeps moving. false pins learned_ceiling where it stands; the quota-hit block clock still arms either way, so this is a tuning knob, not a safety switch.
        delay_in_seconds:
          type: integer
          minimum: 1
          maximum: 3600
          description: The flat delay in seconds between any two calls of the bucket (1..3600), varied by up to 20% per call; nothing fires back-to-back. An undo verb (unreact, delete a comment or post, unendorse, unfollow, withdraw) waits 2 s instead.
        reset_hold:
          type: boolean
          description: Clear the daily-saturation hold in the same call (the atomic "raise the limit AND resume now"). Only resumes if the new daily_limit > done_today_count; otherwise the row re-holds. Never touches a LinkedIn-side lock.
    UpdateLinkedinAccountSmartLimitResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - update
        item:
          type: object
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            limit_type:
              type: string
              enum:
                - send_connection_requests
                - networking_general
                - send_messages
                - send_inmails
                - messaging_general
                - comment_posts
                - react_posts
                - endorse_skills
                - visit_profiles
                - edit_profile
                - self_account_sync
                - scraping
                - enrichment
                - posting
                - custom_request
                - data_requests
            daily_limit:
              type: number
            smart_limit:
              type: number
              nullable: true
            target_limit:
              type: number
              nullable: true
            delay_in_seconds:
              type: number
            done_today_count:
              type: number
            done_7d_count:
              type: number
              nullable: true
            last_reset_at:
              type: string
            status:
              type: string
              enum:
                - active
                - held
                - linkedin_blocked
            hold_till:
              type: string
              nullable: true
            linkedin_quota_hit_till:
              type: string
              nullable: true
            created_at:
              type: string
            updated_at:
              type: string
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - limit_type
            - daily_limit
            - smart_limit
            - target_limit
            - delay_in_seconds
            - done_today_count
            - last_reset_at
            - status
            - hold_till
            - linkedin_quota_hit_till
            - created_at
            - updated_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
              nullable: true
              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
              nullable: true
              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
    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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    UpdateLinkedinAutoScrapeRequest:
      type: object
      description: Request body of `update_linkedin_auto_scrape`.
      properties:
        title:
          type: string
          nullable: true
          maxLength: 255
        replay_frequency:
          type: string
          nullable: true
          enum:
            - hourly
            - daily
            - weekly
            - monthly
          description: null turns a recurring collector into a one-shot; it does NOT resume a paused one.
    UpdateLinkedinAutoScrapeResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - true
        operation:
          type: string
          enum:
            - update
        item:
          type: object
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            source_method:
              type: string
              enum:
                - search-people-by-url
                - search-people-by-params
                - search-sales-nav-people-by-url
                - search-sales-nav-people-by-params
                - similar-profiles
                - company-employees
                - company-decision-makers
                - get-post-comments
                - get-post-reactors
                - get-post-resharers
                - search-service-providers
                - search-service-providers-by-url
                - search-companies-by-url
                - search-companies-by-params
                - search-sales-nav-companies-by-url
                - search-sales-nav-companies-by-params
                - similar-companies
            source_input:
              type: object
              additionalProperties: {}
            detected_platform:
              type: string
              enum:
                - linkedin
                - sales_navigator
                - recruiter
            result_kind:
              type: string
              enum:
                - person
                - company
            status:
              type: string
              enum:
                - active
                - paused
            consecutive_failures:
              type: number
            runs_count:
              type: number
            total_new_results:
              type: number
            title:
              type: string
              nullable: true
            replay_frequency:
              type: string
              nullable: true
              enum:
                - hourly
                - daily
                - weekly
                - monthly
            paused_reason:
              type: string
              nullable: true
              enum:
                - manual
                - too_many_failures
                - account_unavailable
            next_run_at:
              type: string
              nullable: true
            last_run_at:
              type: string
              nullable: true
            mass_action_sid:
              type: string
              nullable: true
            created_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            deleted_by:
              type: object
              nullable: true
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                actor_name:
                  type: string
                  nullable: true
                  description: The OAuth client that acted ("Claude", "n8n"); null for a user, an API key or a system job.
                oauth_client_sid:
                  type: string
                  nullable: true
                  description: The acting OAuth client (id_oc_*); null off the OAuth path.
                reason:
                  type: string
                  nullable: true
                  description: Why a system actor wrote the row (snapshot_capture_job, ...); null otherwise.
                permissions:
                  type: object
                  additionalProperties: {}
                  description: "Internal audit context: the grant set the actor held at write time. Not a contract."
                cluster_id:
                  type: integer
                  nullable: true
                  description: "Internal audit context: the cluster that served the write."
                trace_id:
                  type: string
                  nullable: true
                  description: "Internal audit context: the trace id of the request that wrote the row."
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - source_method
            - source_input
            - detected_platform
            - result_kind
            - status
            - consecutive_failures
            - runs_count
            - total_new_results
            - title
            - replay_frequency
            - paused_reason
            - next_run_at
            - last_run_at
            - mass_action_sid
            - created_by
            - deleted_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
              nullable: true
              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
              nullable: true
              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
    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
    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
          nullable: true
          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
              nullable: true
            share_role:
              type: string
              nullable: true
              enum:
                - owner
                - holder
                - giver
                - receiver
            ln_id:
              type: string
              nullable: true
            ln_member_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            recruiter_seat_id:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            avatar_url:
              type: string
              nullable: true
            label:
              type: string
              nullable: true
            has_premium:
              type: boolean
            has_sn:
              type: boolean
            recruiter_status:
              type: string
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
              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
              nullable: true
            last_connections_sync_at:
              type: string
              nullable: true
            last_conversations_sync_at:
              type: string
              nullable: true
            last_sales_navigator_conversations_sync_at:
              type: string
              nullable: true
            last_recruiter_conversations_sync_at:
              type: string
              nullable: true
            last_connection_requests_sync_at:
              type: string
              nullable: true
            last_connection_invitations_sync_at:
              type: string
              nullable: true
            last_followers_sync_at:
              type: string
              nullable: true
            last_snapshot_at:
              type: string
              nullable: true
            initial_sync_completed_at:
              type: string
              nullable: true
            initial_sync_held_at:
              type: string
              nullable: true
              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
              nullable: true
              description: "The run's park code at that moment: limit:daily_saturation, limit:held or limit:linkedin_quota_hit."
            last_heartbeat_at:
              type: string
              nullable: true
            sync_config:
              type: object
              nullable: true
              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
              nullable: true
              properties:
                connections:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_requests:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                connection_invitations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                sales_navigator_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                recruiter_conversations:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                messages:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                followers:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                snapshot:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                strike_log:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
                limits:
                  type: object
                  properties:
                    enabled:
                      type: boolean
                    since:
                      type: string
                      nullable: true
                  required:
                    - enabled
                    - since
            created_by:
              type: object
              properties:
                actor_type:
                  type: string
                  enum:
                    - user
                    - support
                    - api_key
                    - system
                    - agent
                actor_sid:
                  type: string
                  nullable: true
                team_sid:
                  type: string
                permissions:
                  type: object
                  additionalProperties: {}
                request_sid:
                  type: string
                  nullable: true
                reason:
                  type: string
                  nullable: true
              required:
                - actor_type
                - actor_sid
                - team_sid
                - permissions
                - reason
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          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
              nullable: true
              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
              nullable: true
              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
    WithdrawLinkedinConnectionRequestResponse:
      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
          nullable: true
          properties:
            sid:
              type: string
            team_sid:
              type: string
            linkedin_account_sid:
              type: string
            ln_member_id:
              type: string
            ln_id:
              type: string
              nullable: true
            sn_id:
              type: string
              nullable: true
            nickname:
              type: string
              nullable: true
            note:
              type: string
              nullable: true
            client_reference:
              type: string
              nullable: true
            sent_at:
              type: string
              nullable: true
            invitation_id:
              type: string
              nullable: true
            resend_available_at:
              type: string
              nullable: true
            last_check_at:
              type: string
              nullable: true
            removal_kind:
              type: string
              nullable: true
              enum:
                - accepted
                - withdrawn
                - expired
            created_at:
              type: string
            updated_at:
              type: string
            deleted_at:
              type: string
              nullable: true
          required:
            - sid
            - team_sid
            - linkedin_account_sid
            - ln_member_id
            - ln_id
            - sn_id
            - nickname
            - note
            - client_reference
            - sent_at
            - invitation_id
            - resend_available_at
            - last_check_at
            - removal_kind
            - 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
              nullable: true
              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
              nullable: true
              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
