openapi: 3.2.0 info: title: Gtm Linkedin Enrichment API version: '1.0' contact: name: GTM API url: https://gtm-api.com email: support@gtm-api.com license: name: Proprietary url: https://gtm-api.com/license description: 'Operations tagged linkedin_enrichment across 2 of this provider''s published API definitions: gtm-api-openapi-openapi.yml, gtm-api-linkedin-openapi.yaml. Each path carries the servers of the definition it was published in.' servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway security: - BearerJwt: [] TeamSid: [] tags: - name: linkedin_enrichment description: Registry package `mcp.linkedin/linkedin_enrichment`, served on MCP mount `linkedin.enrichment`. paths: /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// URL is ONE small request on LinkedIn''s side, while a Sales Navigator /sales/company/ 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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway /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 servers: - url: https://app.gtm-api.com/linkedin/v4 description: Production, through the app.gtm-api.com gateway components: schemas: 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 - 'null' description: 'Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page.' linkedin_account_sid: type: - string - 'null' 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 - 'null' 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 - 'null' 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 - 'null' url: type: - string - 'null' created_at: type: - string - 'null' text: type: string author: type: object properties: name: type: string headline: type: - string - 'null' profile_id: type: - string - 'null' public_identifier: type: - string - 'null' profile_url: type: - string - 'null' picture_url: type: - string - 'null' 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 - 'null' properties: activity_urn: type: - string - 'null' url: type: - string - 'null' created_at: type: - string - 'null' text: type: string author: type: object properties: name: type: string headline: type: - string - 'null' profile_id: type: - string - 'null' public_identifier: type: - string - 'null' profile_url: type: - string - 'null' picture_url: type: - string - 'null' 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 - 'null' properties: group_id: type: - string - 'null' name: type: string url: type: - string - 'null' logo_url: type: - string - 'null' required: - group_id - name - url - logo_url num_likes: type: number num_comments: type: number num_shares: type: number num_impressions: type: - number - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta EnrichLinkedinCompanyProfileRequest: type: object description: Request body of `enrich_linkedin_company_profile`. properties: company_url: type: - string - 'null' maxLength: 2048 description: https://www.linkedin.com/company/{slug}/ (or a Sales Nav company URL). Provide company_url XOR domain. domain: type: - string - 'null' 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 - 'null' 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 - 'null' 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 - 'null' 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.' EnrichLinkedinCompanyPostsRequest: type: object description: Request body of `enrich_linkedin_company_posts`. properties: company: type: object properties: company_ln_id: type: - string - 'null' 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 - 'null' 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 - 'null' description: 'Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page.' linkedin_account_sid: type: - string - 'null' 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 - 'null' 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 - 'null' 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 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 - 'null' properties: activity_urn: type: string post_urn: type: - string - 'null' url: type: - string - 'null' created_at: type: - string - 'null' text: type: string author: type: object properties: name: type: string headline: type: - string - 'null' profile_id: type: - string - 'null' public_identifier: type: - string - 'null' profile_url: type: - string - 'null' picture_url: type: - string - 'null' 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 - 'null' properties: activity_urn: type: - string - 'null' url: type: - string - 'null' created_at: type: - string - 'null' text: type: string author: type: object properties: name: type: string headline: type: - string - 'null' profile_id: type: - string - 'null' public_identifier: type: - string - 'null' profile_url: type: - string - 'null' picture_url: type: - string - 'null' 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 - 'null' properties: group_id: type: - string - 'null' name: type: string url: type: - string - 'null' logo_url: type: - string - 'null' required: - group_id - name - url - logo_url num_likes: type: number num_comments: type: number num_shares: type: number num_impressions: type: - number - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' description: 'Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page.' linkedin_account_sid: type: - string - 'null' 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 - 'null' 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 - 'null' 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 - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: string network_distance: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' 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 - 'null' 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 - 'null' 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.' 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 - 'null' description: 'Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page.' linkedin_account_sid: type: - string - 'null' 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 - 'null' 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 - 'null' 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 - 'null' properties: page_id: type: - string - 'null' description: The page's vanity slug for a published page (the tail of /services/page/; an older capture carried a numeric id). The whole result is null while the owner keeps the page unpublished. page_url: type: - string - 'null' business_name: type: - string - 'null' provider_name: type: - string - 'null' provider_public_identifier: type: - string - 'null' pricing_text: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' 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 - 'null' 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 - 'null' 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.' 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 - 'null' description: 'Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page.' linkedin_account_sid: type: - string - 'null' 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 - 'null' 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 - 'null' 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 - 'null' universal_name: type: - string - 'null' name: type: - string - 'null' url: type: - string - 'null' website: type: - string - 'null' industry: type: - string - 'null' headquarters: type: - string - 'null' employee_count_range: type: - string - 'null' followers_number: type: - number - 'null' founded_year: type: - number - 'null' about: type: - string - 'null' specialities: type: array items: type: string logo_url: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta EnrichLinkedinCompanyLiteProfileRequest: type: object description: Request body of `enrich_linkedin_company_lite_profile`. properties: company_url: type: - string - 'null' maxLength: 2048 description: https://www.linkedin.com/company/{slug}/ (or a Sales Nav company URL). Provide company_url XOR domain. domain: type: - string - 'null' 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 - 'null' 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 - 'null' 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 - 'null' 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.' 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 - 'null' 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 - 'null' 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 - 'null' 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 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 - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' 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 - 'null' 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 - 'null' 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 - 'null' phones: type: array items: type: object properties: type: type: - string - 'null' number: type: string required: - type - number websites: type: array items: type: object properties: url: type: string category: type: - string - 'null' label: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' 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 - 'null' 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 - 'null' 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 - 'null' 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.' 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 - 'null' description: 'Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page.' linkedin_account_sid: type: - string - 'null' 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 - 'null' 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 - 'null' 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.' 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 - 'null' url: type: - string - 'null' created_at: type: - string - 'null' text: type: string author: type: object properties: name: type: string headline: type: - string - 'null' profile_id: type: - string - 'null' public_identifier: type: - string - 'null' profile_url: type: - string - 'null' picture_url: type: - string - 'null' 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 - 'null' properties: activity_urn: type: - string - 'null' url: type: - string - 'null' created_at: type: - string - 'null' text: type: string author: type: object properties: name: type: string headline: type: - string - 'null' profile_id: type: - string - 'null' public_identifier: type: - string - 'null' profile_url: type: - string - 'null' picture_url: type: - string - 'null' 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 - 'null' properties: group_id: type: - string - 'null' name: type: string url: type: - string - 'null' logo_url: type: - string - 'null' required: - group_id - name - url - logo_url num_likes: type: number num_comments: type: number num_shares: type: number num_impressions: type: - number - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' 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 - 'null' 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 - 'null' 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.' McpError: type: object properties: success: type: boolean enum: - false error: type: object properties: code: type: string enum: - validation_failed - nothing_to_update - not_found - relation_not_found - invalid_transition - limit_exceeded - payment_required - duplicate_rejected - conflict - delete_blocked - unauthorized - forbidden - rate_limited - internal_error - service_unavailable - not_implemented message: type: string recoverable: type: boolean suggestion: type: string field_errors: type: object additionalProperties: type: array items: type: object properties: rule: type: string message: type: string required: - rule - message blockers: type: array items: type: object properties: type: type: string description: Machine-readable blocker type (active_flow, pending_tasks, …). severity: type: string enum: - hard - soft description: hard = external action required; soft = acknowledge is enough. description: type: string entity_sid: type: - string - 'null' count: type: integer resolution: type: string description: 'Hard: tool name to call. Soft: code for acknowledge[].' resolution_hint: type: string required: - type - severity - description - entity_sid - resolution - resolution_hint context: type: object additionalProperties: {} required: - code - message - recoverable meta: type: object properties: trace_id: type: string description: UUID v7; same 128-bit value as the X-Trace-Id header. span_id: type: string pattern: ^[0-9a-f]{16}$ description: 16 hex chars, root span of this request. timestamp: type: string description: ISO 8601 UTC (Y-m-dTH:i:sZ), response time. duration_ms: type: integer minimum: 0 description: Server-side wall clock. team_sid: type: - string - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms required: - success - error 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 - 'null' license_number: type: - string - 'null' issued_at: type: - string - 'null' expires_at: type: - string - 'null' url: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' company_id: type: - string - 'null' degree: type: - string - 'null' field_of_study: type: - string - 'null' start_date: type: - string - 'null' end_date: type: - string - 'null' description: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' urn: type: - string - 'null' endorsement_count: type: - number - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' 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 - 'null' 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 - 'null' 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.' 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 - 'null' 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 - 'null' 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 - 'null' 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.' 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 - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' 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 - 'null' 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 - 'null' 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.' 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 - 'null' 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 - 'null' description: 'Opaque cursor: pass back paging.next_page_cursor verbatim; omitted = first page.' linkedin_account_sid: type: - string - 'null' 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 - 'null' 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 - 'null' 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.' 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 - 'null' 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 - 'null' 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 - 'null' 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 - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: string network_distance: type: - string - 'null' 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 - 'null' position: type: - string - 'null' company_name: type: - string - 'null' company_public_identifier: type: - string - 'null' country: type: - string - 'null' location: type: - string - 'null' about: type: - string - 'null' avatar_url: type: - string - 'null' email: type: - string - 'null' phone: type: - string - 'null' twitter: type: - string - 'null' facebook: type: - string - 'null' connections_number: type: - number - 'null' followers_number: type: - number - 'null' primary_language: type: - string - 'null' supported_languages: type: array items: type: string has_open_profile: type: - boolean - 'null' has_verified_profile: type: - boolean - 'null' has_premium: type: - boolean - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' 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 - 'null' 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 - 'null' 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 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 - 'null' public_identifier: type: string first_name: type: string last_name: type: string full_name: type: string headline: type: - string - 'null' 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 - 'null' location: type: - string - 'null' picture_url: type: - string - 'null' background_picture_url: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' ln_id: type: - string - 'null' sn_id: type: - string - 'null' nickname: type: - string - 'null' full_name: type: - string - 'null' headline: type: - string - 'null' required: - ln_member_id - ln_id - sn_id - nickname - full_name - headline relationship: type: - string - 'null' text: type: string created_at: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' 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 - 'null' 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 - 'null' post_url: type: - string - 'null' post_author: type: - object - 'null' properties: name: type: string headline: type: - string - 'null' profile_id: type: - string - 'null' public_identifier: type: - string - 'null' profile_url: type: - string - 'null' picture_url: type: - string - 'null' required: - name - headline - profile_id - public_identifier - profile_url - picture_url post: type: - object - 'null' 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 - 'null' page_cursor: type: - string - 'null' next_page_cursor: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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:, urn:li:share:, urn:li:ugcPost:, urn:li:groupPost:-, 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 - 'null' 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 - 'null' 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 - 'null' 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.' 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 - 'null' 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 - 'null' 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 - 'null' 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 - 'null' company_public_identifier: type: - string - 'null' company_id: type: - string - 'null' position: type: - string - 'null' employment_type: type: - string - 'null' location: type: - string - 'null' start_date: type: - string - 'null' end_date: type: - string - 'null' description: type: - string - 'null' position_id: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' url: type: - string - 'null' activity_urn: type: - string - 'null' title: type: - string - 'null' subtitle: type: - string - 'null' text: type: - string - 'null' image_url: type: - string - 'null' num_likes: type: - number - 'null' num_comments: type: - number - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' post_author: type: - object - 'null' properties: name: type: string headline: type: - string - 'null' profile_id: type: - string - 'null' public_identifier: type: - string - 'null' profile_url: type: - string - 'null' picture_url: type: - string - 'null' required: - name - headline - profile_id - public_identifier - profile_url - picture_url text: type: string created_at: type: - string - 'null' required: - comment_urn - activity_urn - post_url - post_author - text - created_at paging: type: object properties: page_size: type: - integer - 'null' page_cursor: type: - string - 'null' next_page_cursor: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta 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 - 'null' urn: type: - string - 'null' name: type: string subtitle: type: - string - 'null' url: type: - string - 'null' public_identifier: type: - string - 'null' image_url: type: - string - 'null' description: 'LinkedIn CDN link, wire passthrough: it carries LinkedIn''s own expiry (roughly 30 days).' followers_text: type: - string - 'null' followers_count: type: - number - 'null' 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 - 'null' page_cursor: type: - string - 'null' next_page_cursor: type: - string - 'null' 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 - 'null' description: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends. actor_type: type: - string - 'null' description: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends. required: - trace_id - span_id - timestamp - duration_ms pacing: type: object properties: linkedin_account_sid: type: string description: The account whose bucket the call spent. limit_type: type: string description: The smart-limit bucket the call spent, e.g. send_messages. next_call_after: type: string description: 'ISO 8601, the same form as retry_after: the moment this same call goes through again without waiting. The next pacing slot while the day has budget left, the daily reset when it has none, the end of a LinkedIn lock while one stands.' remaining_today: type: integer minimum: 0 description: daily_limit minus done_today_count of that bucket, after this call. required: - linkedin_account_sid - limit_type - next_call_after - remaining_today required: - success - operation - action - item - result - meta responses: McpServerError: description: MCP error envelope with `error.code` internal_error or service_unavailable. content: application/json: schema: $ref: '#/components/schemas/McpError' McpClientError: description: MCP error envelope. `error.code` is one of validation_failed, nothing_to_update, not_found, relation_not_found, invalid_transition, limit_exceeded, payment_required, duplicate_rejected, conflict, delete_blocked, unauthorized, forbidden, rate_limited, not_implemented. content: application/json: schema: $ref: '#/components/schemas/McpError' securitySchemes: BearerJwt: type: http scheme: bearer bearerFormat: JWT description: Access token issued by gtm.service.id. Its `access_identity` claim carries `team_sid`, `actor_sid` and `actor_type`, and that team scope is authoritative. TeamSid: type: apiKey in: header name: Team-SID description: Team scope for tokens that do not carry one. Ignored when the token already names a team. x-refined-from: - gtm-api-openapi-openapi.yml - gtm-api-linkedin-openapi.yaml