{"openapi":"3.1.0","info":{"title":"Curviate API","version":"1.0.0","description":"Agent-native LinkedIn infrastructure."},"servers":[{"url":"https://api.curviate.com","description":"Production"},{"url":"https://api.staging.curviate.com","description":"Staging"},{"url":"http://api.localhost:3000","description":"Local dev (host-mode)"}],"tags":[{"name":"Users","description":"Look up and manage professional-network user profiles — retrieve a profile, update your own, list connections, list the pages the account administers, check InMail credit balance, and endorse a skill — plus the connected account's own insights: premium subscription entitlements, performance analytics, profile visitors, and Social Selling Index."},{"name":"Following","description":"Follow and unfollow professional-network users, and list a user's followers or who they follow."},{"name":"Companies: Profile","x-displayName":"Profile","description":"Look up a company profile and its employees, posts, jobs, followers, and the connections invitable to follow it."},{"name":"Companies: Inbox","x-displayName":"Inbox","description":"Read, search, and reply in a company page's admin message inbox: list conversations, retrieve one, read a thread's messages, filter by topic or unread, and reply to a conversation as the page."},{"name":"Groups","description":"List the groups a member belongs to, look up a group's detail, and browse or search a group's members."},{"name":"Search","description":"Search for people, companies, posts, jobs, groups, and services across the professional network."},{"name":"Messaging","description":"Send messages, manage conversations, track message threads with connections, and search your inbox."},{"name":"Feed","description":"Read the connected account's home feed as agent-actionable posts — ranked or reverse-chronological."},{"name":"Notifications","description":"Read the connected account's notifications, and delete or mute a notification card."},{"name":"Comments","description":"Comment on posts and manage comments — comment on a post, reply to a comment, update or delete a comment, list a user's comments and a comment's replies, and list, add, or remove comment reactions."},{"name":"Invites","description":"Send, list, withdraw, accept, and decline connect-requests on the professional network."},{"name":"Jobs","description":"Retrieve a public job posting's full detail by id."},{"name":"Posts","description":"Read, publish, and delete posts, and react to them — get a post, list a user's posts (your own or another's), create or delete a post, list and add reactions, list a user's reactions, and remove a reaction — and save posts for later — list your saved posts, save a post, and unsave one. Commenting lives in the Comments group."},{"name":"Recruiter: User Profile","x-displayName":"User Profile","description":"Look up a Recruiter-enriched member profile."},{"name":"Recruiter: Messaging","x-displayName":"Messaging","description":"Start Recruiter InMail conversations."},{"name":"Recruiter: Search","x-displayName":"Search","description":"Resolve filter parameters and search people, the talent pool, or a pasted search URL."},{"name":"Recruiter: Projects","x-displayName":"Projects","description":"Manage hiring projects and their candidate pipeline."},{"name":"Recruiter: Jobs","x-displayName":"Jobs","description":"Manage the full job-posting lifecycle and review talent-pool applicants."},{"name":"Sales Navigator: Messaging","x-displayName":"Messaging","description":"Start Sales Navigator InMail conversations."},{"name":"Sales Navigator: User Profile","x-displayName":"User Profile","description":"Look up a Sales Navigator-enriched member profile."},{"name":"Sales Navigator: Lists","x-displayName":"Lists","description":"Manage saved account and lead lists — list, browse, and save into them."},{"name":"Sales Navigator: Search","x-displayName":"Search","description":"Resolve filter parameters and search people, companies, or a pasted search URL."},{"name":"Accounts","description":"Manage connected professional network accounts — list, inspect, update, and disconnect."},{"name":"Auth","description":"Connect and re-authenticate professional network accounts — hosted links, direct credential/cookie sign-in, verification checkpoints, and connect-session status."},{"name":"Webhooks","description":"Register and manage webhooks that deliver real-time account events."}],"x-tagGroups":[{"name":"Users","tags":["Users"]},{"name":"Following","tags":["Following"]},{"name":"Companies","tags":["Companies: Profile","Companies: Inbox"]},{"name":"Groups","tags":["Groups"]},{"name":"Search","tags":["Search"]},{"name":"Messaging","tags":["Messaging"]},{"name":"Feed","tags":["Feed"]},{"name":"Notifications","tags":["Notifications"]},{"name":"Comments","tags":["Comments"]},{"name":"Invites","tags":["Invites"]},{"name":"Jobs","tags":["Jobs"]},{"name":"Posts","tags":["Posts"]},{"name":"Recruiter","tags":["Recruiter: User Profile","Recruiter: Messaging","Recruiter: Search","Recruiter: Projects","Recruiter: Jobs"]},{"name":"Sales Navigator","tags":["Sales Navigator: Messaging","Sales Navigator: User Profile","Sales Navigator: Lists","Sales Navigator: Search"]},{"name":"Accounts","tags":["Accounts"]},{"name":"Auth","tags":["Auth"]},{"name":"Webhooks","tags":["Webhooks"]}],"components":{"schemas":{"Error":{"type":"object","description":"Structured error envelope. Every non-2xx response uses this shape.","required":["code","message","user_fixable","retry_likely_to_succeed"],"properties":{"code":{"type":"string","description":"Stable machine-readable error code (e.g. ACCOUNT_NOT_FOUND)."},"message":{"type":"string","description":"Human-readable explanation. Safe to surface to an end user."},"retry_hint":{"type":"object","nullable":true,"description":"How to retry, when retrying may help.","properties":{"kind":{"type":"string","enum":["delay","backoff","never"]},"delay_ms":{"type":"number","description":"Suggested wait before retry, in milliseconds."}}},"user_fixable":{"type":"boolean","description":"True when the caller can resolve this by changing the request."},"retry_likely_to_succeed":{"type":"boolean","description":"True when an identical retry is likely to succeed."},"required_tier":{"type":"string","enum":["core","sales_nav","recruiter"],"description":"Present on tier-gated denials — the seat tier required to proceed."}},"example":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}},"headers":{"RateLimit-Policy":{"description":"Quota policy for the current window. Structured-field format: \"tenant\";q=<quota>;w=<window_seconds>. q is the total requests allowed; w is the window length in seconds.","schema":{"type":"string","example":"\"tenant\";q=2500;w=60"}},"RateLimit":{"description":"Current usage within the window. Structured-field format: \"tenant\";r=<remaining>;t=<seconds_until_reset>. r is the remaining request budget; t is seconds until the window resets.","schema":{"type":"string","example":"\"tenant\";r=2310;t=37"}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses only.","schema":{"type":"integer","example":37}}},"securitySchemes":{"apiKeyAuth":{"type":"http","scheme":"bearer","description":"Bearer cvt_live_<key>"}}},"security":[{"apiKeyAuth":[]}],"paths":{"/v1/{account_id}/users/{user_id}":{"get":{"operationId":"getV1AccountIdUsersUserId","tags":["Users"],"summary":"Retrieve a user's profile","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"\"me\" for the caller's own account, or another LinkedIn user's public identifier, member ID, or profile URL. Note on the skills section: a skill's `endorsement_id` (the value needed to endorse that skill) is returned only for users you are eligible to endorse — i.e. your 1st-degree connections. For users outside your network, and on your own profile, the skills section still lists each skill (name, endorsement_count, endorsed, insights) but omits `endorsement_id`. This depends on the connection, not on the identifier form used to look the user up."},{"name":"linkedin_sections","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Which profile sections to fetch (repeatable, flat). Pass one or more of: linkedin_experience, linkedin_education, linkedin_languages, linkedin_skills, linkedin_certifications, linkedin_volunteer_experience, linkedin_projects, linkedin_recommendations, linkedin_interests (or linkedin_* for all), plus each value's _preview variant. Omit for base fields only."}],"responses":{"200":{"description":"The requested user's profile (classic variant). Section arrays are present only when requested via linkedin_sections.","content":{"application/json":{"schema":{"type":"object","description":"A LinkedIn user's profile (classic variant). Section arrays under specifics (skills, experience, education, etc.) are only present when the corresponding linkedin_sections value was requested. No inline quota — read quota from GET /v1/accounts/{account_id}.","properties":{"object":{"type":"string","enum":["user_profile"],"description":"Response type discriminator."},"id":{"type":"string","description":"The profile's opaque identifier."},"type":{"type":"string","enum":["individual","organization","other"],"description":"Profile type."},"display_name":{"type":"string","description":"The member's display name."},"first_name":{"type":"string","description":"First name."},"last_name":{"type":"string","description":"Last name."},"public_identifier":{"type":"string","description":"LinkedIn public URL slug (e.g. 'jane-doe')."},"profile_url":{"type":"string","description":"Full LinkedIn profile URL."},"public_picture_url":{"type":"string","description":"Profile picture URL."},"public_picture_url_large":{"type":"string","description":"Large profile picture URL."},"private_picture_download_url":{"type":"string","description":"A private, time-limited picture download URL (present only in some responses)."},"description":{"type":"string","description":"Profile summary/about section. Passes through verbatim — never stored."},"location":{"type":"string","description":"Geographic location string."},"created_at":{"type":"string","description":"ISO-8601 timestamp for when this profile record was created on the platform."},"emails":{"type":"array","description":"Email addresses associated with the profile.","items":{"type":"string"}},"phone_numbers":{"type":"array","description":"Phone numbers associated with the profile.","items":{"type":"string"}},"is_blocked":{"type":"boolean","description":"Whether the authenticated account has blocked this member."},"is_following":{"type":"boolean","description":"Whether the authenticated account follows this member."},"followers_count":{"type":"number","description":"Total follower count."},"relations_count":{"type":"number","description":"Total 1st-degree connection count."},"specifics":{"type":"object","description":"Structured profile-lens data, incl. connection distance and (when requested) section arrays.","properties":{"network_distance":{"type":"string","enum":["SELF","FIRST_DEGREE","SECOND_DEGREE","THIRD_DEGREE","OUT_OF_NETWORK"],"description":"Connection distance from the operator account."},"member_id":{"type":"string","description":"The member's platform-native ID."},"can_send_inmail":{"type":"boolean","description":"Whether an InMail can be sent to this member."},"pronoun":{"type":"string","description":"The member's stated pronoun, when set."},"default_locale":{"type":"string","description":"The member's default locale."},"supported_locales":{"type":"array","description":"Locales supported for this profile.","items":{"type":"string"}},"notify_visit_token":{"type":"string","description":"An opaque token observed on the wire; no documented consumer yet."},"is_open_profile":{"type":"boolean","description":"Whether the member has Open Profile enabled."},"is_premium":{"type":"boolean","description":"Whether the member has a LinkedIn Premium subscription."},"is_influencer":{"type":"boolean","description":"Whether the member is a LinkedIn influencer."},"is_creator":{"type":"boolean","description":"Whether the member is a LinkedIn creator."},"is_hiring":{"type":"boolean","description":"Whether the member has hiring mode active."},"is_open_to_work":{"type":"boolean","description":"Whether the member has Open to Work enabled."},"skills":{"type":"array","description":"Skill entries. Present only when linkedin_skills is requested via linkedin_sections.","items":{"type":"object","additionalProperties":true,"properties":{"name":{"type":"string","description":"The skill name."},"endorsement_count":{"type":"number","description":"How many people have endorsed this skill."},"endorsed":{"type":"boolean","description":"Whether the operator account has already endorsed this skill."},"insights":{"type":"array","description":"LinkedIn-provided insight strings about the skill.","items":{"type":"string"}},"endorsement_id":{"type":"number","description":"The value passed to POST /v1/{account_id}/users/{user_id}/endorse-skill to endorse this skill. Present ONLY for skills you are eligible to endorse — i.e. those of your 1st-degree connections. Omitted for users outside your network and on your own profile (the skill still lists name, endorsement_count, endorsed, and insights)."}}}},"experience":{"type":"array","description":"Work experience entries. Present only when requested via linkedin_sections.","items":{"type":"object","additionalProperties":true}},"education":{"type":"array","description":"Education entries. Present only when requested via linkedin_sections.","items":{"type":"object","additionalProperties":true}},"languages":{"type":"array","description":"Languages entries. Present only when requested via linkedin_sections.","items":{"type":"object","additionalProperties":true}},"certifications":{"type":"array","description":"Certification entries. Present only when requested via linkedin_sections.","items":{"type":"object","additionalProperties":true}},"volunteer_experience":{"type":"array","description":"Volunteering entries. Present only when requested via linkedin_sections.","items":{"type":"object","additionalProperties":true}},"projects":{"type":"array","description":"Project entries. Present only when requested via linkedin_sections.","items":{"type":"object","additionalProperties":true}},"recommendations":{"type":"object","description":"Recommendations received/given. Present only when requested via linkedin_sections.","additionalProperties":true},"interests":{"type":"array","description":"Interest entries. Present only when requested via linkedin_sections.","items":{"type":"object","additionalProperties":true}},"throttled_sections":{"type":"array","description":"Section names that were requested but throttled by LinkedIn.","items":{"type":"string"}}}}},"required":["object","id","type","display_name","specifics"]},"examples":{"base":{"summary":"Profile — base fields","value":{"object":"user_profile","id":"ACoAAAJOHNSMITH","type":"individual","display_name":"John Smith","first_name":"John","last_name":"Smith","public_identifier":"john-smith","profile_url":"https://www.linkedin.com/in/john-smith/","public_picture_url":"https://media.example.com/john-smith.jpg","public_picture_url_large":"https://media.example.com/john-smith-large.jpg","description":"Senior Developer at Example","location":"Hamburg, Germany","created_at":"2020-01-01T00:00:00.000Z","emails":[],"phone_numbers":[],"is_blocked":false,"is_following":false,"followers_count":1234,"relations_count":500,"specifics":{"network_distance":"SECOND_DEGREE","member_id":"1000000002","can_send_inmail":false,"default_locale":"en_US","supported_locales":["en_US"],"is_open_profile":false,"is_premium":false,"is_influencer":false,"is_creator":false,"is_hiring":false,"is_open_to_work":false,"throttled_sections":[]}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Malformed linkedin_sections value or invalid query param.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the requested user was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a LinkedIn user's profile. Use user_id=\"me\" for the caller's own account, or another LinkedIn user's identifier for read-only access. Request extra sections via linkedin_sections.","x-order":1},"patch":{"operationId":"patchV1AccountIdUsersUserId","tags":["Users"],"summary":"Update your own profile","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"Use \"me\" for the caller's own account — this is the only supported target."}],"responses":{"200":{"description":"The profile was updated. The exact response shape beyond the discriminator is not yet fully documented — additional fields may appear.","content":{"application/json":{"schema":{"type":"object","required":["object"],"properties":{"object":{"type":"string","enum":["user_updated"],"description":"Response type discriminator."}},"additionalProperties":true},"examples":{"updated":{"summary":"Profile updated","value":{"object":"user_updated"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"An unsupported field was supplied (only first_name, last_name, bio, description, picture, background_picture are accepted), or a supplied value is malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"413":{"description":"picture or background_picture exceeds the size limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"413 error","value":{"code":"PAYLOAD_TOO_LARGE","message":"An uploaded part or the request body exceeds the size limit.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"415":{"description":"Unsupported content type — send application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"415 error","value":{"code":"UNSUPPORTED_MEDIA_TYPE","message":"The request content type or attachment format is not accepted.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Updates the caller's own profile fields. Only first_name, last_name, bio, headline, skills, picture, and background_picture are accepted — any other field is rejected. Profile changes can take a short while to appear on LinkedIn; rapid successive edits may not all be applied.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string","description":"New first name."},"last_name":{"type":"string","description":"New last name."},"bio":{"type":"string","description":"New text for your profile's About section."},"headline":{"type":"string","description":"Your profile headline (the short line shown under your name)."},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The skill name to add."},"id":{"type":"string","description":"Optional skill parameter id, from GET /v1/{account_id}/search/parameters?type=SKILL."}},"required":["name"]},"description":"Skills to add to your profile. Add-only, this does not remove or reorder existing skills."},"picture":{"type":"object","properties":{"content":{"type":"string","description":"Base64-encoded file bytes."},"content_type":{"type":"string","description":"File MIME type (e.g. image/png, image/jpeg)."},"filename":{"type":"string","description":"File name."}},"required":["content","content_type","filename"],"description":"New profile photo (base64)."},"background_picture":{"type":"object","properties":{"content":{"type":"string","description":"Base64-encoded file bytes."},"content_type":{"type":"string","description":"File MIME type (e.g. image/png, image/jpeg)."},"filename":{"type":"string","description":"File name."}},"required":["content","content_type","filename"],"description":"New cover/banner photo (base64)."}}},"examples":{"update_bio":{"summary":"Update the About/summary section","value":{"bio":"Building agent-native LinkedIn infra."}}}}}},"x-order":2}},"/v1/{account_id}/profiles/relations":{"get":{"operationId":"getV1AccountIdProfilesRelations","tags":["Users"],"summary":"List 1st-degree connections","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account to read with."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100},"description":"Number of connections to return per page (1–1000, default 100)."},{"name":"filter","in":"query","required":false,"schema":{"type":"string"},"description":"Filter results by member name."}],"responses":{"200":{"description":"A page of the account's 1st-degree connections, plus the next-page cursor.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["relation_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["relation"],"description":"Response type discriminator."},"first_name":{"type":"string","description":"First name."},"last_name":{"type":"string","description":"Last name."},"headline":{"type":["string","null"],"description":"LinkedIn headline."},"public_identifier":{"type":"string","description":"LinkedIn public identifier."},"public_profile_url":{"type":"string","description":"Full LinkedIn public profile URL."},"member_id":{"type":"string","description":"LinkedIn member identifier."},"member_urn":{"type":"string","description":"LinkedIn member URN."},"connection_urn":{"type":"string","description":"LinkedIn connection URN."},"profile_picture_url":{"type":["string","null"],"description":"Profile picture URL, or null if not set."},"created_at":{"type":["string","null"],"description":"ISO-8601 UTC timestamp when the connection was established."}}}},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page."}}},"examples":{"page":{"summary":"First page of connections","value":{"object":"relation_list","items":[{"object":"relation","first_name":"Alice","last_name":"Relation","headline":"VP Engineering","public_identifier":"alice-relation","public_profile_url":"https://www.linkedin.com/in/alice-relation","member_id":"ACoAAAREL11111","member_urn":"urn:li:member:rel_11111","connection_urn":"urn:li:fs_connection:rel_11111","profile_picture_url":null,"created_at":"2026-01-01T10:00:00.000Z"}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1–1000) or malformed cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a paginated list of the connected account's 1st-degree connections. Filter by member name with the filter parameter.","x-order":3}},"/v1/{account_id}/inmail-credits":{"get":{"operationId":"getV1AccountIdInmailCredits","tags":["Users"],"summary":"Get InMail credit balance","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"service","in":"query","required":false,"schema":{"type":"string","enum":["classic","recruiter","sales_navigator"]},"description":"Filter to one product's InMail credit count. Omit to return all three."}],"responses":{"200":{"description":"The account's remaining InMail credits across subscribed LinkedIn premium products. Each product's balance is null when that product is not subscribed.","content":{"application/json":{"schema":{"type":"object","required":["object","credits"],"properties":{"object":{"type":"string","enum":["inmail_credits"],"description":"Response type discriminator."},"credits":{"type":"object","required":["classic","recruiter","sales_navigator"],"properties":{"classic":{"type":["number","null"],"description":"Remaining InMail credits on a LinkedIn Premium (classic) subscription, or null if not subscribed."},"recruiter":{"type":["number","null"],"description":"Remaining InMail credits on a Recruiter seat, or null if not subscribed."},"sales_navigator":{"type":["number","null"],"description":"Remaining InMail credits on a Sales Navigator seat, or null if not subscribed."}}}}},"examples":{"credits":{"summary":"InMail credits","value":{"object":"inmail_credits","credits":{"classic":5,"recruiter":null,"sales_navigator":null}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid service value.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Retrieve the remaining InMail credits across the account's subscribed LinkedIn premium products. Each product's balance is null when that product is not subscribed.","x-order":8}},"/v1/{account_id}/users/{user_id}/endorse-skill":{"post":{"operationId":"postV1AccountIdUsersUserIdEndorseSkill","tags":["Users"],"summary":"Endorse a member's skill","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) performing the endorsement."},{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"The LinkedIn member ID (`ACo…` format) whose skill is being endorsed — a public identifier does not resolve on this endpoint."}],"responses":{"200":{"description":"The skill was endorsed. A 200 IS the success signal — the v2 endorsement wire carries no additional status field.","content":{"application/json":{"schema":{"type":"object","required":["object"],"properties":{"object":{"type":"string","enum":["skill_endorsed"],"description":"Response type discriminator."}}},"examples":{"endorsed":{"summary":"Skill endorsed","value":{"object":"skill_endorsed"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty endorsement_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account lacks the required permission for this action.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the user_id was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot perform endorsements.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Endorses one specific skill on a target member's profile. You can only endorse the skills of your 1st-degree connections. To obtain the endorsement_id: (1) GET /v1/{account_id}/users/{user_id}?linkedin_sections=linkedin_skills, (2) read the target skill's endorsement_id from the skills section — this field is present ONLY for connections you are eligible to endorse (it is omitted for users outside your network and on your own profile, so this workflow requires the target to be a 1st-degree connection), (3) call this endpoint with that value. user_id must be the LinkedIn member ID (ACo… format) — a public identifier does not resolve on this endpoint.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"endorsement_id":{"type":"string","description":"The endorsement ID for the specific skill to endorse. Obtain it from the `endorsement_id` field on a skill in the target's skills section, via GET /v1/{account_id}/users/{user_id}?linkedin_sections=linkedin_skills."}},"required":["endorsement_id"]},"examples":{"endorseSkill":{"summary":"Endorse a skill","value":{"endorsement_id":"1234"}}}}}},"x-order":9}},"/v1/{account_id}/companies/managed":{"get":{"operationId":"getV1AccountIdCompaniesManaged","tags":["Users"],"summary":"List the pages the account administers","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account whose administered pages to list."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Number of managed pages to return per page (1–100, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."}],"responses":{"200":{"description":"The company pages the account administers, each with its per-page admin capability matrix. An account that administers no pages returns an empty list; never a 403. Page names are returned verbatim and are never stored.","content":{"application/json":{"schema":{"type":"object","required":["object","items","paging","cursor"],"properties":{"object":{"type":"string","enum":["managed_company_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"The administered pages.","items":{"type":"object","required":["object","type","id","is_admin","can_invite_to_follow","capabilities","permissions"],"properties":{"object":{"type":"string","enum":["managed_company"],"description":"Item type discriminator."},"type":{"type":"string","enum":["organization"],"description":"Entity sub-discriminator."},"id":{"type":["string","null"],"description":"Numeric company id; pass this to the followers / invitable-followers endpoints. null only if the page's id could not be resolved."},"entity_urn":{"type":["string","null"],"description":"Native company urn."},"name":{"type":["string","null"],"description":"Page display name (content pass-through, never stored)."},"universal_name":{"type":["string","null"],"description":"Vanity slug (the /company/<slug>/ segment)."},"logo_url":{"type":["string","null"],"description":"Page logo URL when available; else null."},"follower_count":{"type":["number","null"],"description":"Page follower count. 0 is a real value (a fresh page)."},"visitor_count":{"type":["number","null"],"description":"Visitors in the past month. 0 is a real value."},"page_type":{"type":["string","null"],"description":"Page-type enum: COMPANY | SHOWCASE | … ."},"is_following":{"type":["boolean","null"],"description":"null for own admin pages (follow-state not meaningful)."},"is_admin":{"type":"boolean","description":"Always true; this is the administered set."},"can_invite_to_follow":{"type":"boolean","description":"The follow-invite gate. true → the account may invite connections to follow this page."},"url":{"type":["string","null"],"description":"Canonical page URL (falls back to /company/<id>/ when absent but id parsed)."},"roles":{"type":"array","items":{"type":"string"},"description":"Admin / paid-media roles: ADMINISTRATOR | DIRECT_SPONSORED_CONTENT_POSTER | … . Often empty."},"capabilities":{"type":"array","items":{"type":"string"},"description":"The full set of granted permission keys: the machine-readable action matrix for routing."},"permissions":{"type":"object","description":"Convenience projection of four high-signal capabilities.","required":["update_profile","create_share","manage_admins","read_analytics"],"properties":{"update_profile":{"type":"boolean","description":"May edit the page profile."},"create_share":{"type":"boolean","description":"May post organic content."},"manage_admins":{"type":"boolean","description":"May edit administrators."},"read_analytics":{"type":"boolean","description":"May read follower analytics."}}}}}},"paging":{"type":"object","required":["total_count"],"properties":{"total_count":{"type":"number","description":"Total administered pages. Equals items.length; the full set returns in one page."}}},"cursor":{"type":["string","null"],"description":"Always null for this resource; the full administered set returns in one page."}}},"examples":{"managedCompanyList":{"summary":"The account's administered pages","value":{"object":"managed_company_list","items":[{"object":"managed_company","type":"organization","id":"112013061","entity_urn":"urn:li:fsd_company:112013061","name":"Acme Corporation","universal_name":"acme-corporation","logo_url":null,"follower_count":63,"visitor_count":11,"page_type":"COMPANY","is_following":null,"is_admin":true,"can_invite_to_follow":true,"url":"https://www.linkedin.com/company/acme-corporation/","roles":[],"capabilities":["canCreateOrganicShare","canUpdateOrganizationProfile","canEditAdministrators","canReadOrganizationFollowerAnalytics","canInviteMemberToFollow"],"permissions":{"update_profile":true,"create_share":true,"manage_admins":true,"read_analytics":true}}],"paging":{"total_count":1},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"The limit query parameter is out of range or not an integer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns the company pages the connected account administers, each with its per-page capability matrix (post, sponsor, analytics, admin management) and the can_invite_to_follow gate. An account that administers no pages returns an empty list; a valid result, not an error.","x-order":10}},"/v1/{account_id}/profile/subscription":{"get":{"operationId":"getV1AccountIdProfileSubscription","tags":["Users"],"summary":"Get the account's premium subscription","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account whose own insights to read."}],"responses":{"200":{"description":"The account's premium entitlement inventory. A free account is a valid 200 empty state (has_premium:false, all *_url:null, subscriptions:[]) with an identical key set — never a 403. The external manage/cancel/switch URLs are LinkedIn-owned pass-through links.","content":{"application/json":{"schema":{"type":"object","required":["object","has_premium","plan_title","description","manage_url","cancel_url","switch_url","subscriptions","actions"],"properties":{"object":{"type":"string","enum":["profile_subscription"],"description":"Response type discriminator."},"has_premium":{"type":"boolean","description":"true when the account holds at least one real premium plan; false for a free account. Keys on a real plan title, not on array length."},"plan_title":{"type":"string","nullable":true,"description":"Title of the primary (first) plan; null when free."},"description":{"type":"string","nullable":true,"description":"Human status line for the primary plan, or the no-premium message for a free account. Display only — never branch on it."},"manage_url":{"type":"string","nullable":true,"description":"External manage URL for the primary plan; null when free."},"cancel_url":{"type":"string","nullable":true,"description":"External cancel URL for the primary plan; null when free. May be served over http://, surfaced verbatim."},"switch_url":{"type":"string","nullable":true,"description":"External switch/upgrade URL for the primary plan; null when free."},"subscriptions":{"type":"array","items":{"type":"object","required":["object","title","description","manage_url","cancel_url","switch_url","actions"],"properties":{"object":{"type":"string","enum":["subscription"],"description":"Item type discriminator."},"title":{"type":"string","nullable":true,"description":"Plan title, e.g. \"Premium Business\". Always present for items."},"description":{"type":"string","nullable":true,"description":"Human status line for this plan (display only — never branch on it)."},"manage_url":{"type":"string","nullable":true,"description":"External LinkedIn-owned URL to manage this plan."},"cancel_url":{"type":"string","nullable":true,"description":"External LinkedIn-owned URL to cancel this plan (may be served over http://)."},"switch_url":{"type":"string","nullable":true,"description":"External LinkedIn-owned URL to switch/upgrade this plan."},"actions":{"type":"object","additionalProperties":{"type":"string"},"description":"This plan's full action map (action key → external URL). Open-ended; observed keys: manage_subscription, cancel_subscription, switch_plans."}}},"description":"The complete entitlement inventory — one item per active plan; [] for a free account. Length > 1 when the account holds multiple concurrent plans. The flat fields mirror subscriptions[0]."},"actions":{"type":"object","additionalProperties":{"type":"string"},"description":"The primary plan's action map (action key → external URL); {} for a free account."}}},"examples":{"premium":{"summary":"A premium account","value":{"object":"profile_subscription","has_premium":true,"plan_title":"Premium Business","description":"You're currently subscribed to Premium Business.","manage_url":"https://www.linkedin.com/manage/purchases-payments/purchases/000000000","cancel_url":"http://www.linkedin.com/premium/cancellation/?source=MY_PREFERENCES","switch_url":"https://www.linkedin.com/premium/switcher?upsellOrderOrigin=premium_settings","subscriptions":[{"object":"subscription","title":"Premium Business","description":"You're currently subscribed to Premium Business.","manage_url":"https://www.linkedin.com/manage/purchases-payments/purchases/000000000","cancel_url":"http://www.linkedin.com/premium/cancellation/?source=MY_PREFERENCES","switch_url":"https://www.linkedin.com/premium/switcher?upsellOrderOrigin=premium_settings","actions":{"manage_subscription":"https://www.linkedin.com/manage/purchases-payments/purchases/000000000","cancel_subscription":"http://www.linkedin.com/premium/cancellation/?source=MY_PREFERENCES","switch_plans":"https://www.linkedin.com/premium/switcher?upsellOrderOrigin=premium_settings"}}],"actions":{"manage_subscription":"https://www.linkedin.com/manage/purchases-payments/purchases/000000000","cancel_subscription":"http://www.linkedin.com/premium/cancellation/?source=MY_PREFERENCES","switch_plans":"https://www.linkedin.com/premium/switcher?upsellOrderOrigin=premium_settings"}}},"free":{"summary":"A free account (200 empty state)","value":{"object":"profile_subscription","has_premium":false,"plan_title":null,"description":"You do not have a Premium subscription at this time.","manage_url":null,"cancel_url":null,"switch_url":null,"subscriptions":[],"actions":{}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — a query parameter failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"The connected LinkedIn account's session is disconnected — reconnect the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the account is unknown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary upstream error occurred, or the upstream response could not be interpreted. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns the connected account's LinkedIn premium entitlement inventory — whether it holds Premium, the plan title, and the external manage/cancel/switch links, plus the complete set when the account holds more than one plan. A free account is a valid 200 empty state, not an error.","x-order":11}},"/v1/{account_id}/profile/analytics":{"get":{"operationId":"getV1AccountIdProfileAnalytics","tags":["Users"],"summary":"Get the account's performance analytics","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account whose own insights to read."}],"responses":{"200":{"description":"The account's performance dashboard as one composite — four headline metrics, always present. A metric's count present-and-0 is a real 0 (never a silent empty).","content":{"application/json":{"schema":{"type":"object","required":["object","profile_viewers","followers","post_impressions","search_appearances"],"properties":{"object":{"type":"string","enum":["profile_analytics"],"description":"Response type discriminator."},"profile_viewers":{"type":"object","required":["count","window","change_pct_magnitude"],"properties":{"count":{"type":"number","nullable":true,"description":"The headline value. Present-and-0 is a real 0; null only on a parser-drift failure (never a silent empty)."},"window":{"type":"string","nullable":true,"description":"The reporting-window label as rendered, e.g. \"Profile viewers in 90 days\", \"Search appearances Jun 23–29\"."},"change_pct_magnitude":{"type":"number","nullable":true,"description":"Trend magnitude in percent (direction is a client-rendered icon absent from the source, so magnitude only)."}},"description":"Profile viewers, trailing 90 days."},"followers":{"type":"object","required":["count","window","change_pct_magnitude"],"properties":{"count":{"type":"number","nullable":true,"description":"The headline value. Present-and-0 is a real 0; null only on a parser-drift failure (never a silent empty)."},"window":{"type":"string","nullable":true,"description":"The reporting-window label as rendered, e.g. \"Profile viewers in 90 days\", \"Search appearances Jun 23–29\"."},"change_pct_magnitude":{"type":"number","nullable":true,"description":"Trend magnitude in percent (direction is a client-rendered icon absent from the source, so magnitude only)."}},"description":"Total followers (running total)."},"post_impressions":{"type":"object","required":["count","window","change_pct_magnitude"],"properties":{"count":{"type":"number","nullable":true,"description":"The headline value. Present-and-0 is a real 0; null only on a parser-drift failure (never a silent empty)."},"window":{"type":"string","nullable":true,"description":"The reporting-window label as rendered, e.g. \"Profile viewers in 90 days\", \"Search appearances Jun 23–29\"."},"change_pct_magnitude":{"type":"number","nullable":true,"description":"Trend magnitude in percent (direction is a client-rendered icon absent from the source, so magnitude only)."}},"description":"Post impressions, trailing 7 days."},"search_appearances":{"type":"object","required":["count","window","change_pct_magnitude"],"properties":{"count":{"type":"number","nullable":true,"description":"The headline value. Present-and-0 is a real 0; null only on a parser-drift failure (never a silent empty)."},"window":{"type":"string","nullable":true,"description":"The reporting-window label as rendered, e.g. \"Profile viewers in 90 days\", \"Search appearances Jun 23–29\"."},"change_pct_magnitude":{"type":"number","nullable":true,"description":"Trend magnitude in percent (direction is a client-rendered icon absent from the source, so magnitude only)."}},"description":"Times the account appeared in search, last completed week."}}},"examples":{"analytics":{"summary":"Headline analytics","value":{"object":"profile_analytics","profile_viewers":{"count":685,"window":"Profile viewers in 90 days","change_pct_magnitude":9},"followers":{"count":1386,"window":"Total followers","change_pct_magnitude":0},"post_impressions":{"count":67,"window":"Post impressions in 7 days","change_pct_magnitude":24},"search_appearances":{"count":0,"window":"Search appearances Jun 23–29","change_pct_magnitude":0}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — a query parameter failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"The connected LinkedIn account's session is disconnected — reconnect the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the account is unknown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary upstream error occurred, or the upstream response could not be interpreted. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns the connected account's performance dashboard as one composite — four headline metrics (profile viewers, followers, post impressions, search appearances), each with its reporting window and trend magnitude. The reporting windows are fixed by LinkedIn.","x-order":12}},"/v1/{account_id}/profile/visitors":{"get":{"operationId":"getV1AccountIdProfileVisitors","tags":["Users"],"summary":"List the account's profile viewers","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account whose own insights to read."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Maximum viewers to return in this page (1–100, default 20). The server may walk a few internal pages to fill one page, and never slices a fetched page down to a smaller limit, so the returned count can exceed this value; the response text says so and includes a cursor to continue when it does."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response's `cursor`; omit for the first page. Zero individuals on a page does NOT mean the list is exhausted while `cursor` is non-null (an aggregate-only page may precede more identified viewers); page until `cursor` is null. Heavy pagination consumes a shared, throttled upstream request budget; you own the spend via the cursor."}],"responses":{"200":{"description":"A page of the account's recent profile viewers, each classified by disclosure fidelity. A free account is capped at semi-anonymous fidelity (an in-band 200, never a 403). Empty account → items:[], cursor:null.","content":{"application/json":{"schema":{"type":"object","required":["object","items","cursor"],"properties":{"object":{"type":"string","enum":["profile_visitor_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","required":["object","kind","name","headline","degree","viewed_at","member_id","member_urn","profile_url","avatar_url"],"properties":{"object":{"type":"string","enum":["profile_visitor"],"description":"Item type discriminator."},"kind":{"type":"string","enum":["identified","semi-anonymous","aggregate"],"description":"Disclosure fidelity: identified = a real person with a member handle (fully actionable); semi-anonymous = a description only, no handle; aggregate = a non-person rollup card (every handle field null)."},"name":{"type":"string","nullable":true,"description":"Display name (identified), anonymized description (semi-anonymous), or rollup label (aggregate)."},"headline":{"type":"string","nullable":true,"description":"Profile headline — present for identified, null otherwise."},"degree":{"type":"string","nullable":true,"description":"Connection distance \"1st\" | \"2nd\" | \"3rd\", or null when undisclosed."},"viewed_at":{"type":"string","nullable":true,"description":"Human-relative view time as rendered (e.g. \"Viewed 3h ago\") or a mode note. Not a machine timestamp."},"member_id":{"type":"string","nullable":true,"description":"The obfuscated member id (identified only) — the handle other endpoints key on."},"member_urn":{"type":"string","nullable":true,"description":"The member URN (identified only)."},"profile_url":{"type":"string","nullable":true,"description":"Canonical profile URL (identified only)."},"avatar_url":{"type":"string","nullable":true,"description":"Largest available avatar, or null."}}},"description":"The viewer entries for this page — identified + semi-anonymous individuals plus any aggregate rollup cards, most-recent first. [] for a zero-visitor account."},"cursor":{"type":"string","nullable":true,"description":"Opaque cursor for the next page; null when the list is known-exhausted. A non-null cursor means more may exist — keep paging (zero individuals on a page is not exhaustion). There is no total (the upstream total is unreliable)."}}},"examples":{"visitors":{"summary":"A mixed-fidelity page","value":{"object":"profile_visitor_list","items":[{"object":"profile_visitor","kind":"identified","name":"Dana Ellison","headline":"VP of Engineering at ExampleCo","degree":"1st","viewed_at":"Viewed 13h ago","member_id":"ACoAAExampleMemberId0001","member_urn":"urn:li:fsd_profile:ACoAAExampleMemberId0001","profile_url":"https://www.linkedin.com/in/ACoAAExampleMemberId0001/","avatar_url":"https://media.example.com/avatar-0001.jpg"},{"object":"profile_visitor","kind":"semi-anonymous","name":"Someone from Slough","headline":null,"degree":null,"viewed_at":null,"member_id":null,"member_urn":null,"profile_url":null,"avatar_url":null},{"object":"profile_visitor","kind":"aggregate","name":"11 recruiters viewed your profile","headline":null,"degree":null,"viewed_at":null,"member_id":null,"member_urn":null,"profile_url":null,"avatar_url":null}],"cursor":"MjA"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — a query parameter failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"The connected LinkedIn account's session is disconnected — reconnect the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the account is unknown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary upstream error occurred, or the upstream response could not be interpreted. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a cursor-paginated list of the account's recent profile viewers, each classified by disclosure fidelity (identified, semi-anonymous, or an aggregate rollup). A Premium account can see identified viewers; a free account is capped at semi-anonymous fidelity — an in-band result, never an error. Page until cursor is null.","x-order":13}},"/v1/{account_id}/profile/ssi":{"get":{"operationId":"getV1AccountIdProfileSsi","tags":["Users"],"summary":"Get the account's Social Selling Index","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account whose own insights to read."}],"responses":{"200":{"description":"The account's Social Selling Index — overall score, four pillar sub-scores, and industry/network percentile ranks. A free/low-activity account returns a valid low score (a 200, not a 403).","content":{"application/json":{"schema":{"type":"object","required":["object","overall","pillars","industry_rank_pct","network_rank_pct","industry","active_seat","calculated_at"],"properties":{"object":{"type":"string","enum":["profile_ssi"],"description":"Response type discriminator."},"overall":{"type":"number","nullable":true,"description":"The out-of-100 score (float; round for display). null only on a genuine zero-activity empty state. The four pillars sum to overall."},"pillars":{"type":"object","required":["professional_brand","find_right_people","insight_engagement","strong_relationship"],"description":"The four SSI pillar sub-scores (each max 25; a genuine 0 is legitimate).","properties":{"professional_brand":{"type":"number","nullable":true,"description":"\"Establish your professional brand\" pillar."},"find_right_people":{"type":"number","nullable":true,"description":"\"Find the right people\" pillar."},"insight_engagement":{"type":"number","nullable":true,"description":"\"Engage with insights\" pillar."},"strong_relationship":{"type":"number","nullable":true,"description":"\"Build relationships\" pillar."}}},"industry_rank_pct":{"type":"number","nullable":true,"description":"\"Top N% of your industry\" (lower is better)."},"network_rank_pct":{"type":"number","nullable":true,"description":"\"Top N% of your network\" (lower is better)."},"industry":{"type":"string","nullable":true,"description":"The industry the industry-rank is computed against."},"active_seat":{"type":"boolean","description":"Whether the account holds an active Sales Navigator seat (this read doubles as a free seat probe)."},"calculated_at":{"type":"number","nullable":true,"description":"Freshness watermark (epoch ms). Treat 0/null as \"no watermark / computed on read\", not a 1970 date."}}},"examples":{"ssi":{"summary":"A scored account","value":{"object":"profile_ssi","overall":49.058754,"pillars":{"professional_brand":10.280002,"find_right_people":6.98,"insight_engagement":6.95,"strong_relationship":24.848754},"industry_rank_pct":13,"network_rank_pct":30,"industry":"Technology, Information and Internet","active_seat":false,"calculated_at":0}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — a query parameter failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"The connected LinkedIn account's session is disconnected — reconnect the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The LinkedIn account lacks the feature backing this score. Defensive and unobserved — a free account with activity returns a valid 200, not a 403.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the account is unknown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary upstream error occurred, or the upstream response could not be interpreted. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns the connected account's Social Selling Index — the overall score out of 100, the four pillar sub-scores, and the industry/network percentile ranks. A free/low-activity account returns a valid low score (a 200, not an error).","x-order":14}},"/v1/{account_id}/users/{user_id}/followers":{"get":{"operationId":"getV1AccountIdUsersUserIdFollowers","tags":["Following"],"summary":"List a user's followers","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"\"me\" for the caller's own account, or another LinkedIn user's identifier."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":20},"description":"Number of followers to return per page (min 1, default 20)."}],"responses":{"200":{"description":"A page of followers for the requested user, plus the next-page cursor.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["follower_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["follower"],"description":"Response type discriminator."},"id":{"type":"string","description":"The follower's opaque identifier."},"type":{"type":"string","description":"The follower's profile type (e.g. individual)."},"display_name":{"type":"string","description":"The follower's display name."},"public_identifier":{"type":"string","description":"LinkedIn public URL slug (e.g. 'jane-doe')."},"first_name":{"type":"string","description":"First name."},"last_name":{"type":"string","description":"Last name."},"profile_url":{"type":"string","description":"Full LinkedIn profile URL."},"profile_picture_url":{"type":"string","description":"Profile picture URL."},"description":{"type":"string","description":"The user's professional headline."},"specifics":{"type":"object","description":"Structured profile-lens data, when supplied.","additionalProperties":true}},"required":["object","id","display_name"]}},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page."}}},"examples":{"page":{"summary":"First page of followers","value":{"object":"follower_list","items":[{"object":"follower","id":"ACoAAAFOLV2_11111","type":"individual","display_name":"Diana Follower","public_identifier":"diana-follower","first_name":"Diana","last_name":"Follower","profile_url":"https://www.linkedin.com/in/diana-follower/","profile_picture_url":"https://media.example.com/diana.jpg","description":"Engineer"}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit below 1, or malformed cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the requested user was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a paginated list of a LinkedIn user's followers. Use user_id=\"me\" for the caller's own account.","x-order":4}},"/v1/{account_id}/users/{user_id}/following":{"get":{"operationId":"getV1AccountIdUsersUserIdFollowing","tags":["Following"],"summary":"List who a user follows","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"Must be \"me\" — LinkedIn does not allow listing who another user follows."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":20},"description":"Number of accounts to return per page (min 1, default 20)."}],"responses":{"200":{"description":"A page of accounts the requested user follows, plus the next-page cursor.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["following_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["following"],"description":"Response type discriminator."},"id":{"type":"string","description":"The followed account's opaque identifier."},"type":{"type":"string","description":"The followed account's profile type (e.g. individual)."},"display_name":{"type":"string","description":"The followed account's display name."},"public_identifier":{"type":"string","description":"LinkedIn public URL slug (e.g. 'jane-doe')."},"first_name":{"type":"string","description":"First name."},"last_name":{"type":"string","description":"Last name."},"profile_url":{"type":"string","description":"Full LinkedIn profile URL."},"profile_picture_url":{"type":"string","description":"Profile picture URL."},"description":{"type":"string","description":"The user's professional headline."},"specifics":{"type":"object","description":"Structured profile-lens data, when supplied.","additionalProperties":true}},"required":["object","id","display_name"]}},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page."}}},"examples":{"page":{"summary":"First page of following","value":{"object":"following_list","items":[{"object":"following","id":"ACoAAAFOLV2_33333","type":"individual","display_name":"Frank Followed","public_identifier":"frank-followed","first_name":"Frank","last_name":"Followed","profile_url":"https://www.linkedin.com/in/frank-followed/","profile_picture_url":"https://media.example.com/frank.jpg","description":"Product Manager"}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit below 1, or malformed cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the requested user was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the account is restricted and cannot be queried; or LINKEDIN_OPERATION_NOT_SUPPORTED — user_id was not \"me\" (LinkedIn only allows listing the connected account's own following list, a permanent platform limitation).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"account_restricted":{"summary":"Account restricted","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested action.","user_fixable":false,"retry_likely_to_succeed":false}},"non_self_user_id":{"summary":"Non-self user_id (permanent LinkedIn limitation)","value":{"code":"LINKEDIN_OPERATION_NOT_SUPPORTED","message":"This operation is not supported by LinkedIn for the given parameters.","user_fixable":true,"retry_likely_to_succeed":false,"retry_hint":{"kind":"never"}}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a paginated list of LinkedIn accounts this user follows. LinkedIn only allows listing the connected account's OWN following list — user_id MUST be \"me\"; any other value returns a non-retryable error (this is a permanent LinkedIn platform limitation, not a gap in this endpoint). To list another user's followers instead, use GET /v1/{account_id}/users/{user_id}/followers, which does accept an explicit user_id.","x-order":5}},"/v1/{account_id}/users/{user_id}/follow":{"post":{"operationId":"postV1AccountIdUsersUserIdFollow","tags":["Following"],"summary":"Follow a user","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to follow from."},{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"The LinkedIn member ID (`ACo…` format) to follow — a public identifier does not resolve on this endpoint."}],"responses":{"200":{"description":"The user was followed, or (when their profile is private) a connect request was sent instead.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["object"],"properties":{"object":{"type":"string","enum":["user_followed"],"description":"Response type discriminator."}}},{"type":"object","required":["object","id","message","user"],"properties":{"object":{"type":"string","enum":["connect_request_sent"],"description":"Response type discriminator — sent when the target's profile is private."},"id":{"type":"string","description":"The connect request's identifier."},"type":{"type":"string","description":"The connect request's type."},"created_at":{"type":"string","description":"ISO-8601 timestamp when the connect request was created."},"message":{"type":["string","null"],"description":"The connect request's message, or null."},"user":{"type":"object","description":"The target user this connect request was sent to.","properties":{"id":{"type":"string","description":"The target's opaque identifier."},"type":{"type":"string","description":"The target's profile type."},"display_name":{"type":"string","description":"The target's display name."},"public_identifier":{"type":"string","description":"LinkedIn public URL slug."},"first_name":{"type":"string","description":"First name."},"last_name":{"type":"string","description":"Last name."},"profile_url":{"type":"string","description":"Full LinkedIn profile URL."}}}}}]},"examples":{"followed":{"summary":"Followed directly","value":{"object":"user_followed"}},"connect_request":{"summary":"Private profile — connect request sent instead","value":{"object":"connect_request_sent","id":"req_01J8Z3K9P0Q1R2S3T4V5W6X7Y9","type":"CONNECTION","created_at":"2026-07-08T10:00:00.000Z","message":null,"user":{"id":"ACoAAAPRIVATEFOLLOWTARGET0","type":"individual","display_name":"Private Profile","public_identifier":"private-profile"}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Malformed request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The target account is blocked or otherwise restricted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the requested user was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted, or is already following this user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Follows a LinkedIn user. If the target's profile is private, this sends a connect request instead of following directly, and returns connect_request_sent.","x-order":6},"delete":{"operationId":"deleteV1AccountIdUsersUserIdFollow","tags":["Following"],"summary":"Unfollow a user","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to unfollow from."},{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"The LinkedIn member ID (`ACo…` format) to unfollow — a public identifier does not resolve on this endpoint."}],"responses":{"200":{"description":"The user was unfollowed.","content":{"application/json":{"schema":{"type":"object","required":["object"],"properties":{"object":{"type":"string","enum":["user_unfollowed"],"description":"Response type discriminator."}}},"examples":{"unfollowed":{"summary":"Unfollowed","value":{"object":"user_unfollowed"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Malformed request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the requested user was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot unfollow this user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Unfollows a LinkedIn user. Idempotent — unfollowing a user this account does not currently follow still returns 200.","x-order":7}},"/v1/{account_id}/companies/{identifier}":{"get":{"operationId":"getV1AccountIdCompaniesIdentifier","tags":["Companies: Profile"],"summary":"Retrieve a company profile","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account to read with."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company to retrieve. Accepts the company's public handle (the slug in linkedin.com/company/<handle>, e.g. t-systems) or its numeric id (e.g. 1234567). The numeric id field returned on each POST /v1/{account_id}/search/companies result, or the id field of this endpoint's own response, can be passed here directly."}],"responses":{"200":{"description":"The company's LinkedIn profile. Content fields (description, tagline) are returned verbatim and are never stored. follower_count is the audience-size signal that replaces the retired company followers list.","content":{"application/json":{"schema":{"type":"object","required":["object","id","name"],"properties":{"object":{"type":"string","enum":["company_profile"],"description":"Response type discriminator."},"id":{"type":"string","description":"LinkedIn company numeric identifier."},"name":{"type":"string","description":"Company display name."},"description":{"type":"string","description":"Company description (content pass-through, never stored)."},"public_identifier":{"type":"string","description":"LinkedIn public slug (the segment after linkedin.com/company/)."},"profile_url":{"type":"string","description":"Full LinkedIn company profile URL."},"public_picture_url":{"type":"string","description":"URL of the company's public logo/profile picture (when available)."},"tagline":{"type":"string","description":"Short company tagline (when set)."},"follower_count":{"type":"number","description":"Total follower count: the audience-size signal (replaces the retired company followers list)."},"is_active":{"type":"boolean","description":"Whether the company page is active."},"is_archived":{"type":"boolean","description":"Whether the company page has been archived."},"is_verified":{"type":"boolean","description":"Whether the company has a verified LinkedIn organization badge."},"verified_at":{"type":"string","description":"Timestamp the company was verified (present when is_verified is true)."},"phone":{"type":"string","description":"Company contact phone number (when available)."},"funding":{"type":"object","description":"Funding round details (when available). Never observed on a live probe so far; shape is not fabricated."},"acquired_by":{"type":"object","description":"Acquiring-company details (when the company has been acquired). Never observed on a live probe so far; shape is not fabricated."},"hashtags":{"type":"array","description":"Hashtags associated with the company page (without the # prefix).","items":{"type":"string"}},"locations":{"type":"array","description":"Company office locations.","items":{"type":"object","properties":{"is_headquarter":{"type":"boolean","description":"Whether this is the headquarters location."},"country_code":{"type":"string","description":"Country code."},"city":{"type":"string","description":"City name."},"postal_code":{"type":"string","description":"Postal code (when available)."}}}},"industry":{"type":"array","items":{"type":"string"},"description":"Industry categories (when available)."},"website":{"type":"string","description":"Company website URL (when available)."},"establishment_year":{"type":"number","description":"Year the company was established (when available)."},"fields_of_expertise":{"type":"array","items":{"type":"string"},"description":"Specialty areas (when available)."},"insights":{"type":"object","description":"Aggregated insights about the company (when available).","properties":{"headcount":{"type":"number","description":"Current employee headcount."},"headcount_range":{"type":"object","description":"Employee headcount range. No upper bound is documented: open-ended-high.","properties":{"from":{"type":"number","description":"Lower bound of the range."}}},"headcount_growth":{"type":"array","description":"Historical headcount snapshots over time.","items":{"type":"object","properties":{"date":{"type":"string","description":"Snapshot date."},"headcount":{"type":"number","description":"Headcount at that date."}}}},"growth_periods":{"type":"array","description":"Headcount growth rate over recent periods.","items":{"type":"object","properties":{"months_range":{"type":"number","description":"Length of the period, in months."},"percentage":{"type":"number","description":"Growth percentage over the period."}}}},"average_tenure":{"type":"number","description":"Average employee tenure, in years."}}}}},"examples":{"companyProfile":{"summary":"Company profile","value":{"object":"company_profile","id":"1234567","name":"Acme Corporation","description":"A global leader in innovative solutions.","public_identifier":"acme-corporation","profile_url":"https://www.linkedin.com/company/acme-corporation","public_picture_url":"https://media.example.com/acme-logo.png","tagline":"Innovation at scale.","follower_count":50000,"is_active":true,"is_archived":false,"is_verified":true,"verified_at":"2020-03-15T00:00:00.000Z","phone":"+1-555-0100","hashtags":["innovation","technology"],"locations":[{"is_headquarter":true,"country_code":"US","city":"San Francisco","postal_code":"94102"}],"industry":["Software Development"],"website":"https://www.acme.com","establishment_year":2001,"fields_of_expertise":["Cloud Computing"],"insights":{"headcount":12000,"headcount_range":{"from":10001},"headcount_growth":[{"date":"2026-01","headcount":11800},{"date":"2026-06","headcount":12000}],"growth_periods":[{"months_range":6,"percentage":1.7}],"average_tenure":4.1}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id or identifier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the company was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a company's full LinkedIn profile including page details, viewer permissions, locations, and funding information.","x-order":1}},"/v1/{account_id}/companies/{identifier}/employees":{"get":{"operationId":"getV1AccountIdCompaniesIdentifierEmployees","tags":["Companies: Profile"],"summary":"List a company's employees","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account to read with."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"description":"Number of employees to return per page (1–50, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."},{"name":"keywords","in":"query","required":false,"schema":{"type":"string"},"description":"Free-text keyword filter across employee profile fields."},{"name":"location","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque location id from GET /v1/{account_id}/search/parameters?type=LOCATION."}],"responses":{"200":{"description":"A page of people who currently work at the company.","content":{"application/json":{"schema":{"type":"object","required":["object","items","paging","cursor"],"properties":{"object":{"type":"string","enum":["company_employee_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"People who currently work at the company.","items":{"type":"object","description":"A single person search result. Only id is guaranteed present — other fields appear when the platform populates them.","properties":{"id":{"type":"string","description":"Opaque LinkedIn member URN for this person (e.g. ACoAA…)."},"member_id":{"type":"string","description":"Numeric LinkedIn member id, distinct from id. Present when available."},"public_identifier":{"type":"string","description":"LinkedIn public identifier (the slug after linkedin.com/in/). Present when available."},"full_name":{"type":"string","description":"Full display name. Present when available."},"headline":{"type":"string","description":"LinkedIn headline. Present when available."},"location":{"type":"string","description":"Location as set on the profile. Present when available."},"avatar_url":{"type":"string","description":"Profile picture URL. Present when available."},"profile_picture_url_large":{"type":"string","description":"Larger profile picture URL variant. Present when available."},"profile_url":{"type":"string","description":"LinkedIn profile URL. Present when available."},"network_distance":{"type":"string","enum":["SELF","FIRST_DEGREE","SECOND_DEGREE","THIRD_DEGREE","OUT_OF_NETWORK"],"description":"Connection distance to the authenticated account. Present when available."},"is_premium":{"type":"boolean","description":"true if this is a LinkedIn Premium account. Present when available."},"is_verified":{"type":"boolean","description":"true if the account is verified. Present when available."}},"required":["id"]}},"paging":{"type":"object","required":["total_count"],"properties":{"total_count":{"type":"number","description":"Total number of matching employees across all pages."}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null when there are no more results."}}},"examples":{"companyEmployeeList":{"summary":"A page of company employees","value":{"object":"company_employee_list","items":[{"id":"ACoAABcDeFgHiJkLmNoPqRsTuVwXyZ1234567890","linkedin_urn":"urn:li:member:99999","public_identifier":"frank-employee","full_name":"Frank Employee","headline":"Software Engineer","location":"Berlin, Germany","avatar_url":null,"network_distance":null}],"paging":{"total_count":2},"cursor":"cursor_company_employees_001"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id; a non-numeric identifier; or a malformed location filter value.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a paginated list of people who currently work at the company. A facade over people search with the company filter applied; filter further with keywords or location.","x-order":2}},"/v1/{account_id}/companies/{identifier}/posts":{"get":{"operationId":"getV1AccountIdCompaniesIdentifierPosts","tags":["Companies: Profile"],"summary":"List a company's posts","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account to read with."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"description":"Number of posts to return per page (1–50, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."}],"responses":{"200":{"description":"A page of the company's posts. Post text is returned verbatim and is never stored.","content":{"application/json":{"schema":{"type":"object","required":["object","items","paging","cursor"],"properties":{"object":{"type":"string","enum":["company_post_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"The company's posts.","items":{"type":"object","description":"A single post search result. Post text, engagement counters, author, and attachments are included when available. No posting-date field is included — the platform does not expose a reliable post-creation timestamp on search results.","properties":{"id":{"type":"string","description":"Opaque platform id identifying the post."},"share_url":{"type":"string","description":"Shareable post URL. Present when available."},"text":{"type":"string","description":"Post text content. Present when available."},"author":{"type":"object","description":"Post author object. Present when available.","properties":{"id":{"type":"string"},"name":{"type":"string"},"is_company":{"type":"boolean"},"public_identifier":{"type":"string"}},"additionalProperties":true},"permissions":{"type":"object","description":"Interaction permissions on this post. Present when available.","properties":{"can_react":{"type":"boolean"},"can_share":{"type":"boolean"},"can_post_comments":{"type":"boolean"}}},"is_repost":{"type":"boolean","description":"true if this post is a repost. Present when available."},"attachments":{"type":"array","description":"Post attachments array. Present when the post carries attachments.","items":{"type":"object","additionalProperties":true}},"reactions":{"type":"array","description":"Per-reaction-type breakdown. Present when the post has reactions.","items":{"type":"object","properties":{"type":{"type":"string","description":"Reaction type (e.g. like, celebrate)."},"count":{"type":"number"}}}},"reaction_count":{"type":"number","description":"Total reaction count — the sum of reactions[].count."},"comment_count":{"type":"number","description":"Total comment count on the post."},"repost_count":{"type":"number","description":"Total repost count on the post."}},"required":["id","reaction_count","comment_count","repost_count"]}},"paging":{"type":"object","required":["total_count"],"properties":{"total_count":{"type":"number","description":"Total number of matching posts across all pages."}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null when there are no more results."}}},"examples":{"companyPostList":{"summary":"A page of company posts","value":{"object":"company_post_list","items":[{"post_urn":"urn:li:activity:coppost_1","posted_at":"2026-06-01T10:00:00.000Z","reaction_count":10,"comment_count":1,"repost_count":0,"text":"We are hiring senior engineers. Check us out!","share_url":"https://www.linkedin.com/feed/update/urn:li:activity:coppost_1","author":{"id":"12345678","name":"Acme Corp","is_company":true},"attachments":[]}],"paging":{"total_count":3},"cursor":"cursor_company_posts_001"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id, or a non-numeric identifier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a paginated list of the company's posts. A facade over post search with the company filter applied.","x-order":3}},"/v1/{account_id}/companies/{identifier}/jobs":{"get":{"operationId":"getV1AccountIdCompaniesIdentifierJobs","tags":["Companies: Profile"],"summary":"List a company's open jobs","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account to read with."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"description":"Number of jobs to return per page (1–50, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."},{"name":"keywords","in":"query","required":false,"schema":{"type":"string"},"description":"Free-text keyword filter across job postings."}],"responses":{"200":{"description":"A page of the company's open job postings. An empty items[] is a valid result (the company currently has no open postings); not an error.","content":{"application/json":{"schema":{"type":"object","required":["object","items","paging","cursor"],"properties":{"object":{"type":"string","enum":["company_job_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"The company's open job postings.","items":{"type":"object","description":"A single job search result. Job description text is never returned.","properties":{"id":{"type":"string","description":"The job posting's id (same value as job_urn), for chaining into get_job."},"job_urn":{"type":"string","description":"LinkedIn URN identifying the job posting."},"title":{"type":"string","description":"Job title. Present when available."},"location":{"type":"string","description":"Job location. Present when available."},"url":{"type":"string","description":"Direct URL to the job posting. Present when available."},"posted_at":{"type":"string","description":"Approximate posting date in ISO-8601 format. Present when available."},"workplace_type":{"type":"string","enum":["on_site","remote","hybrid"],"description":"Work arrangement, lowercase in the response. Present when available."},"easy_apply":{"type":"boolean","description":"true if the posting supports LinkedIn Easy Apply. Present when available."},"is_promoted":{"type":"boolean","description":"true if this is a promoted job. Present when available."},"is_repost":{"type":"boolean","description":"true if this listing is a repost. Present when available."},"few_applicants":{"type":"boolean","description":"true if the posting has few applicants. Present when available."},"insights":{"type":"array","description":"Platform-provided insight strings about this posting. Present when available.","items":{"type":"string"}},"company":{"type":"object","description":"Hiring company details. Present when available.","properties":{"id":{"type":"string"},"name":{"type":"string"},"profile_url":{"type":"string"},"public_identifier":{"type":"string"},"public_picture_url":{"type":"string"}},"additionalProperties":true}},"required":["id","job_urn"]}},"paging":{"type":"object","required":["total_count"],"properties":{"total_count":{"type":"number","description":"Total number of matching job postings across all pages."}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null when there are no more results."}}},"examples":{"companyJobList":{"summary":"A page of the company's open jobs","value":{"object":"company_job_list","items":[{"job_urn":"urn:li:job:coop_job_1","reference_id":"coop_ref_1","title":"Senior Platform Engineer","location":"Berlin, Germany","posted_at":"2026-06-01T08:00:00.000Z","reposted":false,"url":"https://www.linkedin.com/jobs/view/coop_job_1","promoted":false,"benefits":[],"easy_apply":true,"company":{"id":"12345678","name":"Acme Corp","profile_url":"https://www.linkedin.com/company/acme-corp","public_identifier":"acme-corp","profile_picture_url":null}}],"paging":{"total_count":2},"cursor":"cursor_company_jobs_001"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id; or a non-numeric identifier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a paginated list of the company's open job postings. A facade over job search with the company filter applied; filter further with keywords. An empty list is a valid result when the company currently has no open postings.","x-order":4}},"/v1/{account_id}/companies/{identifier}/follow-invite":{"post":{"operationId":"postV1AccountIdCompaniesIdentifierFollowInvite","tags":["Companies: Profile"],"summary":"Invite connections to follow a company page","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account, which must administer the page with invite rights."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."}],"responses":{"200":{"description":"One per-invitee outcome for each requested member, in request order, for an all-valid request. If any invitee id is invalid, the whole request is rejected (404), with no partial success. Re-inviting an already-invited member returns the same invitation id with status \"already_invited\", an idempotent no-op, never a duplicate. Only identifiers transit; nothing is stored.","content":{"application/json":{"schema":{"type":"object","required":["object","results"],"properties":{"object":{"type":"string","enum":["company_follow_invite_result"],"description":"Response type discriminator."},"results":{"type":"array","description":"One entry per requested invitee, in request order, for an all-valid request. If any invitee id is invalid, the whole request is rejected (404), with no partial success.","items":{"type":"object","required":["object","invitee_id","status","invitation_id","error"],"properties":{"object":{"type":"string","enum":["company_follow_invite"],"description":"Item type discriminator."},"invitee_id":{"type":"string","description":"The member id from the request, echoed back."},"status":{"type":"string","enum":["invited","already_invited","ineligible","not_found"],"description":"Per-invitee outcome. \"invited\": a new follow-invitation was created. \"already_invited\": a pending invitation already existed (idempotent no-op; the same invitation_id is returned, never a duplicate). \"ineligible\": the member is not an invitable 1st-degree connection. \"not_found\": the member id did not resolve."},"invitation_id":{"type":["string","null"],"description":"The invitation id, present for \"invited\" and \"already_invited\", null for a per-invitee failure."},"error":{"type":["object","null"],"description":"Present only for a per-invitee failure (\"ineligible\" / \"not_found\"); null otherwise.","properties":{"code":{"type":"string","description":"Canonical error code for this invitee's failure."},"message":{"type":"string","description":"Human-readable failure reason."}}}}}}}},"examples":{"companyFollowInviteResult":{"summary":"A batch: one fresh invite + one already-invited (idempotent)","value":{"object":"company_follow_invite_result","results":[{"object":"company_follow_invite","invitee_id":"ACoAAExampleInvitee0001","status":"invited","invitation_id":"urn:li:fsd_invitation:7480000000000000001","error":null},{"object":"company_follow_invite","invitee_id":"ACoAAExampleInvitee0002","status":"already_invited","invitation_id":"urn:li:fsd_invitation:7483788354204020736","error":null}]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Empty, over-cap (>50), or malformed invitee_ids, or a non-numeric identifier, rejected before any send.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not administer this page with the invite-to-follow entitlement (fail-closed), or lacks the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or a wholly-invalid invitee did not resolve.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot perform this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"The follow-invite credit or rate budget is exhausted. Slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Invites one or more of the connected account's 1st-degree connections to follow a company page it administers with the invite-to-follow entitlement. Pass the AC… member ids from an invitable-followers read. Returns one outcome per invitee, in request order, for an all-valid request. If any invitee id is invalid, the whole request is rejected (404), with no partial success. Re-inviting an already-invited member is a safe no-op (the same invitation id, never a duplicate). Only identifiers transit. Nothing is stored.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"invitee_ids":{"type":"array","items":{"type":"string"},"description":"The AC… member ids to invite to follow the page. Each is the id field of an invitable-followers read. Required, 1 to 50 per request."}},"required":["invitee_ids"]},"examples":{"single":{"summary":"Invite one connection to follow the page","value":{"invitee_ids":["ACoAAExampleInvitee0001"]}},"batch":{"summary":"Invite several connections in one request","value":{"invitee_ids":["ACoAAExampleInvitee0001","ACoAAExampleInvitee0002"]}}}}}},"x-order":5}},"/v1/{account_id}/companies/{identifier}/followers":{"get":{"operationId":"getV1AccountIdCompaniesIdentifierFollowers","tags":["Companies: Profile"],"summary":"List company followers","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account, which must administer the page."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"description":"Number of followers to return per page (1–50, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response's cursor. Omit for the first page."}],"responses":{"200":{"description":"A page of the company page's followers; the admin analytics follower list. Follower names and headlines are returned verbatim and are never stored. Page until cursor is null.","content":{"application/json":{"schema":{"type":"object","required":["object","items","cursor"],"properties":{"object":{"type":"string","enum":["company_follower_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"The page's followers, newest first.","items":{"type":"object","required":["object","id"],"properties":{"object":{"type":"string","enum":["company_follower"],"description":"Item type discriminator."},"id":{"type":"string","description":"The follower's member id."},"name":{"type":["string","null"],"description":"Follower display name (content pass-through, never stored)."},"headline":{"type":["string","null"],"description":"Follower headline (content pass-through, never stored)."},"public_identifier":{"type":["string","null"],"description":"Vanity slug."},"profile_url":{"type":["string","null"],"description":"Canonical profile URL."},"degree":{"type":["string","null"],"description":"Network degree relative to the acting account: 1st | 2nd | 3rd | out-of-network | self | null."},"picture_url":{"type":["string","null"],"description":"Best-effort avatar URL."},"followed_at":{"type":["string","null"],"description":"Month/year the follow began (e.g. \"June 2026\"). Nothing finer is exposed per follower. Rely on the newest-first list order for ordering."}}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null at end-of-list."}}},"examples":{"companyFollowerList":{"summary":"A page of company followers","value":{"object":"company_follower_list","items":[{"object":"company_follower","id":"ACoAAExampleFollower0001","name":"Dana Ellison","headline":"VP of Engineering at ExampleCo","public_identifier":"dana-ellison-example","profile_url":"https://www.linkedin.com/in/dana-ellison-example/","degree":"2nd","picture_url":"https://media.example.com/follower-0001.jpg","followed_at":"June 2026"}],"cursor":"eyJzIjoyMCwidCI6IjE3MDAwMDAwMDAwMDAifQ"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"A non-numeric identifier, a malformed cursor, or a limit out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not administer this page (follower analytics is admin-gated), or lacks the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the company id does not resolve to a page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a page of a company page's followers; the admin analytics follower list. The connected account must administer the page with follower-analytics rights. Each follower carries their network degree relative to the acting account and follow month. Page until cursor is null.","x-order":6}},"/v1/{account_id}/companies/{identifier}/invitable-followers":{"get":{"operationId":"getV1AccountIdCompaniesIdentifierInvitableFollowers","tags":["Companies: Profile"],"summary":"List connections invitable to follow a company page","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account, which must administer the page with invite rights."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"description":"Number of invitable connections to return per page (1–50, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response's cursor. Omit for the first page."}],"responses":{"200":{"description":"A page of the account's connections invitable to follow the page. The account must administer the page with the invite-to-follow entitlement. Page until cursor is null.","content":{"application/json":{"schema":{"type":"object","required":["object","items","cursor"],"properties":{"object":{"type":"string","enum":["invitable_connection_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"Connections invitable to follow the page.","items":{"type":"object","required":["object","id","profile_urn"],"properties":{"object":{"type":"string","enum":["invitable_connection"],"description":"Item type discriminator."},"id":{"type":"string","description":"The connection's stable profile id."},"profile_urn":{"type":"string","description":"Native profile urn (same underlying id as id)."},"invite_token":{"type":["string","null"],"description":"Opaque per-suggestion correlation token, passed through verbatim; null when the read does not surface one."}}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null when exhausted."}}},"examples":{"invitableConnectionList":{"summary":"A page of invitable connections","value":{"object":"invitable_connection_list","items":[{"object":"invitable_connection","id":"ACoAAExampleInvitee0001","profile_urn":"urn:li:fsd_profile:ACoAAExampleInvitee0001","invite_token":"b3f2c1a0d9e8f7a6"}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"A non-numeric identifier, a malformed cursor, or a limit out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not administer this page with the invite-to-follow entitlement, or lacks the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the company id does not resolve to a page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a page of the connected account's connections who can be invited to follow a company page it administers. The account must administer the page with the invite-to-follow entitlement. This is the read that seeds a follow-invite campaign. Page until cursor is null.","x-order":7}},"/v1/{account_id}/companies/{identifier}/chats":{"get":{"operationId":"getV1AccountIdCompaniesIdentifierChats","tags":["Companies: Inbox"],"summary":"List a company page's admin conversations","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account, which must administer the page."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"description":"Number of conversations to return per page (1–50, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response's cursor. Omit for the first page."}],"responses":{"200":{"description":"A page of the company page's admin conversations, newest-activity-first. Participant names and last_message.text are returned verbatim and are never stored. An empty admin inbox returns an empty list; never a 403. Page until cursor is null.","content":{"application/json":{"schema":{"type":"object","required":["object","items","cursor"],"properties":{"object":{"type":"string","enum":["company_chat_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"The admin conversations, newest-activity-first.","items":{"type":"object","required":["object","id","is_group_chat","participants","unread_count","last_activity_at","last_message"],"properties":{"object":{"type":"string","enum":["company_chat"],"description":"Response type discriminator."},"id":{"type":"string","description":"The conversation id (2-… form): the key for retrieve-chat and get-messages."},"is_group_chat":{"type":"boolean","description":"Group vs 1:1 conversation."},"title":{"type":["string","null"],"description":"Group title, or the other participant's name for a 1:1."},"participants":{"type":"array","description":"The human participants (the company page itself is excluded).","items":{"type":"object","required":["id","name","kind","profile_url"],"properties":{"id":{"type":"string","description":"The participant's member id."},"name":{"type":"string","description":"Display name (content pass-through, never stored)."},"kind":{"type":"string","enum":["member"],"description":"Participant kind: always \"member\" (the page itself is excluded)."},"headline":{"type":["string","null"],"description":"Member headline (content pass-through, never stored)."},"profile_url":{"type":"string","description":"Canonical member profile URL."}}}},"unread_count":{"type":"integer","description":"Unread message count (0 = read)."},"last_activity_at":{"type":["number","null"],"description":"Epoch-ms of last activity; also the newest-first pagination anchor."},"last_message":{"type":["object","null"],"description":"Last-message preview. text is a content pass-through: present on a fresh read, never stored.","properties":{"sender_id":{"type":"string","description":"Sender's member id."},"sent_at":{"type":"number","description":"Epoch-ms delivery time."},"text":{"type":["string","null"],"description":"Message body (content pass-through, never stored)."}}}}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null at end-of-list."}}},"examples":{"companyChatList":{"summary":"A page of admin conversations","value":{"object":"company_chat_list","items":[{"object":"company_chat","id":"2-YWRtaW4tY2hhdC1hLTAwMDE9PQ==","is_group_chat":false,"title":"Dana Ellison","participants":[{"id":"ACoAAExampleMember0001","name":"Dana Ellison","kind":"member","headline":"Head of Platform at ExampleCo","profile_url":"https://www.linkedin.com/in/dana-ellison-example/"}],"unread_count":0,"last_activity_at":1783415709326,"last_message":{"sender_id":"ACoAAExampleMember0001","sent_at":1783415709326,"text":"Following up on the onboarding question from earlier. Any update?"}}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"A non-numeric identifier, a malformed cursor, or a limit out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not administer this page (the admin gate), or lacks the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"},{"name":"Beta","position":"after","color":"#60A5FA"}],"x-curviate-stability":"beta","description":"Returns the conversations in a company page's admin message inbox, newest-activity-first. The connected account must administer the page. Content passes through and is never stored. Beta: deep pagination is being validated at scale. Single-page listing and termination are verified; deep pagination (many pages / large cursor round-trips) is provisional until validated against a busier inbox.","x-order":8}},"/v1/{account_id}/companies/{identifier}/chats/{chat_id}":{"get":{"operationId":"getV1AccountIdCompaniesIdentifierChatsChatId","tags":["Companies: Inbox"],"summary":"Retrieve one admin conversation","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account, which must administer the page."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The conversation id in the \"2-…\" form, the id field of a chats list or search result. Pass it verbatim."}],"responses":{"200":{"description":"A single admin conversation, the same shape as a list item. last_message.text is returned verbatim and is never stored.","content":{"application/json":{"schema":{"type":"object","required":["object","id","is_group_chat","participants","unread_count","last_activity_at","last_message"],"properties":{"object":{"type":"string","enum":["company_chat"],"description":"Response type discriminator."},"id":{"type":"string","description":"The conversation id (2-… form): the key for retrieve-chat and get-messages."},"is_group_chat":{"type":"boolean","description":"Group vs 1:1 conversation."},"title":{"type":["string","null"],"description":"Group title, or the other participant's name for a 1:1."},"participants":{"type":"array","description":"The human participants (the company page itself is excluded).","items":{"type":"object","required":["id","name","kind","profile_url"],"properties":{"id":{"type":"string","description":"The participant's member id."},"name":{"type":"string","description":"Display name (content pass-through, never stored)."},"kind":{"type":"string","enum":["member"],"description":"Participant kind: always \"member\" (the page itself is excluded)."},"headline":{"type":["string","null"],"description":"Member headline (content pass-through, never stored)."},"profile_url":{"type":"string","description":"Canonical member profile URL."}}}},"unread_count":{"type":"integer","description":"Unread message count (0 = read)."},"last_activity_at":{"type":["number","null"],"description":"Epoch-ms of last activity; also the newest-first pagination anchor."},"last_message":{"type":["object","null"],"description":"Last-message preview. text is a content pass-through: present on a fresh read, never stored.","properties":{"sender_id":{"type":"string","description":"Sender's member id."},"sent_at":{"type":"number","description":"Epoch-ms delivery time."},"text":{"type":["string","null"],"description":"Message body (content pass-through, never stored)."}}}}},"examples":{"companyChat":{"summary":"One admin conversation","value":{"object":"company_chat","id":"2-YWRtaW4tY2hhdC1hLTAwMDE9PQ==","is_group_chat":false,"title":"Dana Ellison","participants":[{"id":"ACoAAExampleMember0001","name":"Dana Ellison","kind":"member","headline":"Head of Platform at ExampleCo","profile_url":"https://www.linkedin.com/in/dana-ellison-example/"}],"unread_count":0,"last_activity_at":1783415709326,"last_message":{"sender_id":"ACoAAExampleMember0001","sent_at":1783415709326,"text":"Following up on the onboarding question from earlier. Any update?"}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"A non-numeric identifier, or a malformed/empty chat_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not administer this page (the admin gate), or lacks the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the conversation is not in this mailbox.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a single conversation from a company page's admin inbox by id; the same shape as a list item. The connected account must administer the page.","x-order":9}},"/v1/{account_id}/companies/{identifier}/chats/{chat_id}/messages":{"get":{"operationId":"getV1AccountIdCompaniesIdentifierChatsChatIdMessages","tags":["Companies: Inbox"],"summary":"List a conversation's messages","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account, which must administer the page."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The conversation id in the \"2-…\" form, the id field of a chats list or search result. Pass it verbatim."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"description":"Number of messages to return per page (1–50, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response's cursor. Omit for the first page."}],"responses":{"200":{"description":"A page of a conversation's messages, newest-first. Message text is returned verbatim and is never stored. A genuinely empty (but existing) thread returns an empty list; an unknown conversation returns 404. Page until cursor is null.","content":{"application/json":{"schema":{"type":"object","required":["object","items","cursor"],"properties":{"object":{"type":"string","enum":["company_chat_message_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"The thread's messages, newest-first.","items":{"type":"object","required":["object","id","conversation_id","sender","sent_at"],"properties":{"object":{"type":"string","enum":["company_chat_message"],"description":"Response type discriminator."},"id":{"type":"string","description":"The message id (2-… form)."},"conversation_id":{"type":"string","description":"The parent conversation id (2-… form)."},"sender":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string","description":"Sender's member id."},"name":{"type":["string","null"],"description":"Sender display name (content pass-through, never stored)."}}},"sent_at":{"type":"number","description":"Epoch-ms delivery time; also the newest-first pagination anchor."},"text":{"type":["string","null"],"description":"Message body (content pass-through, never stored)."}}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null at end-of-list."}}},"examples":{"companyChatMessageList":{"summary":"A page of thread messages","value":{"object":"company_chat_message_list","items":[{"object":"company_chat_message","id":"2-bXNnLWEtMDAwMS0wMDAxPT0=","conversation_id":"2-YWRtaW4tY2hhdC1hLTAwMDE9PQ==","sender":{"id":"ACoAAExampleMember0001","name":"Dana Ellison"},"sent_at":1783415709326,"text":"Following up on the onboarding question from earlier. Any update?"}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"A non-numeric identifier, or a malformed/empty chat_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not administer this page (the admin gate), or lacks the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the conversation does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a page of one conversation's messages, newest-first. Message text passes through and is never stored. An unknown conversation returns 404 (the empty page is not trusted at face value); a genuinely empty existing thread returns an empty list. The connected account must administer the page.","x-order":10},"post":{"operationId":"postV1AccountIdCompaniesIdentifierChatsChatIdMessages","tags":["Companies: Inbox"],"summary":"Reply as the company page","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account, which must administer the page."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The conversation id in the \"2-…\" form, the id field of a chats list or search result. Pass it verbatim."}],"responses":{"201":{"description":"Message sent as the page. Returns the new message_id and sent_as, the acting identity, always kind:'company' on this endpoint. company_id is null when the page could not be correlated to a managed page on Curviate, even though the page itself and its name are still known.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["message_sent"],"description":"Response type discriminator."},"message_id":{"type":"string","description":"The sent message's identifier."},"sent_as":{"type":"object","description":"The identity this message was actually sent as.","properties":{"kind":{"type":"string","enum":["personal","company"],"description":"Which identity sent the message."},"company_id":{"type":["string","null"],"description":"Company inboxes only. Null when this page is not one of the account's managed companies on Curviate, even though the page itself, and its name, are still known."},"name":{"type":["string","null"],"description":"Company inboxes only. The page's display name, or null in the rare case the page itself could not be resolved at all."}}}}},"examples":{"sentAsCompany":{"summary":"Message sent as the page","value":{"object":"message_sent","message_id":"1-GGGG7777HHHH8888IIII","sent_as":{"kind":"company","company_id":"112013061","name":"RedHire"}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Empty body or neither text nor attachment supplied, a non-numeric identifier, or a malformed chat_id (not a conversation id in the 2-… form).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not administer this page (fail-closed, the target company is absent from the account's administered pages), or the account lacks the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"413":{"description":"Payload too large, an attachment exceeds 5 MiB or the total body exceeds 8 MiB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"413 error","value":{"code":"PAYLOAD_TOO_LARGE","message":"An uploaded part or the request body exceeds the size limit.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"415":{"description":"Unsupported media type, the request must use application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"415 error","value":{"code":"UNSUPPORTED_MEDIA_TYPE","message":"The request content type or attachment format is not accepted.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited, slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Sends a message into an existing company-inbox conversation, as the page. chat_id is the conversation id from GET /v1/{account_id}/companies/{identifier}/chats, the same 2-… id this group's chat reads return, passed verbatim. The connected account must administer the page. Reply-only: a page can never start a new conversation, only answer an existing one. Send application/json with text, base64 attachments (max 5 MiB per file), or both; at least one of text or attachments is required. Message content passes through to the platform and is never stored. The response's sent_as field names the acting identity that was actually used.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"Message text (1–8000 chars). Optional when at least one attachment is supplied."},"quote_id":{"type":"string","description":"Optional message ID to quote or reply to."},"attachments":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string","description":"Base64-encoded file bytes."},"content_type":{"type":"string","description":"Attachment MIME type (e.g. image/png, application/pdf)."},"filename":{"type":"string","description":"File name for the attachment."}},"required":["content","content_type","filename"]},"description":"Optional file attachments (base64-encoded)."}}},"examples":{"textOnly":{"summary":"Reply with plain text","value":{"text":"Thanks for reaching out, happy to help!"}},"withAttachment":{"summary":"Reply with a base64 file attachment","value":{"text":"Here is the info sheet you asked about.","attachments":[{"content":"aGVsbG8=","content_type":"application/pdf","filename":"info-sheet.pdf"}]}}}}}},"x-order":13}},"/v1/{account_id}/companies/{identifier}/chats/{chat_id}/messages/{message_id}":{"get":{"operationId":"getV1AccountIdCompaniesIdentifierChatsChatIdMessagesMessageId","tags":["Companies: Inbox"],"summary":"Retrieve one message from a conversation","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account, which must administer the page."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The conversation id in the \"2-…\" form, the id field of a chats list or search result. Pass it verbatim."},{"name":"message_id","in":"path","required":true,"schema":{"type":"string"},"description":"The message id in the \"2-…\" form, the id field of a messages list result. Always resolved scoped to its chat_id."}],"responses":{"200":{"description":"A single message from a conversation, the same shape as a messages-list item. Message text is returned verbatim and is never stored.","content":{"application/json":{"schema":{"type":"object","required":["object","id","conversation_id","sender","sent_at"],"properties":{"object":{"type":"string","enum":["company_chat_message"],"description":"Response type discriminator."},"id":{"type":"string","description":"The message id (2-… form)."},"conversation_id":{"type":"string","description":"The parent conversation id (2-… form)."},"sender":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string","description":"Sender's member id."},"name":{"type":["string","null"],"description":"Sender display name (content pass-through, never stored)."}}},"sent_at":{"type":"number","description":"Epoch-ms delivery time; also the newest-first pagination anchor."},"text":{"type":["string","null"],"description":"Message body (content pass-through, never stored)."}}},"examples":{"companyChatMessage":{"summary":"One message","value":{"object":"company_chat_message","id":"2-bXNnLWEtMDAwMS0wMDAxPT0=","conversation_id":"2-YWRtaW4tY2hhdC1hLTAwMDE9PQ==","sender":{"id":"ACoAAExampleMember0001","name":"Dana Ellison"},"sent_at":1783415709326,"text":"Following up on the onboarding question from earlier. Any update?"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"A non-numeric identifier, or a malformed/empty chat_id or message_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not administer this page (the admin gate), or lacks the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the message is not in this conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a single message from a company page's admin inbox, scoped to its conversation; the same shape as a messages-list item. Both chat_id and message_id are required. The connected account must administer the page.","x-order":11}},"/v1/{account_id}/companies/{identifier}/chats/search":{"get":{"operationId":"getV1AccountIdCompaniesIdentifierChatsSearch","tags":["Companies: Inbox"],"summary":"Search or filter a company page's admin inbox","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account, which must administer the page."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The company's numeric id (e.g. 112013061), the id field of GET /v1/{account_id}/companies/{identifier} or a POST /v1/{account_id}/search/companies result. A public handle or URN is not accepted here; pass the numeric id."},{"name":"query","in":"query","required":false,"schema":{"type":"string"},"description":"Free-text mode: matches participant names AND message content. Mutually exclusive with topic and unread."},{"name":"topic","in":"query","required":false,"schema":{"type":"string"},"description":"Filter mode, one inbox topic card: 1–5 or its name (Service request, Request a demo, Support, Careers, Other). Mutually exclusive with query and unread."},{"name":"unread","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter mode: unread conversations only. Pass unread=true. Mutually exclusive with query and topic."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"description":"Number of conversations to return per page (1–50, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response's cursor. Omit for the first page."}],"responses":{"200":{"description":"A page of matching admin conversations: free-text search (query) OR one topic/unread filter, exactly one per call. filter_effective is present and true only in topic/unread filter mode. A no-match search returns an empty list. Participant names and last_message.text pass through verbatim and are never stored.","content":{"application/json":{"schema":{"type":"object","required":["object","items","cursor"],"properties":{"object":{"type":"string","enum":["company_chat_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"The matching admin conversations.","items":{"type":"object","required":["object","id","is_group_chat","participants","unread_count","last_activity_at","last_message"],"properties":{"object":{"type":"string","enum":["company_chat"],"description":"Response type discriminator."},"id":{"type":"string","description":"The conversation id (2-… form): the key for retrieve-chat and get-messages."},"is_group_chat":{"type":"boolean","description":"Group vs 1:1 conversation."},"title":{"type":["string","null"],"description":"Group title, or the other participant's name for a 1:1."},"participants":{"type":"array","description":"The human participants (the company page itself is excluded).","items":{"type":"object","required":["id","name","kind","profile_url"],"properties":{"id":{"type":"string","description":"The participant's member id."},"name":{"type":"string","description":"Display name (content pass-through, never stored)."},"kind":{"type":"string","enum":["member"],"description":"Participant kind: always \"member\" (the page itself is excluded)."},"headline":{"type":["string","null"],"description":"Member headline (content pass-through, never stored)."},"profile_url":{"type":"string","description":"Canonical member profile URL."}}}},"unread_count":{"type":"integer","description":"Unread message count (0 = read)."},"last_activity_at":{"type":["number","null"],"description":"Epoch-ms of last activity; also the newest-first pagination anchor."},"last_message":{"type":["object","null"],"description":"Last-message preview. text is a content pass-through: present on a fresh read, never stored.","properties":{"sender_id":{"type":"string","description":"Sender's member id."},"sent_at":{"type":"number","description":"Epoch-ms delivery time."},"text":{"type":["string","null"],"description":"Message body (content pass-through, never stored)."}}}}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null at end-of-list."},"filter_effective":{"type":"boolean","enum":[true],"description":"Present and true only in topic/unread filter mode; the signal that the filter was applied upstream. Absent in free-text mode."}}},"examples":{"companyChatSearchFiltered":{"summary":"A topic/unread filter result (filter_effective present)","value":{"object":"company_chat_list","items":[{"object":"company_chat","id":"2-YWRtaW4tY2hhdC1hLTAwMDE9PQ==","is_group_chat":false,"title":"Dana Ellison","participants":[{"id":"ACoAAExampleMember0001","name":"Dana Ellison","kind":"member","headline":"Head of Platform at ExampleCo","profile_url":"https://www.linkedin.com/in/dana-ellison-example/"}],"unread_count":0,"last_activity_at":1783415709326,"last_message":{"sender_id":"ACoAAExampleMember0001","sent_at":1783415709326,"text":"Following up on the onboarding question from earlier. Any update?"}}],"cursor":null,"filter_effective":true}},"companyChatSearchFreeText":{"summary":"A free-text search result (filter_effective omitted)","value":{"object":"company_chat_list","items":[{"object":"company_chat","id":"2-YWRtaW4tY2hhdC1hLTAwMDE9PQ==","is_group_chat":false,"title":"Dana Ellison","participants":[{"id":"ACoAAExampleMember0001","name":"Dana Ellison","kind":"member","headline":"Head of Platform at ExampleCo","profile_url":"https://www.linkedin.com/in/dana-ellison-example/"}],"unread_count":0,"last_activity_at":1783415709326,"last_message":{"sender_id":"ACoAAExampleMember0001","sent_at":1783415709326,"text":"Following up on the onboarding question from earlier. Any update?"}}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"A non-numeric identifier; zero or more than one of query/topic/unread; or an unknown topic.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not administer this page (the admin gate), or lacks the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"},{"name":"Beta","position":"after","color":"#60A5FA"}],"x-curviate-stability":"beta","description":"Free-text search (query) OR one topic/unread filter over the admin inbox: exactly one mode per call. topic accepts 1–5 or a name (Service request, Request a demo, Support, Careers, Other). filter_effective is present only in topic/unread mode. The connected account must administer the page. Beta: deep pagination is being validated at scale. Single-page listing and termination are verified; deep pagination (many pages / large cursor round-trips) is provisional until validated against a busier inbox.","x-order":12}},"/v1/{account_id}/profile/groups":{"get":{"operationId":"getV1AccountIdProfileGroups","tags":["Groups"],"summary":"List the groups a member belongs to","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account performing the read."},{"name":"profile","in":"query","required":false,"schema":{"type":"string"},"description":"Target any other LinkedIn user's groups instead of the acting account's own, a vanity slug or a full /in/{vanity} URL. Omit to enumerate the acting account's own groups (a complete read). A profile target is a documented partial read (that target's interests-groups section only)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Maximum items to return per page (1–100, default 20). list_group_members walks fixed-size internal pages and cannot go below one page, so its returned count can exceed this value; the response text says so and includes a cursor to continue when it does."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response's cursor. Omit for the first page."}],"responses":{"200":{"description":"The groups the acting account (or a `profile` target) belongs to, each enriched to full group detail. Own-groups is a complete enumeration (a real total_count on cursor:null); a `profile` target is a documented partial (total_count always null). Zero groups is a valid empty result, never an error.","content":{"application/json":{"schema":{"type":"object","required":["object","items","paging","cursor"],"properties":{"object":{"type":"string","enum":["group_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","required":["object","id","entity_urn","name","member_count","description","type","public_visibility","direct_join_enabled","is_member","membership_status","url","admin","post_approval_enabled","invitation_level","sample_past_members"],"properties":{"object":{"type":"string","enum":["group"],"description":"Type discriminator."},"id":{"type":"string","description":"Numeric group id."},"entity_urn":{"type":"string","description":"Native group urn."},"name":{"type":"string","description":"Group display name."},"member_count":{"type":"number","description":"Total members. Reliable; cross-checked against the rendered page."},"description":{"type":"string","nullable":true,"description":"Group description; may contain newlines or non-English text."},"type":{"type":"string","description":"Group type (observed: STANDARD)."},"public_visibility":{"type":"boolean","description":"Whether the group is publicly listed/discoverable vs members-only."},"direct_join_enabled":{"type":"boolean","description":"Whether a member may join directly vs request/approval."},"is_member":{"type":"boolean","description":"Whether the acting account is a member."},"membership_status":{"type":"string","enum":["MEMBER","NON_MEMBER"],"description":"The acting account's membership presence (the same signal as is_member, as an enum)."},"url":{"type":"string","description":"Canonical group URL."},"admin":{"type":"object","nullable":true,"required":["name","connection_degree","member_id","vanity","profile_url"],"description":"The group's admin contact — the highest-value per-community contact. null when no admin contact is exposed.","properties":{"name":{"type":"string","nullable":true,"description":"Admin display name."},"connection_degree":{"type":"string","nullable":true,"enum":["1st","2nd","3rd"],"description":"Admin's network distance from the acting account — a reachability signal."},"member_id":{"type":"string","nullable":true,"description":"Admin's obfuscated member id."},"vanity":{"type":"string","nullable":true,"description":"Admin's profile vanity slug."},"profile_url":{"type":"string","nullable":true,"description":"Admin's canonical profile URL."}}},"post_approval_enabled":{"type":"boolean","nullable":true,"description":"Whether posts require admin approval — a write-automation feasibility gate."},"invitation_level":{"type":"string","nullable":true,"description":"Who may invite (observed: ALL)."},"sample_past_members":{"type":"array","items":{"type":"string"},"description":"Up to ~12 sampled member ids — a partial sample, possibly empty."}}},"description":"The resolved groups for this page."},"paging":{"type":"object","required":["total_count"],"properties":{"total_count":{"type":"number","nullable":true,"description":"A real total ONLY on a complete own-groups enumeration (cursor:null); null on any partial read (a profile target, or a page truncated by limit/budget) — never invented."}}},"cursor":{"type":"string","nullable":true,"description":"Opaque cursor for the next page; null when the enumeration is exhausted."}}},"examples":{"ownComplete":{"summary":"Own groups, complete","value":{"object":"group_list","items":[{"object":"group","id":"9123014","entity_urn":"urn:li:fsd_group:9123014","name":"AI Builders Network","member_count":5163,"description":"A community for engineers building with AI. Share jobs, ask questions, meet peers.","type":"STANDARD","public_visibility":false,"direct_join_enabled":false,"is_member":true,"membership_status":"MEMBER","url":"https://www.linkedin.com/groups/9123014/","admin":{"name":"Dana Ellison","connection_degree":"3rd","member_id":"ACoAADanaEllison0001","vanity":"dana-ellison-example","profile_url":"https://www.linkedin.com/in/dana-ellison-example/"},"post_approval_enabled":true,"invitation_level":"ALL","sample_past_members":["ACoAASamplePast0001","ACoAASamplePast0002"]},{"object":"group","id":"2236196","entity_urn":"urn:li:fsd_group:2236196","name":"Self-Employed Professionals Network","member_count":1568,"description":null,"type":"STANDARD","public_visibility":true,"direct_join_enabled":false,"is_member":true,"membership_status":"MEMBER","url":"https://www.linkedin.com/groups/2236196/","admin":null,"post_approval_enabled":false,"invitation_level":"ALL","sample_past_members":[]}],"paging":{"total_count":2},"cursor":null}},"profilePartial":{"summary":"A `?profile=` target, partial","value":{"object":"group_list","items":[{"object":"group","id":"9123014","entity_urn":"urn:li:fsd_group:9123014","name":"AI Builders Network","member_count":5163,"description":"A community for engineers building with AI. Share jobs, ask questions, meet peers.","type":"STANDARD","public_visibility":false,"direct_join_enabled":false,"is_member":true,"membership_status":"MEMBER","url":"https://www.linkedin.com/groups/9123014/","admin":{"name":"Dana Ellison","connection_degree":"3rd","member_id":"ACoAADanaEllison0001","vanity":"dana-ellison-example","profile_url":"https://www.linkedin.com/in/dana-ellison-example/"},"post_approval_enabled":true,"invitation_level":"ALL","sample_past_members":["ACoAASamplePast0001","ACoAASamplePast0002"]}],"paging":{"total_count":null},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — a path or query parameter failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"The connected LinkedIn account's session is disconnected — reconnect the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"No active Core seat for this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the account is unknown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary upstream error occurred, or the upstream response could not be interpreted. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Lists the groups the connected account belongs to, each enriched to full group detail. Omit `profile` to enumerate the acting account's own groups (a complete read). Pass `profile` to target any other LinkedIn user instead — a documented partial read of that target's interests-groups section only.","x-order":1}},"/v1/{account_id}/groups/{group}":{"get":{"operationId":"getV1AccountIdGroupsGroup","tags":["Groups"],"summary":"Get group detail","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account performing the read."},{"name":"group","in":"path","required":true,"schema":{"type":"string"},"description":"The group to look up. Accepts a numeric group id (e.g. 9123014) or a full group URL (e.g. https://www.linkedin.com/groups/9123014/, .../members/). The numeric id is extracted from either form — pass the id field returned by GET /v1/{account_id}/profile/groups or this endpoint's own response."}],"responses":{"200":{"description":"The group's full detail, returned directly (no envelope, no cursor, no paging).","content":{"application/json":{"schema":{"type":"object","required":["object","id","entity_urn","name","member_count","description","type","public_visibility","direct_join_enabled","is_member","membership_status","url","admin","post_approval_enabled","invitation_level","sample_past_members"],"properties":{"object":{"type":"string","enum":["group"],"description":"Type discriminator."},"id":{"type":"string","description":"Numeric group id."},"entity_urn":{"type":"string","description":"Native group urn."},"name":{"type":"string","description":"Group display name."},"member_count":{"type":"number","description":"Total members. Reliable; cross-checked against the rendered page."},"description":{"type":"string","nullable":true,"description":"Group description; may contain newlines or non-English text."},"type":{"type":"string","description":"Group type (observed: STANDARD)."},"public_visibility":{"type":"boolean","description":"Whether the group is publicly listed/discoverable vs members-only."},"direct_join_enabled":{"type":"boolean","description":"Whether a member may join directly vs request/approval."},"is_member":{"type":"boolean","description":"Whether the acting account is a member."},"membership_status":{"type":"string","enum":["MEMBER","NON_MEMBER"],"description":"The acting account's membership presence (the same signal as is_member, as an enum)."},"url":{"type":"string","description":"Canonical group URL."},"admin":{"type":"object","nullable":true,"required":["name","connection_degree","member_id","vanity","profile_url"],"description":"The group's admin contact — the highest-value per-community contact. null when no admin contact is exposed.","properties":{"name":{"type":"string","nullable":true,"description":"Admin display name."},"connection_degree":{"type":"string","nullable":true,"enum":["1st","2nd","3rd"],"description":"Admin's network distance from the acting account — a reachability signal."},"member_id":{"type":"string","nullable":true,"description":"Admin's obfuscated member id."},"vanity":{"type":"string","nullable":true,"description":"Admin's profile vanity slug."},"profile_url":{"type":"string","nullable":true,"description":"Admin's canonical profile URL."}}},"post_approval_enabled":{"type":"boolean","nullable":true,"description":"Whether posts require admin approval — a write-automation feasibility gate."},"invitation_level":{"type":"string","nullable":true,"description":"Who may invite (observed: ALL)."},"sample_past_members":{"type":"array","items":{"type":"string"},"description":"Up to ~12 sampled member ids — a partial sample, possibly empty."}}},"examples":{"group":{"summary":"A group with an admin contact","value":{"object":"group","id":"9123014","entity_urn":"urn:li:fsd_group:9123014","name":"AI Builders Network","member_count":5163,"description":"A community for engineers building with AI. Share jobs, ask questions, meet peers.","type":"STANDARD","public_visibility":false,"direct_join_enabled":false,"is_member":true,"membership_status":"MEMBER","url":"https://www.linkedin.com/groups/9123014/","admin":{"name":"Dana Ellison","connection_degree":"3rd","member_id":"ACoAADanaEllison0001","vanity":"dana-ellison-example","profile_url":"https://www.linkedin.com/in/dana-ellison-example/"},"post_approval_enabled":true,"invitation_level":"ALL","sample_past_members":["ACoAASamplePast0001","ACoAASamplePast0002"]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — a path or query parameter failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"The connected LinkedIn account's session is disconnected — reconnect the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"No active Core seat for this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Either the account_id does not belong to this tenant, or the referenced group does not exist, is not accessible, or the account is not a member of it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary upstream error occurred, or the upstream response could not be interpreted. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns one group's full detail — name, member count, description, admin contact, and write-feasibility gates. Returned directly (no envelope, no cursor, no paging).","x-order":2}},"/v1/{account_id}/groups/{group}/members":{"get":{"operationId":"getV1AccountIdGroupsGroupMembers","tags":["Groups"],"summary":"List (or search) a group's members","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account performing the read."},{"name":"group","in":"path","required":true,"schema":{"type":"string"},"description":"The group to look up. Accepts a numeric group id (e.g. 9123014) or a full group URL (e.g. https://www.linkedin.com/groups/9123014/, .../members/). The numeric id is extracted from either form — pass the id field returned by GET /v1/{account_id}/profile/groups or this endpoint's own response."},{"name":"name","in":"query","required":false,"schema":{"type":"string"},"description":"Filter members by name, prefix/substring, multi-word, case-insensitive (e.g. 'raphael red' matches \"Raphael Redmer\"). Folds in member search as this SAME endpoint, not a separate one. Omit (or pass an empty string) for the full roster."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Maximum items to return per page (1–100, default 20). list_group_members walks fixed-size internal pages and cannot go below one page, so its returned count can exceed this value; the response text says so and includes a cursor to continue when it does."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response's cursor. Omit for the first page. Scoped to the `name` value it was minted under, replaying it alongside a different `name` is rejected."}],"responses":{"200":{"description":"A page of the group's members. An optional `name` filter folds in member search as this SAME endpoint — the filtered items plus a filtered total_count. Requires the acting account be a member of the group.","content":{"application/json":{"schema":{"type":"object","required":["object","items","paging","cursor"],"properties":{"object":{"type":"string","enum":["group_member_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","required":["object","type","id","name","headline","profile_url","avatar_url","joined_at","relationship","badges"],"properties":{"object":{"type":"string","enum":["group_member"],"description":"Item type discriminator."},"type":{"type":"string","enum":["individual"],"description":"Entity kind — always individual for a group member."},"id":{"type":"string","description":"The member's obfuscated profile id — the stable handle other endpoints key on (connect, message, profile-enrich)."},"name":{"type":"string","nullable":true,"description":"Display name; null if the payload carries neither first nor last."},"headline":{"type":"string","nullable":true,"description":"Professional headline. Finder-dependent — treat as nullable."},"profile_url":{"type":"string","nullable":true,"description":"Canonical profile URL."},"avatar_url":{"type":"string","nullable":true,"description":"Highest-resolution avatar; null if no photo."},"joined_at":{"type":"number","nullable":true,"description":"When the member joined, epoch milliseconds."},"relationship":{"type":"string","nullable":true,"enum":["MESSAGE","CONNECT"],"description":"The acting account's relationship to this member — MESSAGE = already connected (DM directly); CONNECT = not connected (invite first)."},"badges":{"type":"array","items":{"type":"string"},"description":"Zero or more targeting signals (observed: VERIFIED_PROFILE, OPEN_TO_WORK, PREMIUM, INFLUENCER); empty when none."}}},"description":"The page of members for this page."},"paging":{"type":"object","required":["total_count"],"properties":{"total_count":{"type":"number","nullable":true,"description":"The roster total (reliable) — the FILTERED match count under `name`. null (never 0) only on a soft-empty read where the paging container is genuinely absent."}}},"cursor":{"type":"string","nullable":true,"description":"Opaque cursor for the next page; null on the last page."}}},"examples":{"members":{"summary":"A page of members","value":{"object":"group_member_list","items":[{"object":"group_member","type":"individual","id":"ACoAAGroupMember0001","name":"Raphael Redmer","headline":"Founder, Curviate","profile_url":"https://www.linkedin.com/in/raphael-redmer-example/","avatar_url":"https://media.example.com/group-member-0001.jpg","joined_at":1783253238347,"relationship":"MESSAGE","badges":["VERIFIED_PROFILE"]},{"object":"group_member","type":"individual","id":"ACoAAGroupMember0002","name":"Gregorio Alvarez","headline":"Senior Software Engineer","profile_url":"https://www.linkedin.com/in/gregorio-alvarez-example/","avatar_url":null,"joined_at":1782905460721,"relationship":"CONNECT","badges":[]}],"paging":{"total_count":5163},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — a path or query parameter failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"The connected LinkedIn account's session is disconnected — reconnect the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"No active Core seat for this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Either the account_id does not belong to this tenant, or the referenced group does not exist, is not accessible, or the account is not a member of it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary upstream error occurred, or the upstream response could not be interpreted. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Lists a group's members — id, profile URL, name, headline, and relationship signal. Requires the connected account be a member of the group. Pass `name` to filter by member name — the SAME endpoint folds in member search; it is not a separate operation.","x-order":3}},"/v1/{account_id}/search/parameters":{"get":{"operationId":"getV1AccountIdSearchParameters","tags":["Search"],"summary":"Resolve search filter IDs","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The linked LinkedIn account to search on behalf of."},{"name":"type","in":"query","required":true,"schema":{"type":"string","enum":["LOCATION","PEOPLE","RELATION","COMPANY","SCHOOL","INDUSTRY","SERVICE","JOB_FUNCTION","JOB_TITLE","EMPLOYMENT_TYPE","SKILL"]},"description":"Parameter type to resolve. Classic types: LOCATION, PEOPLE, RELATION, COMPANY, SCHOOL, INDUSTRY, SERVICE, JOB_FUNCTION, JOB_TITLE, EMPLOYMENT_TYPE, SKILL. Non-classic types (e.g. GROUPS, SALES_INDUSTRY) are rejected."},{"name":"keywords","in":"query","required":true,"schema":{"type":"string"},"description":"Human term to resolve to opaque filter IDs (e.g. 'software development'). Required for every type, including EMPLOYMENT_TYPE."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Zero-based pagination offset (default 0)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Number of parameters to return (1–100, default 10)."}],"responses":{"200":{"description":"A list of matching filter IDs for use in structured search. Each item maps a human-readable label to an opaque ID.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["search_parameter_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"Resolved filter ID / label pairs.","items":{"type":"object","description":"A single filter resolution result mapping a human term to an opaque filter ID.","properties":{"id":{"type":"string","description":"Opaque filter ID for use in structured search filter arrays."},"name":{"type":"string","description":"Human-readable label for this filter value."}},"required":["id","name"]}},"cursor":{"type":["string","null"],"description":"Opaque pagination cursor for the next page, or null when this is the last page."}},"required":["object","items","cursor"]},"examples":{"industry":{"summary":"Industry filter resolution","value":{"object":"search_parameter_list","items":[{"id":"96","name":"Software Development"},{"id":"4","name":"Internet"}],"cursor":null}},"company":{"summary":"Company resolution (same-named companies distinguished only by id)","value":{"object":"search_parameter_list","items":[{"id":"1035","name":"Anthropic"},{"id":"9876543","name":"Anthropic"}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id, missing or empty type, missing keywords, or type not in the classic allowlist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot perform searches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Resolves human-readable terms (e.g. 'software development') to opaque filter IDs for use in structured search filters. The type parameter selects the filter category; keywords is required for every type, including EMPLOYMENT_TYPE.","x-order":1}},"/v1/{account_id}/search/people":{"post":{"operationId":"postV1AccountIdSearchPeople","tags":["Search"],"summary":"Search people","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The linked LinkedIn account to search on behalf of."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Zero-based pagination offset (default 0)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"description":"Maximum results per page (1–50, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned from a previous response."}],"responses":{"200":{"description":"A page of people matching the filters. Each item carries the LinkedIn id, name, headline, location, and connection distance when available.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["people_search_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"People search result items.","items":{"type":"object","description":"A single person search result. Only id is guaranteed present — other fields appear when the platform populates them.","properties":{"id":{"type":"string","description":"Opaque LinkedIn member URN for this person (e.g. ACoAA…)."},"member_id":{"type":"string","description":"Numeric LinkedIn member id, distinct from id. Present when available."},"public_identifier":{"type":"string","description":"LinkedIn public identifier (the slug after linkedin.com/in/). Present when available."},"full_name":{"type":"string","description":"Full display name. Present when available."},"headline":{"type":"string","description":"LinkedIn headline. Present when available."},"location":{"type":"string","description":"Location as set on the profile. Present when available."},"avatar_url":{"type":"string","description":"Profile picture URL. Present when available."},"profile_picture_url_large":{"type":"string","description":"Larger profile picture URL variant. Present when available."},"profile_url":{"type":"string","description":"LinkedIn profile URL. Present when available."},"network_distance":{"type":"string","enum":["SELF","FIRST_DEGREE","SECOND_DEGREE","THIRD_DEGREE","OUT_OF_NETWORK"],"description":"Connection distance to the authenticated account. Present when available."},"is_premium":{"type":"boolean","description":"true if this is a LinkedIn Premium account. Present when available."},"is_verified":{"type":"boolean","description":"true if the account is verified. Present when available."}},"required":["id"]}},"paging":{"type":"object","description":"Paging metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total matching result count. Large counts (people/companies/from-url) are a ≥1000 ceiling, not an exact total."}},"required":["total_count"]},"cursor":{"type":["string","null"],"description":"Opaque next-page cursor; null on the last page."}},"required":["object","items","paging","cursor"]},"examples":{"page":{"summary":"First page of people results","value":{"object":"people_search_result","items":[{"id":"ACoAABcDeFgHiJkLmNoPqRsTuVwXyZ1234567890","member_id":"923456789","public_identifier":"alice-example","full_name":"Alice Example","headline":"Software Engineer","location":"Berlin, Germany","network_distance":"SECOND_DEGREE","is_premium":false}],"paging":{"total_count":1000},"cursor":"eyJwYWdlIjoyLCJvZmZzZXQiOjEwfQ"}},"lastPage":{"summary":"Last page (short page — no next cursor)","value":{"object":"people_search_result","items":[{"id":"ACoAABcDeFgHiJkLmNoPqRsTuVwXyZ1234567890","member_id":"923456789","public_identifier":"alice-example","full_name":"Alice Example","headline":"Software Engineer","location":"Berlin, Germany","network_distance":"SECOND_DEGREE","is_premium":false}],"paging":{"total_count":1000},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request body — missing or malformed filter, or limit outside the 1-50 range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot perform searches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Searches LinkedIn profiles using structured filters. To search from a pasted LinkedIn search URL instead, use POST .../search. limit/cursor/offset live in query params; filters in the request body.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"string","description":"Full-text keyword search across all profile fields."},"advanced_keywords":{"type":"object","properties":{"first_name":{"type":"string","description":"Filter by first name."},"last_name":{"type":"string","description":"Filter by last name."},"title":{"type":"string","description":"Filter by job title."},"company":{"type":"string","description":"Filter by current company name."},"school":{"type":"string","description":"Filter by school name."}},"description":"Keyword filters scoped to specific profile fields (first_name, last_name, title, company, school)."},"industry":{"type":"array","items":{"type":"string"},"description":"Opaque industry IDs from GET .../search/parameters?type=INDUSTRY."},"location":{"type":"array","items":{"type":"string"},"description":"Opaque location IDs from GET .../search/parameters?type=LOCATION."},"current_company":{"type":"array","items":{"type":"string"},"description":"Opaque current company IDs from GET .../search/parameters?type=COMPANY."},"past_company":{"type":"array","items":{"type":"string"},"description":"Opaque past company IDs from GET .../search/parameters?type=COMPANY."},"school":{"type":"array","items":{"type":"string"},"description":"Opaque school IDs from GET .../search/parameters?type=SCHOOL."},"service":{"type":"array","items":{"type":"string"},"description":"Opaque service IDs from GET .../search/parameters?type=SERVICE."},"connections_of":{"type":"array","items":{"type":"string"},"description":"Filter to connections of the given members. Array of opaque member IDs from GET .../search/parameters?type=RELATION."},"followers_of":{"type":"array","items":{"type":"string"},"description":"Filter to followers of the given members. Array of opaque member IDs from GET .../search/parameters?type=PEOPLE."},"network_distance":{"type":"array","items":{"type":"number","enum":[1,2,3]},"description":"Filter by network distance: 1 = 1st degree, 2 = 2nd degree, 3 = 3rd degree."},"profile_language":{"type":"array","items":{"type":"string"},"description":"Filter by profile language codes."},"open_to_volunteering":{"type":"boolean","description":"Filter to profiles open to volunteering opportunities."}}},"examples":{"structured":{"summary":"Search by keyword with advanced filters","value":{"keywords":"ai infrastructure","advanced_keywords":{"title":"founder"},"network_distance":[1,2]}},"industryFilter":{"summary":"Filter by industry, location, and current company","value":{"keywords":"product manager","industry":["4"],"location":["103644278"],"current_company":["1035"]}}}}}},"x-order":2}},"/v1/{account_id}/search/companies":{"post":{"operationId":"postV1AccountIdSearchCompanies","tags":["Search"],"summary":"Search companies","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The linked LinkedIn account to search on behalf of."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Zero-based pagination offset (default 0)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":2,"maximum":50,"default":10},"description":"Maximum results per page (2–50, default 10). Company search requires a minimum of 2."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned from a previous response."}],"responses":{"200":{"description":"A page of companies matching the filters. No company description, tagline, or mission is returned.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["company_search_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"Company search result items.","items":{"type":"object","description":"A single company search result. Only id is guaranteed present — other fields appear when the platform populates them. No company description or tagline is returned.","properties":{"id":{"type":"string","description":"Numeric LinkedIn company identifier."},"name":{"type":"string","description":"Company display name. Present when available."},"public_identifier":{"type":"string","description":"LinkedIn public identifier (vanity slug). Present when available."},"location":{"type":"string","description":"Company headquarters location. Present when available."},"industry":{"type":"string","description":"Industry the company operates in. Present when available."},"summary":{"type":"string","description":"Company summary text. Present when available."},"job_offers_count":{"type":"number","description":"Open job offer count. Present when available."},"profile_url":{"type":"string","description":"Company LinkedIn profile URL. Present when available."},"followers_count":{"type":"number","description":"Follower count. Present when available."},"relations_count":{"type":"number","description":"Count of the authenticated account's connections at this company. Present when available."},"avatar_url":{"type":"string","description":"Company logo URL. Present when available."}},"required":["id"]}},"paging":{"type":"object","description":"Paging metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total matching result count. Large counts are a ≥1000 ceiling, not an exact total."}},"required":["total_count"]},"cursor":{"type":["string","null"],"description":"Opaque next-page cursor; null on the last page."}},"required":["object","items","paging","cursor"]},"examples":{"page":{"summary":"First page of company results","value":{"object":"company_search_result","items":[{"id":"12345678","name":"Acme Corp","public_identifier":"acme-corp","industry":"Software Development","location":"Hamburg, Germany","followers_count":4200,"profile_url":"https://www.linkedin.com/company/acme-corp","summary":"Enterprise logistics software for mid-market shippers.","job_offers_count":12}],"paging":{"total_count":18},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request body — malformed filter, or limit outside the 2-50 range (companies require limit >= 2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot perform searches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Searches LinkedIn companies using structured filters. To search from a pasted LinkedIn search URL instead, use POST .../search. No company description or tagline is returned.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"string","description":"Full-text keyword search across company profiles."},"industry":{"type":"array","items":{"type":"string"},"description":"Opaque industry IDs from GET .../search/parameters?type=INDUSTRY."},"location":{"type":"array","items":{"type":"string"},"description":"Opaque location IDs from GET .../search/parameters?type=LOCATION."},"has_job_postings":{"type":"boolean","description":"Filter to companies with active job postings."},"headcount":{"type":"array","items":{"type":"object","properties":{"min":{"type":"integer","description":"Lower bound of a company-size bucket. Valid values: 1, 11, 51, 201, 501, 1001, 5001, 10001."},"max":{"type":"integer","description":"Upper bound of a company-size bucket. Valid values: 1, 10, 50, 200, 500, 1000, 5000, 10000."}},"required":["min","max"]},"description":"Filter by company size buckets. Each entry is a { min, max } object (e.g. { min: 51, max: 200 })."},"network_distance":{"type":"array","items":{"type":"number","enum":[1,2,3]},"description":"Filter by network distance: 1 = 1st degree, 2 = 2nd degree, 3 = 3rd degree."}}},"examples":{"structured":{"summary":"Search companies with headcount and industry filters","value":{"keywords":"fintech","industry":["43"],"has_job_postings":true,"headcount":[{"min":51,"max":200},{"min":201,"max":500}]}}}}}},"x-order":3}},"/v1/{account_id}/search/posts":{"post":{"operationId":"postV1AccountIdSearchPosts","tags":["Search"],"summary":"Search posts","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The linked LinkedIn account to search on behalf of."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Zero-based pagination offset (default 0)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"description":"Maximum results per page (1–50, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned from a previous response."}],"responses":{"200":{"description":"A page of posts matching the filters. Each item carries post text, engagement counters, author details, and attachments when available.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["post_search_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"Post search result items.","items":{"type":"object","description":"A single post search result. Post text, engagement counters, author, and attachments are included when available. No posting-date field is included — the platform does not expose a reliable post-creation timestamp on search results.","properties":{"id":{"type":"string","description":"Opaque platform id identifying the post."},"share_url":{"type":"string","description":"Shareable post URL. Present when available."},"text":{"type":"string","description":"Post text content. Present when available."},"author":{"type":"object","description":"Post author object. Present when available.","properties":{"id":{"type":"string"},"name":{"type":"string"},"is_company":{"type":"boolean"},"public_identifier":{"type":"string"}},"additionalProperties":true},"permissions":{"type":"object","description":"Interaction permissions on this post. Present when available.","properties":{"can_react":{"type":"boolean"},"can_share":{"type":"boolean"},"can_post_comments":{"type":"boolean"}}},"is_repost":{"type":"boolean","description":"true if this post is a repost. Present when available."},"attachments":{"type":"array","description":"Post attachments array. Present when the post carries attachments.","items":{"type":"object","additionalProperties":true}},"reactions":{"type":"array","description":"Per-reaction-type breakdown. Present when the post has reactions.","items":{"type":"object","properties":{"type":{"type":"string","description":"Reaction type (e.g. like, celebrate)."},"count":{"type":"number"}}}},"reaction_count":{"type":"number","description":"Total reaction count — the sum of reactions[].count."},"comment_count":{"type":"number","description":"Total comment count on the post."},"repost_count":{"type":"number","description":"Total repost count on the post."}},"required":["id","reaction_count","comment_count","repost_count"]}},"paging":{"type":"object","description":"Paging metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total matching result count."}},"required":["total_count"]},"cursor":{"type":["string","null"],"description":"Opaque next-page cursor; null on the last page."}},"required":["object","items","paging","cursor"]},"examples":{"page":{"summary":"First page of post results","value":{"object":"post_search_result","items":[{"id":"b3BhcXVlLXBvc3QtaWQtMDAx","text":"We are hiring senior engineers. Check us out!","share_url":"https://www.linkedin.com/feed/update/urn:li:activity:post_001","author":{"id":"99999","name":"Alice Example","is_company":false,"public_identifier":"alice-example"},"permissions":{"can_react":true,"can_share":true,"can_post_comments":true},"attachments":[],"reactions":[{"type":"like","count":35},{"type":"celebrate","count":7}],"reaction_count":42,"comment_count":7,"repost_count":3,"is_repost":false}],"paging":{"total_count":12},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request body — malformed filter or invalid content_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot perform searches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Searches LinkedIn posts using structured filters. To search from a pasted LinkedIn search URL instead, use POST .../search. Post text, engagement counters, author, and attachments are returned.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"string","description":"Full-text keyword search in posts."},"sort_by":{"type":"string","enum":["relevance","date"],"description":"Sort order: relevance (default) or date (newest first)."},"date_posted":{"type":"string","enum":["past_day","past_week","past_month"],"description":"Filter by post recency."},"content_type":{"type":"string","enum":["videos","images","live_videos","collaborative_articles","documents"],"description":"Filter by content type (single value, not an array)."},"posted_by":{"type":"object","properties":{"member":{"type":"array","items":{"type":"string"},"description":"Opaque member IDs from GET /v1/{account_id}/search/parameters?type=PEOPLE."},"company":{"type":"array","items":{"type":"string"},"description":"Opaque company IDs from GET /v1/{account_id}/search/parameters?type=COMPANY."},"me":{"type":"boolean","description":"Restrict to your own posts."},"first_connections":{"type":"boolean","description":"Restrict to posts by your 1st-degree connections."},"people_you_follow":{"type":"boolean","description":"Restrict to posts by people you follow."}},"description":"Filter to posts by specific authors (members, companies, yourself, connections, or people you follow)."},"mentioning":{"type":"object","properties":{"member":{"type":"array","items":{"type":"string"},"description":"Opaque member IDs from GET /v1/{account_id}/search/parameters?type=PEOPLE."},"company":{"type":"array","items":{"type":"string"},"description":"Opaque company IDs from GET /v1/{account_id}/search/parameters?type=COMPANY."}},"description":"Filter to posts mentioning specific members or companies."},"author":{"type":"object","properties":{"industry":{"type":"array","items":{"type":"string"},"description":"Opaque industry IDs from GET /v1/{account_id}/search/parameters?type=INDUSTRY."},"company":{"type":"array","items":{"type":"string"},"description":"Opaque company IDs from GET /v1/{account_id}/search/parameters?type=COMPANY."},"keywords":{"type":"string","description":"Free-text keyword match on the author."}},"description":"Filter to posts by author attributes (industry, company, or keywords)."}}},"examples":{"structured":{"summary":"Search posts mentioning a topic, filtered by content type and author's company","value":{"keywords":"hiring engineers","content_type":"videos","sort_by":"date","author":{"company":["1234567"]}}},"postedBy":{"summary":"Find posts by a specific member","value":{"posted_by":{"member":["99999"]}}}}}}},"x-order":4}},"/v1/{account_id}/search/jobs":{"post":{"operationId":"postV1AccountIdSearchJobs","tags":["Search"],"summary":"Search jobs","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The linked LinkedIn account to search on behalf of."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Zero-based pagination offset (default 0)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"description":"Maximum results per page (1–100, default 25)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned from a previous response."}],"responses":{"200":{"description":"A page of job postings matching the filters. Job description text is never returned.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["job_search_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"Job search result items (no job description text).","items":{"type":"object","description":"A single job search result. Job description text is never returned.","properties":{"id":{"type":"string","description":"The job posting's id (same value as job_urn), for chaining into get_job."},"job_urn":{"type":"string","description":"LinkedIn URN identifying the job posting."},"title":{"type":"string","description":"Job title. Present when available."},"location":{"type":"string","description":"Job location. Present when available."},"url":{"type":"string","description":"Direct URL to the job posting. Present when available."},"posted_at":{"type":"string","description":"Approximate posting date in ISO-8601 format. Present when available."},"workplace_type":{"type":"string","enum":["on_site","remote","hybrid"],"description":"Work arrangement, lowercase in the response. Present when available."},"easy_apply":{"type":"boolean","description":"true if the posting supports LinkedIn Easy Apply. Present when available."},"is_promoted":{"type":"boolean","description":"true if this is a promoted job. Present when available."},"is_repost":{"type":"boolean","description":"true if this listing is a repost. Present when available."},"few_applicants":{"type":"boolean","description":"true if the posting has few applicants. Present when available."},"insights":{"type":"array","description":"Platform-provided insight strings about this posting. Present when available.","items":{"type":"string"}},"company":{"type":"object","description":"Hiring company details. Present when available.","properties":{"id":{"type":"string"},"name":{"type":"string"},"profile_url":{"type":"string"},"public_identifier":{"type":"string"},"public_picture_url":{"type":"string"}},"additionalProperties":true}},"required":["id","job_urn"]}},"paging":{"type":"object","description":"Paging metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total matching result count."}},"required":["total_count"]},"cursor":{"type":["string","null"],"description":"Opaque next-page cursor; null on the last page."}},"required":["object","items","paging","cursor"]},"examples":{"page":{"summary":"First page of job results","value":{"object":"job_search_result","items":[{"id":"987654321","job_urn":"987654321","title":"Senior Platform Engineer","location":"Berlin, Germany","posted_at":"2026-06-01T08:00:00.000Z","url":"https://www.linkedin.com/jobs/view/987654321","workplace_type":"hybrid","easy_apply":true,"is_promoted":false,"is_repost":false,"few_applicants":false,"insights":["Be an early applicant"],"company":{"id":"12345678","name":"Acme Corp","profile_url":"https://www.linkedin.com/company/acme-corp","public_identifier":"acme-corp"}}],"paging":{"total_count":8},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request body — malformed filter, invalid seniority value, non-numeric date_posted, or limit outside the 1-100 range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot perform searches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Searches LinkedIn job postings using structured filters. To search from a pasted LinkedIn jobs URL instead, use POST .../search. Job description text is never returned.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"string","description":"Full-text keyword search in job postings."},"sort_by":{"type":"string","enum":["relevance","date"],"description":"Sort order: relevance (default) or date (newest first)."},"date_posted":{"type":"integer","minimum":0,"description":"Filter to jobs posted within N days (positive integer). Snapped UP to the nearest supported window: 1 = past day, 2-7 = past week, 8+ = past month (clamped, no window beyond 30 days is available)."},"region":{"type":"string","description":"Opaque region ID."},"location":{"type":"array","items":{"type":"string"},"description":"Opaque location IDs from GET .../search/parameters?type=LOCATION."},"location_within_area":{"type":"number","minimum":0,"description":"Search radius around the location, in kilometers. Snapped to the nearest supported bucket: 0, 8, 16, 40, 80, or 160 km (ties round up)."},"industry":{"type":"array","items":{"type":"string"},"description":"Opaque industry IDs from GET .../search/parameters?type=INDUSTRY."},"seniority":{"type":"array","items":{"type":"string","enum":["executive","director","mid_senior","associate","entry","intern"]},"description":"Filter by seniority levels."},"function":{"type":"array","items":{"type":"string"},"description":"Job function slugs (lowercase letters only, e.g. 'engineering')."},"role":{"type":"array","items":{"type":"string"},"description":"Opaque role IDs."},"job_type":{"type":"array","items":{"type":"string","enum":["full_time","part_time","contract","temporary","volunteer","internship","other"]},"description":"Filter by employment type."},"company":{"type":"array","items":{"type":"string"},"description":"Opaque company IDs from GET .../search/parameters?type=COMPANY."},"presence":{"type":"array","items":{"type":"string","enum":["remote","hybrid","on_site"]},"description":"Filter by work arrangement."},"easy_apply":{"type":"boolean","description":"Filter to jobs with LinkedIn Easy Apply enabled."},"under_10_applicants":{"type":"boolean","description":"Filter to jobs with fewer than 10 applicants."},"in_your_network":{"type":"boolean","description":"Filter to jobs at companies in your network."},"minimum_salary":{"oneOf":[{"type":"object","properties":{"currency":{"type":"string","enum":["USD","AUD","CAD"],"description":"Currency code (dollar-group): USD, AUD, or CAD."},"value":{"type":"number","enum":[40,60,80,100,120,140,160,180,200],"description":"Salary threshold in thousands of dollars; accepted buckets: 40, 60, 80, 100, 120, 140, 160, 180, 200 (e.g. 80 = minimum $80k/year)."}},"required":["currency","value"]},{"type":"object","properties":{"currency":{"type":"string","const":"GBP","description":"Currency code: GBP."},"value":{"type":"number","enum":[20,30,40,50,60,70,80,90,100],"description":"Salary threshold in thousands of pounds; accepted buckets: 20, 30, 40, 50, 60, 70, 80, 90, 100 (e.g. 50 = minimum £50k/year)."}},"required":["currency","value"]}],"description":"Minimum salary filter: specify currency and value."},"benefits":{"type":"array","items":{"type":"string"},"description":"Filter by offered benefits. Valid values: medical_insurance, vision_insurance, dental_insurance, 401(k), pension_plan, commuter_benefits."},"commitments":{"type":"array","items":{"type":"string"},"description":"Filter by company commitments. Valid values: career_growth_and_learning, diversity_equity_and_inclusion, environmental_sustainability, social_impact, work_life_balance."},"has_verifications":{"type":"boolean","description":"Filter to jobs with LinkedIn verification badges."},"fair_chance_employer":{"type":"boolean","description":"Filter to fair-chance employers."}}},"examples":{"structured":{"summary":"Search full-time senior engineering roles with salary filter","value":{"keywords":"platform engineer","job_type":["full_time"],"seniority":["mid_senior","associate"],"presence":["remote","hybrid"],"date_posted":7,"minimum_salary":{"currency":"USD","value":80}}},"easyApply":{"summary":"Easy Apply jobs at a specific company","value":{"keywords":"backend engineer","company":["1234567"],"easy_apply":true}}}}}},"x-order":5}},"/v1/{account_id}/search":{"post":{"operationId":"postV1AccountIdSearch","tags":["Search"],"summary":"Search from a pasted URL","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The linked LinkedIn account to search on behalf of."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Zero-based pagination offset (default 0)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"description":"Maximum results per page (1–50, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned from a previous response."}],"responses":{"200":{"description":"A page of results resolved from the pasted URL. Each item is discriminated individually by its own object value (a person, a company, a post, or a job).","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["search_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"Polymorphic search result items — each discriminated by its own object value.","items":{"oneOf":[{"type":"object","description":"A single person search result. Only id is guaranteed present — other fields appear when the platform populates them.","properties":{"object":{"type":"string","enum":["people_search_result"]},"id":{"type":"string","description":"Opaque LinkedIn member URN for this person (e.g. ACoAA…)."},"member_id":{"type":"string","description":"Numeric LinkedIn member id, distinct from id. Present when available."},"public_identifier":{"type":"string","description":"LinkedIn public identifier (the slug after linkedin.com/in/). Present when available."},"full_name":{"type":"string","description":"Full display name. Present when available."},"headline":{"type":"string","description":"LinkedIn headline. Present when available."},"location":{"type":"string","description":"Location as set on the profile. Present when available."},"avatar_url":{"type":"string","description":"Profile picture URL. Present when available."},"profile_picture_url_large":{"type":"string","description":"Larger profile picture URL variant. Present when available."},"profile_url":{"type":"string","description":"LinkedIn profile URL. Present when available."},"network_distance":{"type":"string","enum":["SELF","FIRST_DEGREE","SECOND_DEGREE","THIRD_DEGREE","OUT_OF_NETWORK"],"description":"Connection distance to the authenticated account. Present when available."},"is_premium":{"type":"boolean","description":"true if this is a LinkedIn Premium account. Present when available."},"is_verified":{"type":"boolean","description":"true if the account is verified. Present when available."}},"required":["object","id"]},{"type":"object","description":"A single company search result. Only id is guaranteed present — other fields appear when the platform populates them. No company description or tagline is returned.","properties":{"object":{"type":"string","enum":["company_search_result"]},"id":{"type":"string","description":"Numeric LinkedIn company identifier."},"name":{"type":"string","description":"Company display name. Present when available."},"public_identifier":{"type":"string","description":"LinkedIn public identifier (vanity slug). Present when available."},"location":{"type":"string","description":"Company headquarters location. Present when available."},"industry":{"type":"string","description":"Industry the company operates in. Present when available."},"summary":{"type":"string","description":"Company summary text. Present when available."},"job_offers_count":{"type":"number","description":"Open job offer count. Present when available."},"profile_url":{"type":"string","description":"Company LinkedIn profile URL. Present when available."},"followers_count":{"type":"number","description":"Follower count. Present when available."},"relations_count":{"type":"number","description":"Count of the authenticated account's connections at this company. Present when available."},"avatar_url":{"type":"string","description":"Company logo URL. Present when available."}},"required":["object","id"]},{"type":"object","description":"A single post search result. Post text, engagement counters, author, and attachments are included when available. No posting-date field is included — the platform does not expose a reliable post-creation timestamp on search results.","properties":{"object":{"type":"string","enum":["post_search_result"]},"id":{"type":"string","description":"Opaque platform id identifying the post."},"share_url":{"type":"string","description":"Shareable post URL. Present when available."},"text":{"type":"string","description":"Post text content. Present when available."},"author":{"type":"object","description":"Post author object. Present when available.","properties":{"id":{"type":"string"},"name":{"type":"string"},"is_company":{"type":"boolean"},"public_identifier":{"type":"string"}},"additionalProperties":true},"permissions":{"type":"object","description":"Interaction permissions on this post. Present when available.","properties":{"can_react":{"type":"boolean"},"can_share":{"type":"boolean"},"can_post_comments":{"type":"boolean"}}},"is_repost":{"type":"boolean","description":"true if this post is a repost. Present when available."},"attachments":{"type":"array","description":"Post attachments array. Present when the post carries attachments.","items":{"type":"object","additionalProperties":true}},"reactions":{"type":"array","description":"Per-reaction-type breakdown. Present when the post has reactions.","items":{"type":"object","properties":{"type":{"type":"string","description":"Reaction type (e.g. like, celebrate)."},"count":{"type":"number"}}}},"reaction_count":{"type":"number","description":"Total reaction count — the sum of reactions[].count."},"comment_count":{"type":"number","description":"Total comment count on the post."},"repost_count":{"type":"number","description":"Total repost count on the post."}},"required":["object","id","reaction_count","comment_count","repost_count"]},{"type":"object","description":"A single job search result. Job description text is never returned.","properties":{"object":{"type":"string","enum":["job_search_result"]},"id":{"type":"string","description":"The job posting's id (same value as job_urn), for chaining into get_job."},"job_urn":{"type":"string","description":"LinkedIn URN identifying the job posting."},"title":{"type":"string","description":"Job title. Present when available."},"location":{"type":"string","description":"Job location. Present when available."},"url":{"type":"string","description":"Direct URL to the job posting. Present when available."},"posted_at":{"type":"string","description":"Approximate posting date in ISO-8601 format. Present when available."},"workplace_type":{"type":"string","enum":["on_site","remote","hybrid"],"description":"Work arrangement, lowercase in the response. Present when available."},"easy_apply":{"type":"boolean","description":"true if the posting supports LinkedIn Easy Apply. Present when available."},"is_promoted":{"type":"boolean","description":"true if this is a promoted job. Present when available."},"is_repost":{"type":"boolean","description":"true if this listing is a repost. Present when available."},"few_applicants":{"type":"boolean","description":"true if the posting has few applicants. Present when available."},"insights":{"type":"array","description":"Platform-provided insight strings about this posting. Present when available.","items":{"type":"string"}},"company":{"type":"object","description":"Hiring company details. Present when available.","properties":{"id":{"type":"string"},"name":{"type":"string"},"profile_url":{"type":"string"},"public_identifier":{"type":"string"},"public_picture_url":{"type":"string"}},"additionalProperties":true}},"required":["object","id","job_urn"]}]}},"paging":{"type":"object","description":"Paging metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total matching result count. Large counts are a ≥1000 ceiling, not an exact total."}},"required":["total_count"]},"cursor":{"type":["string","null"],"description":"Opaque next-page cursor; null on the last page."}},"required":["object","items","paging","cursor"]},"examples":{"people":{"summary":"Results from a pasted people-search URL","value":{"object":"search_result","items":[{"object":"people_search_result","id":"ACoAABcDeFgHiJkLmNoPqRsTuVwXyZ1234567890","member_id":"923456789","public_identifier":"alice-example","full_name":"Alice Example","headline":"Software Engineer","location":"Berlin, Germany","network_distance":"SECOND_DEGREE","is_premium":false}],"paging":{"total_count":1000},"cursor":null}},"companies":{"summary":"Results from a pasted company-search URL","value":{"object":"search_result","items":[{"object":"company_search_result","id":"12345678","name":"Acme Corp","public_identifier":"acme-corp","industry":"Software Development","location":"Hamburg, Germany","followers_count":4200,"profile_url":"https://www.linkedin.com/company/acme-corp","summary":"Enterprise logistics software for mid-market shippers.","job_offers_count":12}],"paging":{"total_count":18},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or malformed url, or limit outside the 1-50 range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot perform searches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Runs a pasted LinkedIn search URL directly. url is the only accepted body field — this is the sole home of URL-mode; the structured people/companies/posts/jobs endpoints no longer accept url. The response is polymorphic: each item is discriminated individually by its own kind (a person, a company, a post, or a job).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"A pasted LinkedIn search URL, saved-search re-run URL, or lead-list URL."}},"required":["url"]},"examples":{"peopleUrl":{"summary":"Run a saved LinkedIn people-search URL","value":{"url":"https://www.linkedin.com/search/results/people/?keywords=cto&network=%5B%22F%22%5D"}},"companyUrl":{"summary":"Run a saved LinkedIn company-search URL","value":{"url":"https://www.linkedin.com/search/results/companies/?keywords=saas"}}}}}},"x-order":6}},"/v1/{account_id}/search/groups":{"get":{"operationId":"getV1AccountIdSearchGroups","tags":["Search"],"summary":"Search groups","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The linked LinkedIn account to search on behalf of."},{"name":"keywords","in":"query","required":true,"schema":{"type":"string"},"description":"Search terms for LinkedIn groups (multi-word supported, e.g. 'gtm engineering')."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Maximum groups to return per page (1–100, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned from a previous response."}],"responses":{"200":{"description":"A page of LinkedIn groups matching the keyword search. A no-match search returns an empty list, not an error.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["group_search_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"Group search result items.","items":{"type":"object","description":"A single LinkedIn group search result.","properties":{"object":{"type":"string","enum":["group"],"description":"Item type discriminator."},"id":{"type":"string","description":"Numeric group id — the key for a future group-detail read."},"name":{"type":["string","null"],"description":"Group name."},"member_count":{"type":["number","null"],"description":"Display-rounded member count exactly as the search surface shows it ('4K' -> 4000) — an approximation, not an exact count."},"type":{"type":["string","null"],"enum":["public","private",null],"description":"Group visibility."},"url":{"type":"string","description":"https://www.linkedin.com/groups/<id>/"}},"required":["object","id","name","member_count","type","url"]}},"cursor":{"type":["string","null"],"description":"Opaque next-page cursor; null on the last page."}},"required":["object","items","cursor"]},"examples":{"page":{"summary":"A page of matching groups","value":{"object":"group_search_result","items":[{"object":"group","id":"13019519","name":"AI GTM Engineering: The Future of Revenue Operations","member_count":42,"type":"public","url":"https://www.linkedin.com/groups/13019519/"}],"cursor":null}},"empty":{"summary":"No matching groups","value":{"object":"group_search_result","items":[],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id, or missing or empty keywords.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot perform searches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Keyword search for LinkedIn groups. Keyword-only — no filter-id resolution step (the simplest member of the search family). A no-match search returns an empty list, not an error.","x-order":7}},"/v1/{account_id}/search/services":{"post":{"operationId":"postV1AccountIdSearchServices","tags":["Search"],"summary":"Search services","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The linked LinkedIn account to search on behalf of."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"description":"Maximum results per page (1–50, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned from a previous response."}],"responses":{"200":{"description":"A page of people offering services, matching the filters.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["service_search_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"Service-provider search result items.","items":{"type":"object","description":"A single person who offers a service, matching the search filters.","properties":{"object":{"type":"string","enum":["service_provider"],"description":"Item type discriminator."},"id":{"type":["string","null"],"description":"The member id (ACoAAA…) — the key for connect/message/enrich."},"name":{"type":["string","null"],"description":"Display name."},"headline":{"type":["string","null"],"description":"Professional headline."},"location":{"type":["string","null"],"description":"Location string."},"network_distance":{"type":["number","null"],"description":"Connection degree: 1, 2, or 3."},"profile_url":{"type":["string","null"],"description":"Canonical profile URL (https://www.linkedin.com/in/<vanity>/), cleaned of any tracking querystring."},"avatar_url":{"type":["string","null"],"description":"Highest-resolution avatar URL."},"is_verified":{"type":"boolean","description":"True if the profile carries a verification badge."},"is_premium":{"type":"boolean","description":"True if this is a LinkedIn Premium account."}},"required":["object","id","name","headline","location","network_distance","profile_url","avatar_url","is_verified","is_premium"]}},"paging":{"type":"object","description":"Paging metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total matching result count."}},"required":["total_count"]},"cursor":{"type":["string","null"],"description":"Opaque next-page cursor; null on the last page."}},"required":["object","items","paging","cursor"]},"examples":{"page":{"summary":"First page of service-provider results","value":{"object":"service_search_result","items":[{"object":"service_provider","id":"ACoAAA0000000000000000000000000000001","name":"Alex Marketer","headline":"Marketing Strategy Consultant","location":"Berlin, Germany","network_distance":2,"profile_url":"https://www.linkedin.com/in/alex-marketer/","avatar_url":"https://media.licdn.com/dms/image/alex-marketer","is_verified":false,"is_premium":true}],"paging":{"total_count":1000},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id, or no filter supplied — at least one of keywords, service_category, or location is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot perform searches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Searches people who offer services (the LinkedIn Services vertical), filtered by service category, location, connection degree, and profile language. At least one of keywords, service_category, or location is required.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"string","description":"Free-text keyword match."},"service_category":{"type":"array","items":{"type":"string"},"description":"Opaque service-filter ids from GET .../search/services/parameters?type=service_category."},"location":{"type":"array","items":{"type":"string"},"description":"Opaque location ids from GET .../search/services/parameters?type=location."},"connections":{"type":"array","items":{"type":"number","enum":[1,2,3]},"description":"Connection degree filter: 1 = 1st, 2 = 2nd, 3 = 3rd+."},"language":{"type":"array","items":{"type":"string"},"description":"Profile-language ISO 639-1 codes (e.g. en, de, es, fr)."}}}}}},"x-order":8}},"/v1/{account_id}/search/services/parameters":{"get":{"operationId":"getV1AccountIdSearchServicesParameters","tags":["Search"],"summary":"Resolve service-filter values","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The linked LinkedIn account to search on behalf of."},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["service_category","location"],"default":"service_category"},"description":"The service-filter type to resolve: service_category (the 'Add a service category' typeahead) or location (the 'Add a location' typeahead)."},{"name":"keywords","in":"query","required":true,"schema":{"type":"string"},"description":"The typed text to resolve (e.g. 'marke')."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Maximum options to return (1–100, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned from a previous response."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Zero-based pagination offset; a numeric fallback for cursor (default 0)."}],"responses":{"200":{"description":"A list of matching service-filter option ids for use in search/services. Each item maps a human-readable label to an opaque ID.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["search_parameter_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"Resolved service-filter option id / label pairs.","items":{"type":"object","description":"A single service-filter resolution result mapping a human term to an opaque filter ID.","properties":{"id":{"type":"string","description":"Opaque filter ID — pass into search/services' service_category[] or location[]."},"name":{"type":"string","description":"Human-readable label for this filter value."},"type":{"type":"string","enum":["service_category","location"],"description":"Echoes the type this item resolves — service_category or location."}},"required":["id","name","type"]}},"cursor":{"type":["string","null"],"description":"Opaque pagination cursor for the next page, or null when this is the last page."}},"required":["object","items","cursor"]},"examples":{"serviceCategory":{"summary":"Service-category typeahead resolution","value":{"object":"search_parameter_list","items":[{"id":"296","name":"Marketing Strategy","type":"service_category"}],"cursor":null}},"location":{"summary":"Location typeahead resolution","value":{"object":"search_parameter_list","items":[{"id":"103644278","name":"United States","type":"location"}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id or keywords, or an unsupported type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot perform searches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Resolves a typed term into service-filter option ids — the 'Add a service category / Add a location' typeahead of the Services filters. type defaults to service_category.","x-order":9}},"/v1/{account_id}/chats":{"get":{"operationId":"getV1AccountIdChats","tags":["Messaging"],"summary":"List chats","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose chats to list."},{"name":"inbox","in":"query","required":false,"schema":{"type":"string","enum":["primary","inmail","archived","spam","jobs","starred"],"default":"primary"},"description":"Which inbox to list chats from. Defaults to the primary inbox."},{"name":"unread","in":"query","required":false,"schema":{"type":"boolean"},"description":"Filter chats by read status. true returns unread-only; false returns read-only; omit to return all."},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["1to1","group","channel"]},"description":"Filter chats by conversation type."},{"name":"before","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-8601 UTC datetime (exclusive upper bound). Only entries before this time are returned."},{"name":"after","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-8601 UTC datetime (exclusive lower bound). Only entries after this time are returned."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":25,"default":20},"description":"Number of items to return per page (1–25, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"An opaque cursor for pagination. Pass the `cursor` from the preceding response to fetch the next page."}],"responses":{"200":{"description":"A page of chats for the account, plus the next-page cursor.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["chat_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["chat"],"description":"Response type discriminator."},"id":{"type":"string","description":"Chat identifier."},"account_id":{"type":"string","description":"Account id that owns this chat."},"name":{"type":["string","null"],"description":"Chat display name, or null."},"type":{"type":"string","enum":["1to1","group","channel"],"description":"Conversation type."},"is_group":{"type":"boolean"},"is_1to1":{"type":"boolean"},"is_channel":{"type":"boolean"},"is_pinned":{"type":"boolean"},"is_readonly":{"type":"boolean"},"is_archived":{"type":"boolean","description":"True if the chat is archived."},"muted_until":{"type":"boolean","description":"True if notifications for this chat are muted."},"unread_count":{"type":"number","description":"Number of unread messages in this chat."},"folders":{"type":"array","items":{"type":"string"},"description":"Folder labels assigned to this chat."},"provider":{"type":"string","description":"The platform this chat originates from."},"created_at":{"type":"string","description":"ISO-8601 UTC creation timestamp."},"last_message_timestamp":{"type":"string","description":"ISO-8601 UTC timestamp of the last message."},"user_id":{"type":"string","description":"Identifier of the 1:1 counterpart."},"last_message":{"description":"The most recent message in the chat.","type":"object","properties":{"object":{"type":"string","enum":["message"],"description":"Response type discriminator."},"id":{"type":"string","description":"Message identifier."},"account_id":{"type":"string","description":"Account id that owns this message."},"chat_id":{"type":"string","description":"Chat this message belongs to."},"sender_id":{"type":"string","description":"Identifier of the sender."},"text":{"type":["string","null"],"description":"Full message text (content pass-through, never stored)."},"attachments":{"type":"array","description":"Attachment descriptors (no bytes, use the attachment endpoint to download).","items":{"type":"object","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"MIME type of the attachment."},"type":{"type":"string","description":"Attachment kind: file | img | video | audio."},"filename":{"type":"string","description":"Original file name."},"file_size":{"type":"number","description":"Size in bytes."},"unavailable":{"type":["boolean","null"],"description":"True when the attachment is no longer available."}}}},"timestamp":{"type":"string","description":"ISO-8601 UTC send timestamp."},"is_sender":{"type":"boolean","description":"True if the connected account sent this message."},"is_seen":{"type":"boolean"},"is_delivered":{"type":"boolean"},"is_edited":{"type":"boolean"},"is_mentionned":{"type":"boolean","description":"True if the account is mentioned in this message."},"reactions":{"type":"array","description":"Per-type reaction breakdown on the message.","items":{"type":"object","properties":{"type":{"type":"string"},"count":{"type":"number"}}}},"reaction_count":{"type":"number","description":"Total reaction count across all types (derived)."},"provider":{"type":"string","description":"The platform this message originates from."}}},"user":{"description":"The 1:1 counterpart's profile.","type":"object","properties":{"id":{"type":"string","description":"Identifier of the counterpart."},"type":{"type":"string","description":"individual | organization."},"display_name":{"type":"string"},"profile_url":{"type":"string"},"public_picture_url":{"type":"string"}}}}}},"cursor":{"type":["string","null"],"description":"Next-page cursor; follow until items is empty (presence is not a has-more guarantee)."}}},"examples":{"page":{"summary":"First page of chats","value":{"object":"chat_list","items":[{"object":"chat","id":"CLASSIC_2-AAAA1111BBBB2222CCCC","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","name":"Ada Lovelace","type":"1to1","is_group":false,"is_1to1":true,"is_channel":false,"is_pinned":false,"is_readonly":false,"is_archived":false,"muted_until":false,"unread_count":2,"folders":["INBOX"],"provider":"linkedin","created_at":"2026-06-01T09:00:00.000Z","last_message_timestamp":"2026-06-09T14:00:00.000Z","user_id":"ACoAAByyyyyyyyyyyyyyyyyy","last_message":{"object":"message","id":"CLASSIC_1-GGGG7777HHHH8888IIII","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","chat_id":"CLASSIC_2-AAAA1111BBBB2222CCCC","sender_id":"ACoAAByyyyyyyyyyyyyyyyyy","text":"Hi Ada, great to connect!","attachments":[],"timestamp":"2026-06-09T14:00:00.000Z","is_sender":false,"is_seen":true,"is_delivered":true,"is_edited":false,"is_mentionned":false,"reactions":[],"reaction_count":0,"provider":"linkedin"},"user":{"id":"ACoAAByyyyyyyyyyyyyyyyyy","type":"individual","display_name":"Ada Lovelace","profile_url":"https://www.linkedin.com/in/ada","public_picture_url":"https://media.licdn.com/dms/image/ada"}}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1–25), unknown inbox, malformed cursor, or invalid before/after datetime.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a paginated list of chats for a connected account. Use `inbox` to select which inbox (primary by default), and filter by unread status, type, or date range.","x-order":1},"post":{"operationId":"postV1AccountIdChats","tags":["Messaging"],"summary":"Start a chat","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to start the chat from."}],"responses":{"201":{"description":"Chat started. Returns the chat_id and opening message_id.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["chat_started"],"description":"Response type discriminator."},"chat_id":{"type":"string","description":"The chat's identifier (existing thread reused when messaging a known 1:1 contact)."},"message_id":{"type":"string","description":"The opening message identifier."}}},"examples":{"created":{"summary":"Chat started","value":{"object":"chat_started","chat_id":"CLASSIC_2-DDDD4444EEEE5555FFFF","message_id":"CLASSIC_1-GGGG7777HHHH8888IIII"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request: missing attendees_ids or text, an unknown option, or a rejected api/specifics field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"413":{"description":"Payload too large: an attachment exceeds 5 MiB or the total body exceeds 8 MiB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"413 error","value":{"code":"PAYLOAD_TOO_LARGE","message":"An uploaded part or the request body exceeds the size limit.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"415":{"description":"Unsupported media type: the request must use application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"415 error","value":{"code":"UNSUPPORTED_MEDIA_TYPE","message":"The request content type or attachment format is not accepted.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The recipient is unreachable, or the account is restricted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Starts a new chat with one or more members from a connected account. Send application/json; attach files as base64-encoded attachments (max 5 MiB per file). Message content passes through to the platform and is never stored. Company pages are reply-only and cannot start a conversation; reply using a `COMPANY_` chat id from GET /v1/{account_id}/inboxes/{inbox_id}/chats instead.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"attendees_ids":{"type":"array","items":{"type":"string"},"description":"LinkedIn member provider IDs for the chat recipients (≥ 1, e.g. ACo…)."},"text":{"type":"string","description":"Opening message text (1–8000 chars)."},"subject":{"type":"string","description":"Optional conversation name / subject line (≤ 200 chars)."},"attachments":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string","description":"Base64-encoded file bytes."},"content_type":{"type":"string","description":"Attachment MIME type (e.g. image/png, application/pdf)."},"filename":{"type":"string","description":"File name for the attachment."}},"required":["content","content_type","filename"]},"description":"Optional file attachments (base64-encoded)."},"topic":{"type":"string","enum":["service_request","request_demo","support","careers","other"],"description":"Mandatory when starting a conversation with a company. One of: service_request, request_demo, support, careers, other."},"applicant_id":{"type":"string","description":"Required when messaging a job applicant."},"invitation_id":{"type":"string","description":"Required when messaging a member whose invitation is pending."},"inmail":{"type":"boolean","description":"When true, starts the conversation as an InMail instead of a standard message."}},"required":["attendees_ids","text"]},"examples":{"textOnly":{"summary":"Start a chat with one recipient (text only)","value":{"attendees_ids":["ACoAAxxxxxxxxxxxxxxxxxxxx"],"text":"Hi Ada, great to connect!"}},"withSubject":{"summary":"Start a chat with a subject line","value":{"attendees_ids":["ACoAAxxxxxxxxxxxxxxxxxxxx"],"text":"Following up on our earlier conversation.","subject":"Follow-up"}},"withTopic":{"summary":"Message a company page with a topic","value":{"attendees_ids":["ACoAAcompany000000000000"],"text":"Hi, I would like to request a product demo.","topic":"request_demo"}},"withAttachment":{"summary":"Start a chat with a base64 file attachment","value":{"attendees_ids":["ACoAAxxxxxxxxxxxxxxxxxxxx"],"text":"Sharing a file with you.","attachments":[{"content":"aGVsbG8gd29ybGQ=","content_type":"text/plain","filename":"note.txt"}]}}}}}},"x-order":2}},"/v1/{account_id}/chats/{chat_id}":{"get":{"operationId":"getV1AccountIdChatsChatId","tags":["Messaging"],"summary":"Retrieve a chat","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that owns the chat."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the chat to retrieve."}],"responses":{"200":{"description":"The chat's metadata and most-recent message.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["chat"],"description":"Response type discriminator."},"id":{"type":"string","description":"Chat identifier."},"account_id":{"type":"string","description":"Account id that owns this chat."},"name":{"type":["string","null"],"description":"Chat display name, or null."},"type":{"type":"string","enum":["1to1","group","channel"],"description":"Conversation type."},"is_group":{"type":"boolean"},"is_1to1":{"type":"boolean"},"is_channel":{"type":"boolean"},"is_pinned":{"type":"boolean"},"is_readonly":{"type":"boolean"},"is_archived":{"type":"boolean","description":"True if the chat is archived."},"muted_until":{"type":"boolean","description":"True if notifications for this chat are muted."},"unread_count":{"type":"number","description":"Number of unread messages in this chat."},"folders":{"type":"array","items":{"type":"string"},"description":"Folder labels assigned to this chat."},"provider":{"type":"string","description":"The platform this chat originates from."},"created_at":{"type":"string","description":"ISO-8601 UTC creation timestamp."},"last_message_timestamp":{"type":"string","description":"ISO-8601 UTC timestamp of the last message."},"user_id":{"type":"string","description":"Identifier of the 1:1 counterpart."},"last_message":{"description":"The most recent message in the chat.","type":"object","properties":{"object":{"type":"string","enum":["message"],"description":"Response type discriminator."},"id":{"type":"string","description":"Message identifier."},"account_id":{"type":"string","description":"Account id that owns this message."},"chat_id":{"type":"string","description":"Chat this message belongs to."},"sender_id":{"type":"string","description":"Identifier of the sender."},"text":{"type":["string","null"],"description":"Full message text (content pass-through, never stored)."},"attachments":{"type":"array","description":"Attachment descriptors (no bytes, use the attachment endpoint to download).","items":{"type":"object","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"MIME type of the attachment."},"type":{"type":"string","description":"Attachment kind: file | img | video | audio."},"filename":{"type":"string","description":"Original file name."},"file_size":{"type":"number","description":"Size in bytes."},"unavailable":{"type":["boolean","null"],"description":"True when the attachment is no longer available."}}}},"timestamp":{"type":"string","description":"ISO-8601 UTC send timestamp."},"is_sender":{"type":"boolean","description":"True if the connected account sent this message."},"is_seen":{"type":"boolean"},"is_delivered":{"type":"boolean"},"is_edited":{"type":"boolean"},"is_mentionned":{"type":"boolean","description":"True if the account is mentioned in this message."},"reactions":{"type":"array","description":"Per-type reaction breakdown on the message.","items":{"type":"object","properties":{"type":{"type":"string"},"count":{"type":"number"}}}},"reaction_count":{"type":"number","description":"Total reaction count across all types (derived)."},"provider":{"type":"string","description":"The platform this message originates from."}}},"user":{"description":"The 1:1 counterpart's profile.","type":"object","properties":{"id":{"type":"string","description":"Identifier of the counterpart."},"type":{"type":"string","description":"individual | organization."},"display_name":{"type":"string"},"profile_url":{"type":"string"},"public_picture_url":{"type":"string"}}}}},"examples":{"chat":{"summary":"A 1:1 chat","value":{"object":"chat","id":"CLASSIC_2-AAAA1111BBBB2222CCCC","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","name":"Ada Lovelace","type":"1to1","is_group":false,"is_1to1":true,"is_channel":false,"is_pinned":false,"is_readonly":false,"is_archived":false,"muted_until":false,"unread_count":2,"folders":["INBOX"],"provider":"linkedin","created_at":"2026-06-01T09:00:00.000Z","last_message_timestamp":"2026-06-09T14:00:00.000Z","user_id":"ACoAAByyyyyyyyyyyyyyyyyy","last_message":{"object":"message","id":"CLASSIC_1-GGGG7777HHHH8888IIII","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","chat_id":"CLASSIC_2-AAAA1111BBBB2222CCCC","sender_id":"ACoAAByyyyyyyyyyyyyyyyyy","text":"Hi Ada, great to connect!","attachments":[],"timestamp":"2026-06-09T14:00:00.000Z","is_sender":false,"is_seen":true,"is_delivered":true,"is_edited":false,"is_mentionned":false,"reactions":[],"reaction_count":0,"provider":"linkedin"},"user":{"id":"ACoAAByyyyyyyyyyyyyyyyyy","type":"individual","display_name":"Ada Lovelace","profile_url":"https://www.linkedin.com/in/ada","public_picture_url":"https://media.licdn.com/dms/image/ada"}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The chat does not exist for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Retrieves a single chat by ID, including the most recent message. Returns 404 RESOURCE_NOT_FOUND if the chat does not exist or belongs to another account.","x-order":3},"patch":{"operationId":"patchV1AccountIdChatsChatId","tags":["Messaging"],"summary":"Update a chat","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that owns the chat."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the chat to update."}],"responses":{"200":{"description":"The chat was updated. Echoes the applied field.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["chat_updated"],"description":"Response type discriminator."},"chat_id":{"type":"string","description":"The updated chat's identifier."},"read":{"type":"boolean","description":"The applied read status."}}},"examples":{"updated":{"summary":"Marked read","value":{"object":"chat_updated","chat_id":"CLASSIC_2-AAAA1111BBBB2222CCCC","read":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"read not supplied, or a non-boolean value.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The chat does not exist for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Marks a chat read or unread. read is required and must be a boolean.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"read":{"type":"boolean","description":"Mark the chat read (true) or unread (false)."}}},"examples":{"markRead":{"summary":"Mark a chat read","value":{"read":true}},"markUnread":{"summary":"Mark a chat unread","value":{"read":false}}}}}},"x-order":4}},"/v1/{account_id}/chats/{chat_id}/messages":{"get":{"operationId":"getV1AccountIdChatsChatIdMessages","tags":["Messaging"],"summary":"List messages in a chat","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that owns the chat."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the chat to list messages from."},{"name":"user_id","in":"query","required":false,"schema":{"type":"string"},"description":"Optional filter: only return messages from this sender ID."},{"name":"before","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-8601 UTC datetime (exclusive upper bound). Only entries before this time are returned."},{"name":"after","in":"query","required":false,"schema":{"type":"string"},"description":"ISO-8601 UTC datetime (exclusive lower bound). Only entries after this time are returned."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":25,"default":20},"description":"Number of items to return per page (1–25, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"An opaque cursor for pagination. Pass the `cursor` from the preceding response to fetch the next page."}],"responses":{"200":{"description":"A page of messages from the chat. Full message text is returned verbatim (content pass-through).","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["message_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["message"],"description":"Response type discriminator."},"id":{"type":"string","description":"Message identifier."},"account_id":{"type":"string","description":"Account id that owns this message."},"chat_id":{"type":"string","description":"Chat this message belongs to."},"sender_id":{"type":"string","description":"Identifier of the sender."},"text":{"type":["string","null"],"description":"Full message text (content pass-through, never stored)."},"attachments":{"type":"array","description":"Attachment descriptors (no bytes, use the attachment endpoint to download).","items":{"type":"object","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"MIME type of the attachment."},"type":{"type":"string","description":"Attachment kind: file | img | video | audio."},"filename":{"type":"string","description":"Original file name."},"file_size":{"type":"number","description":"Size in bytes."},"unavailable":{"type":["boolean","null"],"description":"True when the attachment is no longer available."}}}},"timestamp":{"type":"string","description":"ISO-8601 UTC send timestamp."},"is_sender":{"type":"boolean","description":"True if the connected account sent this message."},"is_seen":{"type":"boolean"},"is_delivered":{"type":"boolean"},"is_edited":{"type":"boolean"},"is_mentionned":{"type":"boolean","description":"True if the account is mentioned in this message."},"reactions":{"type":"array","description":"Per-type reaction breakdown on the message.","items":{"type":"object","properties":{"type":{"type":"string"},"count":{"type":"number"}}}},"reaction_count":{"type":"number","description":"Total reaction count across all types (derived)."},"provider":{"type":"string","description":"The platform this message originates from."}}}},"cursor":{"type":["string","null"],"description":"Next-page cursor; follow until items is empty."}}},"examples":{"page":{"summary":"First page of messages","value":{"object":"message_list","items":[{"object":"message","id":"CLASSIC_1-GGGG7777HHHH8888IIII","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","chat_id":"CLASSIC_2-AAAA1111BBBB2222CCCC","sender_id":"ACoAAByyyyyyyyyyyyyyyyyy","text":"Hi Ada, great to connect!","attachments":[],"timestamp":"2026-06-09T14:00:00.000Z","is_sender":false,"is_seen":true,"is_delivered":true,"is_edited":false,"is_mentionned":false,"reactions":[],"reaction_count":0,"provider":"linkedin"}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1–25), malformed cursor, or invalid before/after datetime.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The chat does not exist for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns a paginated list of messages for the specified chat. Supports filtering by sender (`user_id`), date range, and pagination cursor.","x-order":5},"post":{"operationId":"postV1AccountIdChatsChatIdMessages","tags":["Messaging"],"summary":"Send a message","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that owns the chat."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the chat to send the message to. A COMPANY_ chat id (e.g. 'COMPANY_83734124_2-YTQ3ODU3Njgt', from the inboxes endpoints) sends this message as that company page instead of the connected member."}],"responses":{"201":{"description":"Message sent. Returns the new message_id and sent_as, the acting identity. Reply as a company page simply by sending into one of its chat ids (from GET /v1/{account_id}/inboxes/{inbox_id}/chats): a COMPANY_ chat id (e.g. `COMPANY_83734124_2-…`) sends AS THE PAGE and echoes sent_as:{kind:'company',company_id,name} (company_id is null when the page could not be correlated to a managed page). Any other chat id sends as the connected member and echoes sent_as:{kind:'personal'}. Never infer the acting identity from the message's sender field, only from sent_as.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["message_sent"],"description":"Response type discriminator."},"message_id":{"type":"string","description":"The sent message's identifier."},"sent_as":{"type":"object","description":"The identity this message was actually sent as.","properties":{"kind":{"type":"string","enum":["personal","company"],"description":"Which identity sent the message."},"company_id":{"type":["string","null"],"description":"Company inboxes only. Null when this page is not one of the account's managed companies on Curviate, even though the page itself, and its name, are still known."},"name":{"type":["string","null"],"description":"Company inboxes only. The page's display name, or null in the rare case the page itself could not be resolved at all."}}}}},"examples":{"sent":{"summary":"Message sent (personal)","value":{"object":"message_sent","message_id":"CLASSIC_1-GGGG7777HHHH8888IIII","sent_as":{"kind":"personal"}}},"sentAsCompany":{"summary":"Message sent as a company page","value":{"object":"message_sent","message_id":"COMPANY_83734124_1-GGGG7777HHHH8888IIII","sent_as":{"kind":"company","company_id":"112013061","name":"RedHire"}}},"sentAsCompanyUncorrelated":{"summary":"Message sent as a company page the account does not manage on Curviate (company_id null, name still known)","value":{"object":"message_sent","message_id":"COMPANY_99999999_1-JJJJ0000KKKK1111LLLL","sent_as":{"kind":"company","company_id":null,"name":"Ghost Page"}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request: at least one of text or attachments must be supplied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The chat does not exist for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"413":{"description":"Payload too large: an attachment exceeds 5 MiB or the total body exceeds 8 MiB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"413 error","value":{"code":"PAYLOAD_TOO_LARGE","message":"An uploaded part or the request body exceeds the size limit.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"415":{"description":"Unsupported media type: the request must use application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"415 error","value":{"code":"UNSUPPORTED_MEDIA_TYPE","message":"The request content type or attachment format is not accepted.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Sends a message into an existing chat. Send application/json with text, base64 attachments (max 5 MiB per file), or both; at least one of text or attachments is required. Message content passes through to the platform and is never stored. Sending on behalf of a company page: use a COMPANY_ chat id (from GET /v1/{account_id}/inboxes/{inbox_id}/chats) and the message sends AS THE PAGE, no separate parameter needed. The response's sent_as field names the acting identity that was actually used. Company pages are reply-only: this endpoint can answer an existing conversation on a page's behalf, but a page can never start a new one.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"Message text (1–8000 chars). Optional when at least one attachment is supplied."},"quote_id":{"type":"string","description":"Optional message ID to quote or reply to."},"attachments":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string","description":"Base64-encoded file bytes."},"content_type":{"type":"string","description":"Attachment MIME type (e.g. image/png, application/pdf)."},"filename":{"type":"string","description":"File name for the attachment."}},"required":["content","content_type","filename"]},"description":"Optional file attachments (base64-encoded)."}}},"examples":{"textOnly":{"summary":"Send a plain text message","value":{"text":"Hi Ada, great to connect!"}},"withQuote":{"summary":"Reply quoting an earlier message","value":{"text":"Replying to your note.","quote_id":"CLASSIC_1-GGGG7777HHHH8888IIII"}},"withAttachment":{"summary":"Send a message with a base64 file attachment","value":{"attachments":[{"content":"aGVsbG8=","content_type":"audio/mp4","filename":"clip.m4a"}]}}}}}},"x-order":6}},"/v1/{account_id}/chats/{chat_id}/messages/{message_id}":{"get":{"operationId":"getV1AccountIdChatsChatIdMessagesMessageId","tags":["Messaging"],"summary":"Retrieve a message","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that owns the chat."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the chat that contains the message."},{"name":"message_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the message to retrieve."}],"responses":{"200":{"description":"A single message, including its full text and attachment descriptors.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["message"],"description":"Response type discriminator."},"id":{"type":"string","description":"Message identifier."},"account_id":{"type":"string","description":"Account id that owns this message."},"chat_id":{"type":"string","description":"Chat this message belongs to."},"sender_id":{"type":"string","description":"Identifier of the sender."},"text":{"type":["string","null"],"description":"Full message text (content pass-through, never stored)."},"attachments":{"type":"array","description":"Attachment descriptors (no bytes, use the attachment endpoint to download).","items":{"type":"object","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"MIME type of the attachment."},"type":{"type":"string","description":"Attachment kind: file | img | video | audio."},"filename":{"type":"string","description":"Original file name."},"file_size":{"type":"number","description":"Size in bytes."},"unavailable":{"type":["boolean","null"],"description":"True when the attachment is no longer available."}}}},"timestamp":{"type":"string","description":"ISO-8601 UTC send timestamp."},"is_sender":{"type":"boolean","description":"True if the connected account sent this message."},"is_seen":{"type":"boolean"},"is_delivered":{"type":"boolean"},"is_edited":{"type":"boolean"},"is_mentionned":{"type":"boolean","description":"True if the account is mentioned in this message."},"reactions":{"type":"array","description":"Per-type reaction breakdown on the message.","items":{"type":"object","properties":{"type":{"type":"string"},"count":{"type":"number"}}}},"reaction_count":{"type":"number","description":"Total reaction count across all types (derived)."},"provider":{"type":"string","description":"The platform this message originates from."}}},"examples":{"message":{"summary":"A text message","value":{"object":"message","id":"CLASSIC_1-GGGG7777HHHH8888IIII","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","chat_id":"CLASSIC_2-AAAA1111BBBB2222CCCC","sender_id":"ACoAAByyyyyyyyyyyyyyyyyy","text":"Hi Ada, great to connect!","attachments":[],"timestamp":"2026-06-09T14:00:00.000Z","is_sender":false,"is_seen":true,"is_delivered":true,"is_edited":false,"is_mentionned":false,"reactions":[],"reaction_count":0,"provider":"linkedin"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The message does not exist for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Retrieves a single message by ID, including its full text and attachment descriptors.","x-order":7},"patch":{"operationId":"patchV1AccountIdChatsChatIdMessagesMessageId","tags":["Messaging"],"summary":"Edit a message","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that owns the chat."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the chat that contains the message."},{"name":"message_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the message to edit."}],"responses":{"200":{"description":"Message edited. Returns the message_id.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["message_edited"],"description":"Response type discriminator."},"message_id":{"type":"string","description":"The edited message's identifier."}}},"examples":{"edited":{"summary":"Message edited","value":{"object":"message_edited","message_id":"CLASSIC_1-GGGG7777HHHH8888IIII"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request: missing text or unknown field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The message does not exist for this chat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The edit window (~60 minutes) has passed for this message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Edits a previously sent message within the ~60-minute edit window. Returns 422 MESSAGE_WINDOW_EXPIRED if the window has passed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"Replacement message text (1–8000 chars)."}},"required":["text"]},"examples":{"minimal":{"summary":"Edit a message's text","value":{"text":"Hi Ada, great to connect! (edited)"}}}}}},"x-order":8},"delete":{"operationId":"deleteV1AccountIdChatsChatIdMessagesMessageId","tags":["Messaging"],"summary":"Delete a message","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that owns the chat."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the chat that contains the message."},{"name":"message_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the message to delete."}],"responses":{"200":{"description":"Message deleted. Returns the message_id.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["message_deleted"],"description":"Response type discriminator."},"message_id":{"type":"string","description":"The deleted message's identifier."}}},"examples":{"deleted":{"summary":"Message deleted","value":{"object":"message_deleted","message_id":"CLASSIC_1-GGGG7777HHHH8888IIII"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The message does not exist for this chat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The delete window (~60 minutes) has passed for this message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Deletes a previously sent message within the ~60-minute delete window. Returns 422 MESSAGE_WINDOW_EXPIRED if the window has passed.","x-order":9}},"/v1/{account_id}/chats/{chat_id}/messages/{message_id}/reactions":{"post":{"operationId":"postV1AccountIdChatsChatIdMessagesMessageIdReactions","tags":["Messaging"],"summary":"Add a reaction to a message","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that owns the chat."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the chat that contains the message."},{"name":"message_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the message to react to."}],"responses":{"200":{"description":"Reaction added. Returns the message_id and the emoji reaction value.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["message_reaction_added"],"description":"Response type discriminator."},"message_id":{"type":"string","description":"The message that received the reaction."},"reaction":{"type":"string","description":"The emoji reaction value."}}},"examples":{"reacted":{"summary":"Reaction added","value":{"object":"message_reaction_added","message_id":"CLASSIC_1-GGGG7777HHHH8888IIII","reaction":"👍"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request: missing reaction field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The message does not exist for this chat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Adds a LinkedIn emoji reaction to a message.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reaction":{"type":"string","description":"Native emoji reaction value (e.g. 👍). Must be a valid LinkedIn reaction emoji."}},"required":["reaction"]},"examples":{"thumbsUp":{"summary":"Add a thumbs-up reaction","value":{"reaction":"👍"}}}}}},"x-order":10}},"/v1/{account_id}/chats/{chat_id}/messages/{message_id}/attachments/{attachment_id}":{"get":{"operationId":"getV1AccountIdChatsChatIdMessagesMessageIdAttachmentsAttachmentId","tags":["Messaging"],"summary":"Retrieve an attachment from a message","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that owns the chat."},{"name":"chat_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the chat that contains the message."},{"name":"message_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the message that contains the attachment."},{"name":"attachment_id","in":"path","required":true,"schema":{"type":"string"},"description":"The unique identifier of the attachment to retrieve."}],"responses":{"200":{"description":"The raw attachment bytes, served on demand with the original content type. No attachment bytes are stored by Curviate.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary","description":"Raw attachment bytes. The Content-Type and Content-Disposition headers are set by the server from the attachment metadata."},"examples":{"binary":{"summary":"Raw attachment bytes","value":"<binary attachment bytes, served with the original Content-Type and a Content-Disposition filename>"}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The message or attachment does not exist for this chat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Streams the raw bytes of a message attachment with its original content type. No attachment bytes are stored by Curviate; they are served on demand.","x-order":11}},"/v1/{account_id}/chats/search":{"get":{"operationId":"getV1AccountIdChatsSearch","tags":["Messaging"],"summary":"Search chats","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose inbox to search."},{"name":"query","in":"query","required":true,"schema":{"type":"string"},"description":"The search term: matches both participant names and message content (e.g. 'sophie keller')."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Maximum chats to return per page (1–100, default 20). The server may walk a few internal pages to fill one page."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor returned from a previous response; wraps a zero-based item offset."}],"responses":{"200":{"description":"A page of chats matching the search term (participant names and/or message content), plus the next-page cursor.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["chat_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["chat"],"description":"Response type discriminator."},"id":{"type":"string","description":"Chat identifier."},"account_id":{"type":"string","description":"Account id that owns this chat."},"name":{"type":["string","null"],"description":"Chat display name, or null."},"type":{"type":"string","enum":["1to1","group"],"description":"Conversation type (search results are never channels)."},"is_group":{"type":"boolean"},"is_1to1":{"type":"boolean"},"unread_count":{"type":"number","description":"Number of unread messages in this chat."},"user_id":{"type":"string","description":"Identifier of the 1:1 counterpart, when the match is a 1:1 chat."},"last_message":{"description":"The most recent message in the chat, when the search carrier returned one.","type":"object","properties":{"object":{"type":"string","enum":["message"],"description":"Response type discriminator."},"id":{"type":"string","description":"Message identifier."},"account_id":{"type":"string","description":"Account id that owns this message."},"text":{"type":["string","null"],"description":"Full message text (content pass-through, never stored)."},"sender_id":{"type":"string","description":"Identifier of the sender."},"attachments":{"type":"array","description":"Always empty; the search carrier does not surface attachment descriptors.","items":{"type":"object","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"MIME type of the attachment."},"type":{"type":"string","description":"Attachment kind: file | img | video | audio."},"filename":{"type":"string","description":"Original file name."},"file_size":{"type":"number","description":"Size in bytes."},"unavailable":{"type":["boolean","null"],"description":"True when the attachment is no longer available."}}}}}}}}},"cursor":{"type":["string","null"],"description":"Opaque next-page cursor; null on the last page."}}},"examples":{"page":{"summary":"A matching chat","value":{"object":"chat_list","items":[{"object":"chat","id":"CLASSIC_2-AAAA1111BBBB2222CCCC","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","name":"Ada Lovelace","type":"1to1","is_group":false,"is_1to1":true,"unread_count":2,"user_id":"ACoAAByyyyyyyyyyyyyyyyyy","last_message":{"object":"message","id":"CLASSIC_1-GGGG7777HHHH8888IIII","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","text":"Hi Ada, great to connect!","sender_id":"ACoAAByyyyyyyyyyyyyyyyyy","attachments":[]}}],"cursor":null}},"empty":{"summary":"No matching chats","value":{"object":"chat_list","items":[],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id, or missing or empty query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited: slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Free-text search of the connected account's own inbox. Matches both participant names and message content. A no-match term returns an empty list, not an error.","x-order":12}},"/v1/{account_id}/messages/inmail":{"post":{"operationId":"postV1AccountIdMessagesInmail","tags":["Messaging"],"summary":"Send an InMail","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to send the InMail from."}],"responses":{"201":{"description":"InMail sent. Returns message_id and chat_id.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["inmail_sent"],"description":"Response type discriminator."},"message_id":{"type":"string","description":"The InMail message identifier."},"chat_id":{"type":"string","description":"The conversation thread identifier."}}},"examples":{"sent":{"summary":"InMail sent","value":{"object":"inmail_sent","message_id":"msg_01J8Z3GGGG7777HHHH8888III","chat_id":"chat_01J8Z3AAAA1111BBBB2222CCC"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request: missing required fields or malformed recipient_urn.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account is missing the InMail credits or premium subscription needed to send.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The supplied account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The recipient is unreachable via InMail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Sends a LinkedIn InMail from the account's own premium InMail credits to a member who is not a direct connection.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"recipient_urn":{"type":"string","description":"LinkedIn member URN (`urn:li:member:<id>`) or member provider id (`ACo…`)."},"subject":{"type":"string","description":"InMail subject line (1–200 chars)."},"text":{"type":"string","description":"InMail body text (1–8000 chars)."}},"required":["recipient_urn","subject","text"]},"examples":{"classic":{"summary":"Send a classic InMail (premium credits, recipient by provider id)","value":{"recipient_urn":"ACoAAA1B2c3D4e5F6g7H8i9J0kLmNoPqRsTuVwX","subject":"Exploring synergies","text":"Hi Ada, I came across your profile and would love to connect."}},"byUrn":{"summary":"Send a classic InMail (recipient by member URN)","value":{"recipient_urn":"urn:li:member:99999","subject":"Exploring synergies","text":"Hi Ada, I came across your profile and would love to connect."}}}}}},"x-order":12}},"/v1/{account_id}/inboxes":{"get":{"operationId":"getV1AccountIdInboxes","tags":["Messaging"],"summary":"List inboxes","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose inboxes to list."},{"name":"kind","in":"query","required":false,"schema":{"type":"string","enum":["personal","company"]},"description":"Filter to only personal (CLASSIC_) or only company (COMPANY_) inboxes. Omit to list both."},{"name":"company_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter to the one company inbox correlated to this managed-company id (e.g. '112013061')."}],"responses":{"200":{"description":"The account's inboxes: its own personal inbox, plus, when the company product is attached, one entry per company page (e.g. id='COMPANY_83734124_PRIMARY'). When no company inbox exists, hint names the Company Pages reconnect requirement instead of returning silently empty. This is the discovery step of the reply-as-a-page flow: find a company inbox here, read its conversations with GET /v1/{account_id}/inboxes/{inbox_id}/chats, then reply with the existing POST /v1/{account_id}/chats/{chat_id}/messages using one of its chat ids.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["inbox_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["inbox"],"description":"Response type discriminator."},"id":{"type":"string","description":"Inbox identifier. Pass it to the inbox-chats endpoint below to read its conversations."},"kind":{"type":"string","enum":["personal","company"],"description":"Whether this is the account's own inbox or a company page's."},"folder":{"type":"string","description":"Folder within the inbox, e.g. 'primary', 'archived', 'spam'."},"name":{"type":["string","null"],"description":"Personal: the folder's display name. Company: the page's display name."},"company_id":{"type":["string","null"],"description":"Company inboxes only. The managed-company id this mailbox was correlated to, or null when it could not be correlated (never a fabricated id)."},"mailbox_id":{"type":["string","null"],"description":"Company inboxes only. The substrate's internal mailbox id (distinct from company_id)."},"reply_only":{"type":"boolean","description":"True for company inboxes: a company page can only reply to an existing conversation, it can never start one."}}}},"hint":{"type":"string","description":"Present only when no company inbox exists. Names the reconnect requirement."}}},"examples":{"withCompany":{"summary":"Personal inbox plus one company page","value":{"object":"inbox_list","items":[{"object":"inbox","id":"CLASSIC_PRIMARY","kind":"personal","folder":"primary","name":"Primary","company_id":null,"mailbox_id":null,"reply_only":false},{"object":"inbox","id":"COMPANY_83734124_PRIMARY","kind":"company","folder":"primary","name":"RedHire","company_id":"112013061","mailbox_id":"83734124","reply_only":true}]}},"noCompanyAttached":{"summary":"No company product attached: an actionable hint, not silent emptiness","value":{"object":"inbox_list","items":[{"object":"inbox","id":"CLASSIC_PRIMARY","kind":"personal","folder":"primary","name":"Primary","company_id":null,"mailbox_id":null,"reply_only":false}],"hint":"No company inboxes found. Reconnect this account with the Company Pages scope to attach one."}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid kind or company_id filter value.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"},{"name":"Beta","position":"after","color":"#60A5FA"}],"x-curviate-stability":"beta","description":"Returns the account's personal inbox plus, when the company product is attached, one entry per company page × folder (id like 'COMPANY_83734124_PRIMARY'). Company inboxes carry reply_only:true; company pages can only reply to existing conversations, never start one. company_id is resolved by correlating the page name against the account's managed pages; an uncorrelatable page returns company_id:null, never a fabricated id. When no company inbox exists, hint names the Company Pages reconnect requirement instead of returning silently empty.","x-order":13}},"/v1/{account_id}/inboxes/{inbox_id}/chats":{"get":{"operationId":"getV1AccountIdInboxesInboxIdChats","tags":["Messaging"],"summary":"List an inbox's conversations","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose inbox to list."},{"name":"inbox_id","in":"path","required":true,"schema":{"type":"string"},"description":"The inbox ID (e.g. 'CLASSIC_PRIMARY' or 'COMPANY_83734124_PRIMARY') from GET /inboxes."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":25,"default":20},"description":"Number of items to return per page (1–25, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"An opaque cursor for pagination. Pass the `cursor` from the preceding response to fetch the next page."}],"responses":{"200":{"description":"A page of the inbox's conversations, newest-activity-first, in the same shape as GET /v1/{account_id}/chats. Each chat's id is send-ready: pass it directly to POST /v1/{account_id}/chats/{chat_id}/messages to reply. A company inbox's chats carry ids like 'COMPANY_83734124_2-YTQ3ODU3Njgt'; replying with that id sends AS THE PAGE, no separate parameter needed, and the send response's sent_as field confirms it. Works identically for personal (CLASSIC_) inboxes.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["inbox_chat_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["chat"],"description":"Response type discriminator."},"id":{"type":"string","description":"Chat identifier."},"account_id":{"type":"string","description":"Account id that owns this chat."},"name":{"type":["string","null"],"description":"Chat display name, or null."},"type":{"type":"string","enum":["1to1","group","channel"],"description":"Conversation type."},"is_group":{"type":"boolean"},"is_1to1":{"type":"boolean"},"is_channel":{"type":"boolean"},"is_pinned":{"type":"boolean"},"is_readonly":{"type":"boolean"},"is_archived":{"type":"boolean","description":"True if the chat is archived."},"muted_until":{"type":"boolean","description":"True if notifications for this chat are muted."},"unread_count":{"type":"number","description":"Number of unread messages in this chat."},"folders":{"type":"array","items":{"type":"string"},"description":"Folder labels assigned to this chat."},"provider":{"type":"string","description":"The platform this chat originates from."},"created_at":{"type":"string","description":"ISO-8601 UTC creation timestamp."},"last_message_timestamp":{"type":"string","description":"ISO-8601 UTC timestamp of the last message."},"user_id":{"type":"string","description":"Identifier of the 1:1 counterpart."},"last_message":{"description":"The most recent message in the chat.","type":"object","properties":{"object":{"type":"string","enum":["message"],"description":"Response type discriminator."},"id":{"type":"string","description":"Message identifier."},"account_id":{"type":"string","description":"Account id that owns this message."},"chat_id":{"type":"string","description":"Chat this message belongs to."},"sender_id":{"type":"string","description":"Identifier of the sender."},"text":{"type":["string","null"],"description":"Full message text (content pass-through, never stored)."},"attachments":{"type":"array","description":"Attachment descriptors (no bytes, use the attachment endpoint to download).","items":{"type":"object","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"MIME type of the attachment."},"type":{"type":"string","description":"Attachment kind: file | img | video | audio."},"filename":{"type":"string","description":"Original file name."},"file_size":{"type":"number","description":"Size in bytes."},"unavailable":{"type":["boolean","null"],"description":"True when the attachment is no longer available."}}}},"timestamp":{"type":"string","description":"ISO-8601 UTC send timestamp."},"is_sender":{"type":"boolean","description":"True if the connected account sent this message."},"is_seen":{"type":"boolean"},"is_delivered":{"type":"boolean"},"is_edited":{"type":"boolean"},"is_mentionned":{"type":"boolean","description":"True if the account is mentioned in this message."},"reactions":{"type":"array","description":"Per-type reaction breakdown on the message.","items":{"type":"object","properties":{"type":{"type":"string"},"count":{"type":"number"}}}},"reaction_count":{"type":"number","description":"Total reaction count across all types (derived)."},"provider":{"type":"string","description":"The platform this message originates from."}}},"user":{"description":"The 1:1 counterpart's profile.","type":"object","properties":{"id":{"type":"string","description":"Identifier of the counterpart."},"type":{"type":"string","description":"individual | organization."},"display_name":{"type":"string"},"profile_url":{"type":"string"},"public_picture_url":{"type":"string"}}}}}},"cursor":{"type":["string","null"],"description":"Next-page cursor. Follow until items is empty."}}},"examples":{"page":{"summary":"A company page's chats: one open conversation from a prospect","value":{"object":"inbox_chat_list","items":[{"object":"chat","id":"COMPANY_83734124_2-YTQ3ODU3Njgt","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","name":"Dana Lee","type":"1to1","is_group":false,"is_1to1":true,"is_channel":false,"is_pinned":false,"is_readonly":false,"is_archived":false,"muted_until":false,"unread_count":2,"folders":["INBOX"],"provider":"linkedin","created_at":"2026-06-01T09:00:00.000Z","last_message_timestamp":"2026-06-09T14:00:00.000Z","user_id":"ACoAAByyyyyyyyyyyyyyyyyy","last_message":{"object":"message","id":"CLASSIC_1-GGGG7777HHHH8888IIII","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","chat_id":"CLASSIC_2-AAAA1111BBBB2222CCCC","sender_id":"ACoAAByyyyyyyyyyyyyyyyyy","text":"Hi Ada, great to connect!","attachments":[],"timestamp":"2026-06-09T14:00:00.000Z","is_sender":false,"is_seen":true,"is_delivered":true,"is_edited":false,"is_mentionned":false,"reactions":[],"reaction_count":0,"provider":"linkedin"},"user":{"id":"ACoAADanaLee00000000000","type":"individual","display_name":"Dana Lee","profile_url":"https://www.linkedin.com/in/dana-lee","public_picture_url":"https://media.licdn.com/dms/image/dana"}}],"cursor":null}},"empty":{"summary":"No conversations yet","value":{"object":"inbox_chat_list","items":[],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1-25), malformed cursor, or a malformed/unknown-folder inbox_id (rejected before the substrate is ever called; see GET /inboxes for valid ids).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The connected account does not administer this inbox: either it is not an admin of this page, or the mailbox is unknown to this account. No existence disclosure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"RESOURCE_ACCESS_RESTRICTED","message":"The connected account is not an admin of this page.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"},{"name":"Beta","position":"after","color":"#60A5FA"}],"x-curviate-stability":"beta","description":"Returns a paginated list of an inbox's conversations, newest-activity-first. Each chat's id is send-ready: pass it directly to the send-message endpoint to reply; a company inbox's chat id (e.g. 'COMPANY_83734124_2-…') replies AS THE PAGE, no separate parameter needed. Works identically for personal (CLASSIC_) inboxes. Company pages are reply-only (reply_only:true on the inbox, from GET /inboxes); they cannot start a new conversation. A malformed inbox_id returns 400 INVALID_REQUEST; a well-formed id for a mailbox this account does not administer returns 403 RESOURCE_ACCESS_RESTRICTED (no existence disclosure); there is no 404 for this endpoint.","x-order":14}},"/v1/{account_id}/feed/home":{"get":{"operationId":"getV1AccountIdFeedHome","tags":["Feed"],"summary":"Get the account's home feed","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account whose home feed to read."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["recent","relevant"],"default":"recent"},"description":"Sort order. `recent` (default) = reverse-chronological, always available. `relevant` = LinkedIn's ranked 'top' feed, which draws on a shared, throttled request budget and can rate-limit. When a `cursor` is supplied the sort is taken from the cursor and this is ignored."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Lower bound on the posts returned in this page (1–100, default 20). The server walks fixed internal pages and returns whole pages up to the next boundary at or beyond this value, so a page may return slightly more; page until `cursor` is null."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response's `cursor`; omit for the first page. Self-describing of its sort: when present, the sort is taken from the cursor. Pass it back verbatim; the `relevant` cursor expires (~1h). Page until `cursor` is null."}],"responses":{"200":{"description":"The connected account's home feed as agent-actionable posts. `sort=recent` (default) resolves each post's activity id + author name + post URL + kind; `sort=relevant` resolves the full shape (text, engagement, author id-triple). An empty feed is a valid 200 (items:[], cursor:null). Page until cursor is null.","content":{"application/json":{"schema":{"type":"object","required":["object","items","cursor"],"properties":{"object":{"type":"string","enum":["feed_post_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","required":["object","activity_urn_id","author","text","post_url","kind","is_promoted","is_reshare","reshared_from","engagement"],"properties":{"object":{"type":"string","enum":["feed_post"],"description":"Item type discriminator."},"activity_urn_id":{"type":"string","description":"The post's numeric activity id (no urn prefix) — the primary durable handle to react/comment/fetch-detail, and the feed dedup key (the feed reorders; there is no disjoint-page guarantee). Both sorts."},"author":{"type":"object","required":["type","name","headline","posted_ago","member_id","numeric_id","vanity","company_id","profile_url"],"description":"The post's author. On `sort=recent` only `name` resolves (`type` is `other`, the rest null).","properties":{"type":{"type":"string","enum":["individual","organization","other"],"description":"Person → individual; company/showcase/sponsored → organization; unresolved (every recent author) → other."},"name":{"type":"string","nullable":true,"description":"Author display name."},"headline":{"type":"string","nullable":true,"description":"Author headline/tagline. null on recent."},"posted_ago":{"type":"string","nullable":true,"description":"Relative time label as rendered (\"6d\", \"1w\") or \"Promoted\" for sponsored posts. Locale-dependent. null on recent."},"member_id":{"type":"string","nullable":true,"description":"Obfuscated member id (ACoAA…) — set for person authors (relevant)."},"numeric_id":{"type":"string","nullable":true,"description":"Numeric member id — the strongest durable cross-action join key. Person authors (relevant)."},"vanity":{"type":"string","nullable":true,"description":"Public identifier slug. Person authors (relevant)."},"company_id":{"type":"string","nullable":true,"description":"Numeric company/organization id — organization authors (relevant), instead of a member id."},"profile_url":{"type":"string","nullable":true,"description":"Canonical profile URL."}}},"text":{"type":"string","nullable":true,"description":"Full post body, verbatim (relevant). null on recent (the body is nested deep in the source). Pass-through — never stored."},"post_url":{"type":"string","nullable":true,"description":"Canonical post URL (recent). null on relevant."},"kind":{"type":"string","nullable":true,"description":"Post type parsed from the URL slug: ugcPost | share | groupPost | activity | post (recent). Open enum. null on relevant."},"is_promoted":{"type":"boolean","description":"true for sponsored/promoted posts (relevant). Defaults false."},"is_reshare":{"type":"boolean","description":"true if this post reshares another (relevant). Defaults false."},"reshared_from":{"type":"object","nullable":true,"required":["name","text"],"description":"When `is_reshare`, the original post's { name, text }; else null.","properties":{"name":{"type":"string","nullable":true,"description":"Original author's display name."},"text":{"type":"string","nullable":true,"description":"Original post body (pass-through; never stored)."}}},"engagement":{"type":"object","required":["likes","comments","shares"],"description":"Engagement counts. All 0 on recent.","properties":{"likes":{"type":"number","description":"Reaction count. Defaults 0."},"comments":{"type":"number","description":"Comment count. Defaults 0."},"shares":{"type":"number","description":"Reshare count. Defaults 0."}}}}},"description":"The feed posts, in feed order (for recent, appearance order == recency). [] for an empty feed (a 200 success). A page may return slightly more than `limit` (whole pages up to the next boundary)."},"cursor":{"type":"string","nullable":true,"description":"Opaque cursor for the next page; null when the walk is exhausted. Self-describing of the sort — pass it back verbatim as `cursor`. The relevant cursor expires (~1h). There is no total (an unbounded, reordering stream) — page until cursor is null."}}},"examples":{"recent":{"summary":"sort=recent (reverse-chronological)","value":{"object":"feed_post_list","items":[{"object":"feed_post","activity_urn_id":"7479840999947730944","author":{"type":"other","name":"Alex Rivera","headline":null,"posted_ago":null,"member_id":null,"numeric_id":null,"vanity":null,"company_id":null,"profile_url":null},"text":null,"post_url":"https://www.linkedin.com/posts/alex_erasmus-ugcPost-7479840998550876160-RbXF","kind":"ugcPost","is_promoted":false,"is_reshare":false,"reshared_from":null,"engagement":{"likes":0,"comments":0,"shares":0}}],"cursor":"eyJjIjoiYyIsInMiOjEwfQ"}},"relevant":{"summary":"sort=relevant (ranked, full shape)","value":{"object":"feed_post_list","items":[{"object":"feed_post","activity_urn_id":"7477368007191875584","author":{"type":"individual","name":"Dana Ellison","headline":"Building agent-native infrastructure","posted_ago":"6d","member_id":"ACoAAExampleMemberId0001","numeric_id":"192666784","vanity":"danaellison","company_id":null,"profile_url":"https://www.linkedin.com/in/danaellison/"},"text":"The most underrated skill in AI engineering is knowing when NOT to add an agent.","post_url":null,"kind":null,"is_promoted":false,"is_reshare":false,"reshared_from":null,"engagement":{"likes":277,"comments":37,"shares":16}},{"object":"feed_post","activity_urn_id":"7475480856153812993","author":{"type":"organization","name":"Example Cloud","headline":"Ship faster","posted_ago":"Promoted","member_id":null,"numeric_id":null,"vanity":null,"company_id":"235326","profile_url":"https://www.linkedin.com/company/235326/"},"text":"Deploy your first agent in under five minutes.","post_url":null,"kind":null,"is_promoted":true,"is_reshare":false,"reshared_from":null,"engagement":{"likes":18,"comments":0,"shares":0}}],"cursor":"eyJjIjoiciIsInMiOjEwLCJ0IjoidG9rMTAifQ"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an unsupported `sort`, an out-of-range `limit`, or a corrupt/expired `cursor`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"The connected LinkedIn account's session is disconnected — reconnect the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The LinkedIn account lacks a feature backing the feed. Not expected — both free and premium accounts read the home feed; documented for completeness.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the account is unknown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited. `sort=relevant` draws on a shared, throttled ranked-feed budget; when it is exhausted this is returned (never a silent empty feed). `sort=recent` is not rate-limited — prefer it when the budget is tight. Retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary upstream error occurred, or the upstream response could not be interpreted. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns the connected account's LinkedIn home feed as agent-actionable posts. `sort=recent` (default) is reverse-chronological and always available; `sort=relevant` is LinkedIn's ranked 'top' feed, which draws on a shared, throttled request budget and can rate-limit. Each post carries the numeric activity id you pass to the Posts group to react, comment, or fetch detail. Page until cursor is null.","x-order":1}},"/v1/{account_id}/notifications":{"get":{"operationId":"getV1AccountIdNotifications","tags":["Notifications"],"summary":"List the account's notifications","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account whose notifications to read or act on."},{"name":"filter","in":"query","required":false,"schema":{"type":"string","enum":["all","jobs","mentions","my_posts","my_posts_comments","my_posts_reactions","my_posts_reposts"],"default":"all"},"description":"Which notification stream to read (default all): all | jobs | mentions | my_posts | my_posts_comments | my_posts_reactions | my_posts_reposts. Any other value is a 400."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Lower bound on the notifications returned in this page (1–100, default 20). The server walks fixed internal pages and returns whole pages up to the next boundary at or beyond this value; page until cursor is null."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response's `cursor`; omit for the first page. Pass it back verbatim. This feed throttles hard under fast polling: poll `unread_count` rather than deep-paging."}],"responses":{"200":{"description":"A page of the account's notification cards, plus the account-level unread badge (unread_count) and newest-notification watermark (latest_published_at). Injected/promo cards are included and flagged (injected:true). Zero notifications is a valid 200 (items:[], cursor:null, unread_count:0). Page until cursor is null.","content":{"application/json":{"schema":{"type":"object","required":["object","items","cursor","unread_count","latest_published_at"],"properties":{"object":{"type":"string","enum":["notification_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","required":["object","card_urn","object_urn","injected","type","text","actor_id","actor_ids","actor_profile_url","activity_urn_id","read","published_at","target_url","can_show_less"],"properties":{"object":{"type":"string","enum":["notification"],"description":"Item type discriminator."},"card_urn":{"type":"string","nullable":true,"description":"The card entity urn — the item's primary identity AND the exact handle passed to DELETE .../{card_urn} and .../{card_urn}/show-less. null on injected cards (not deletable). This — not object_urn — is the write handle."},"object_urn":{"type":"string","nullable":true,"description":"The notification's own object urn — a SECONDARY identifier, NOT the delete handle (feeding it to a write targets the wrong notification). null on injected cards."},"injected":{"type":"boolean","description":"true for an injected promo/suggestion card (card_urn/object_urn/type all null; not deletable). Injected cards are always included — flagged, never filtered."},"type":{"type":"string","nullable":true,"description":"Notification kind (e.g. SHARED_BY_YOUR_NETWORK, COMMENTS_BY_YOUR_NETWORK, REACTIONS_BY_YOUR_NETWORK, PYMK, WVMP_V2, CAREER_INSIGHTS_FREEMIUM, SEARCH_APPEARANCE). Some kinds carry a trailing version digit (WVMP_V2). Open enum — treat unknown values as pass-through. null when the urn encodes no type."},"text":{"type":"string","nullable":true,"description":"Full preview text of the notification. Pass-through — never stored. null on cards with no headline."},"actor_id":{"type":"string","nullable":true,"description":"Primary actor — the profile id of who triggered the notification. null for system/algorithmic cards."},"actor_ids":{"type":"array","items":{"type":"string"},"description":"All distinct actor profile ids in the card ([] for system cards). Superset of actor_id."},"actor_profile_url":{"type":"string","nullable":true,"description":"Deep-link to the primary actor's profile. null when actor_id is null."},"activity_urn_id":{"type":"string","nullable":true,"description":"Numeric activity id of the post to act on (no urn prefix) for post-related cards — feeds a downstream react/comment. null for non-post cards (profile views, career insights)."},"read":{"type":"boolean","nullable":true,"description":"Whether the notification has been read/seen. false = unread. null when the substrate omits it."},"published_at":{"type":"number","nullable":true,"description":"When the notification was published (epoch ms)."},"target_url":{"type":"string","nullable":true,"description":"Where the card links when tapped — a LinkedIn-relative path."},"can_show_less":{"type":"boolean","description":"Whether the card exposes a 'show less like this' affordance."}}},"description":"The notification cards for this page, newest first — injected/promo cards included and flagged. [] for a zero-notification account. A page may return slightly more than `limit` (whole pages up to the next boundary)."},"cursor":{"type":"string","nullable":true,"description":"Opaque cursor for the next page; null on the terminal page. Pass it back verbatim. There is no total (a shifting feed) — page until cursor is null."},"unread_count":{"type":"integer","description":"The unseen-badge count for the account (0 when nothing is unread). Threaded from account metadata — NOT a count of items. Poll this cheaply rather than deep-paging."},"latest_published_at":{"type":"number","nullable":true,"description":"Timestamp (epoch ms) of the newest notification — a poll watermark to detect 'anything new since last poll'. null if unavailable."}}},"examples":{"page":{"summary":"A mixed page (network + injected cards)","value":{"object":"notification_list","items":[{"object":"notification","card_urn":"urn:li:fsd_notificationCard:(SHARED_BY_YOUR_NETWORK,urn:li:uniqueSuffix:(urn:li:none,rwpKFSX4QQKXFV6bDYxCsw))","object_urn":"urn:li:notificationV2:(urn:li:member:747216553,SHARED_BY_YOUR_NETWORK,urn:li:uniqueSuffix:(urn:li:none,rwpKFSX4QQKXFV6bDYxCsw))","injected":false,"type":"SHARED_BY_YOUR_NETWORK","text":"Dana Ellison reposted a post about agent-native infrastructure.","actor_id":"ACoAADg2T7kBExample","actor_ids":["ACoAADg2T7kBExample"],"actor_profile_url":"https://www.linkedin.com/in/ACoAADg2T7kBExample/","activity_urn_id":"7479820624010510336","read":false,"published_at":1783332707063,"target_url":"/feed/?highlightedUpdateUrn=urn%3Ali%3Aactivity%3A7479820624010510336","can_show_less":true},{"object":"notification","card_urn":null,"object_urn":null,"injected":true,"type":null,"text":null,"actor_id":null,"actor_ids":[],"actor_profile_url":null,"activity_urn_id":null,"read":null,"published_at":null,"target_url":"/premium/products/","can_show_less":false}],"cursor":"MTA","unread_count":2,"latest_published_at":1783332707063}},"empty":{"summary":"A zero-notification account (200 empty state)","value":{"object":"notification_list","items":[],"cursor":null,"unread_count":0,"latest_published_at":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an unsupported `filter`, an out-of-range `limit`, or a corrupt `cursor`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"The connected LinkedIn account's session is disconnected — reconnect the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The LinkedIn account lacks a feature backing notifications. Not expected — free accounts read notifications; documented for completeness.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the account is unknown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited. This feed throttles hard under fast polling — poll `unread_count` rather than deep-paging, and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary upstream error occurred, or the upstream response could not be interpreted. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns the connected account's notification cards as a cursor-paginated list, plus the account-level unread badge (unread_count) and a newest-notification watermark (latest_published_at) for cheap polling. Injected/promo cards are included and flagged. Each post-related card carries the numeric activity id you pass to the Posts group. Page until cursor is null.","x-order":1}},"/v1/{account_id}/notifications/{card_urn}":{"delete":{"operationId":"deleteV1AccountIdNotificationsCardUrn","tags":["Notifications"],"summary":"Delete a notification","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account whose notifications to read or act on."},{"name":"card_urn","in":"path","required":true,"schema":{"type":"string"},"description":"The card urn to delete — the `card_urn` field of a GET /v1/{account_id}/notifications item (urn:li:fsd_notificationCard:…). Pass the card urn, NOT object_urn (which targets the wrong notification). Percent-encode it into the path. This cannot be undone."}],"responses":{"200":{"description":"The notification card was deleted. This cannot be undone.\n\n**Safe to retry.** This operation is idempotent: deleting a card that you have already deleted succeeds with 200 — it is not an error, and it does not delete anything else. A client that retries after a network timeout is never punished for it. (A `card_urn` that never existed on this account is a 404 — that distinguishes a wrong handle from a repeat.)\n\n**Timing.** The removal takes effect within a few seconds; a notifications list read immediately after this call may still include the card for a moment. If you need to confirm removal, re-read after a short delay rather than instantly — but the 200 is already your confirmation that the card was resolved and the removal accepted.","content":{"application/json":{"schema":{"type":"object","required":["object","card_urn"],"properties":{"object":{"type":"string","enum":["notification_deleted"],"description":"Response type discriminator."},"card_urn":{"type":"string","description":"The card urn that was deleted."}}},"examples":{"deleted":{"summary":"A deleted card","value":{"object":"notification_deleted","card_urn":"urn:li:fsd_notificationCard:(SHARED_BY_YOUR_NETWORK,urn:li:uniqueSuffix:(urn:li:none,rwpKFSX4QQKXFV6bDYxCsw))"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — `card_urn` is not a notification card urn (pass the item's `card_urn`, not `object_urn`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"The connected LinkedIn account's session is disconnected — reconnect the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant or is unknown, or the `card_urn` does not exist on this account (it belongs to another account, or never existed). Deleting a card that you already deleted is NOT a 404 — it succeeds with 200; see the 200 description.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary upstream error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Deletes one of the connected account's own notification cards by its card urn. This is a self-action — no third party is notified. It cannot be undone. Pass the `card_urn` of a notifications list item (not object_urn).","x-order":2}},"/v1/{account_id}/notifications/{card_urn}/show-less":{"post":{"operationId":"postV1AccountIdNotificationsCardUrnShowLess","tags":["Notifications"],"summary":"Show less like a notification","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account whose notifications to read or act on."},{"name":"card_urn","in":"path","required":true,"schema":{"type":"string"},"description":"The card urn — the `card_urn` field of a GET /v1/{account_id}/notifications item. For network-activity cards (a repost, comment, or reaction by your network) 'show less' removes the card — the same effect as deleting it — because LinkedIn exposes no separate softer signal for these cards. This cannot be undone."}],"responses":{"200":{"description":"The 'show less like this' action was applied — the card is removed, exactly as `delete_notification` removes it. This cannot be undone.\n\n**This is the same operation as delete.** LinkedIn's own web client sends an identical request for both its 'Delete notification' and its 'Show less like this' menu item, on every card type that offers them — there is no separate, softer signal available to send. This endpoint exists so the calling intent reads clearly; it does not behave differently. If you want fewer cards like this one in future, change the account's notification preferences on LinkedIn instead.\n\n**Safe to retry**, and same timing as `delete_notification`: idempotent (a repeat is a 200, not an error), effective within a few seconds.","content":{"application/json":{"schema":{"type":"object","required":["object","card_urn"],"properties":{"object":{"type":"string","enum":["notification_show_less_applied"],"description":"Response type discriminator."},"card_urn":{"type":"string","description":"The card urn the show-less action was applied to."}}},"examples":{"applied":{"summary":"Show-less applied (network card == delete)","value":{"object":"notification_show_less_applied","card_urn":"urn:li:fsd_notificationCard:(REACTIONS_BY_YOUR_NETWORK,urn:li:uniqueSuffix:(urn:li:activity:7479787501973479425,5xIsjBUsQkmzjsyyNj_YZw))"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — `card_urn` is not a notification card urn (pass the item's `card_urn`, not `object_urn`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"The connected LinkedIn account's session is disconnected — reconnect the account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant or is unknown, or the `card_urn` does not exist on this account (it belongs to another account, or never existed). Deleting a card that you already deleted is NOT a 404 — it succeeds with 200; see the 200 description.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary upstream error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Applies 'show less like this' to the source of one of the connected account's own notification cards. For network-activity cards (a repost, comment, or reaction by your network) this removes the card — the same effect as deleting it — because LinkedIn exposes no separate softer signal for these cards. This is a self-action and cannot be undone. No request body.","x-order":3}},"/v1/{account_id}/users/{user_id}/comments":{"get":{"operationId":"getV1AccountIdUsersUserIdComments","tags":["Comments"],"summary":"List a user's comments","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"\"me\" for the caller's own account, or another LinkedIn user's public identifier, member ID, or profile URL."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"description":"Maximum items to return (1–50, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Pagination cursor from a previous response."}],"responses":{"200":{"description":"A page of comments authored by the requested user, plus the next-page cursor. Each item carries parent_post (the post the comment was made on). Comment text is returned verbatim.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["comment_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","description":"A LinkedIn comment or reply (content pass-through — text and attachments are never stored).","properties":{"object":{"type":"string","enum":["comment"],"description":"Response type discriminator."},"id":{"type":"string","description":"Comment identifier (bare numeric string) — use this as the comment_id path param on sub-resource endpoints."},"created_at":{"type":["string","null"],"description":"ISO-8601 UTC datetime the comment was created, or null."},"text":{"type":["string","null"],"description":"Full comment text (content pass-through — never stored)."},"reply_count":{"type":"number","description":"Total reply count on this comment."},"reactions":{"type":"array","description":"Per-reaction-type count buckets.","items":{"type":"object","description":"A per-reaction-type count bucket.","properties":{"type":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type (unified lowercase enum)."},"count":{"type":"number","description":"Count of this reaction type on the comment."}}}},"reaction_count":{"type":"number","description":"Total reaction count on this comment — the sum of reactions[].count."},"author":{"type":"object","description":"Author of the comment.","properties":{"id":{"type":"string","description":"LinkedIn profile identifier."},"object":{"type":"string","description":"Author entity discriminator."},"type":{"type":"string","description":"Author entity type (e.g. individual, organization)."},"display_name":{"type":"string","description":"Author's display name."}}},"can_reply":{"type":"boolean","description":"true if the authenticated account can reply to this comment."},"can_react":{"type":"boolean","description":"true if the authenticated account can react to this comment."},"is_sender":{"type":"boolean","description":"true if the authenticated account authored this comment."},"attachments":{"type":"array","description":"Attachment metadata (inline only).","items":{"type":"object","description":"Attachment metadata on a comment (inline only — no url).","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"Attachment MIME type."},"type":{"type":"string","description":"Attachment type (e.g. img, file)."},"filename":{"type":"string","description":"Original filename, when known."},"file_size":{"type":"number","description":"File size in bytes, when known."}}}},"parent_post":{"type":"object","description":"The post this comment was made on.","properties":{"id":{"type":"string","description":"The post's identifier."},"object":{"type":"string","enum":["post"],"description":"Response type discriminator."}}}}},"description":"Page of comments."},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page."}}},"examples":{"page":{"summary":"First page of comments","value":{"object":"comment_list","items":[{"object":"comment","id":"7480596532522823680","created_at":"2026-07-01T10:00:00.000Z","text":"Great perspective — thanks for sharing this!","reply_count":1,"reactions":[{"type":"celebrate","count":2}],"reaction_count":2,"author":{"id":"ACoAAAEXAMPLE","object":"User","type":"individual","display_name":"Alice Example"},"can_reply":true,"can_react":true,"is_sender":true,"attachments":[],"parent_post":{"id":"urn:li:ugcPost:7123456789012345678","object":"post"}}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1–50) or malformed cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the user was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns comments authored by this account (`user_id=\"me\"`) or another LinkedIn user. Each item embeds the post it was made on. Full comment text is included.","x-order":1}},"/v1/{account_id}/posts/{post_id}/comments":{"post":{"operationId":"postV1AccountIdPostsPostIdComments","tags":["Comments"],"summary":"Comment on a post","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to comment as."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."}],"responses":{"201":{"description":"Comment published successfully. Returns the full created Comment object.","content":{"application/json":{"schema":{"type":"object","description":"A LinkedIn comment or reply (content pass-through — text and attachments are never stored).","properties":{"object":{"type":"string","enum":["comment"],"description":"Response type discriminator."},"id":{"type":"string","description":"Comment identifier (bare numeric string) — use this as the comment_id path param on sub-resource endpoints."},"created_at":{"type":["string","null"],"description":"ISO-8601 UTC datetime the comment was created, or null."},"text":{"type":["string","null"],"description":"Full comment text (content pass-through — never stored)."},"reply_count":{"type":"number","description":"Total reply count on this comment."},"reactions":{"type":"array","description":"Per-reaction-type count buckets.","items":{"type":"object","description":"A per-reaction-type count bucket.","properties":{"type":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type (unified lowercase enum)."},"count":{"type":"number","description":"Count of this reaction type on the comment."}}}},"reaction_count":{"type":"number","description":"Total reaction count on this comment — the sum of reactions[].count."},"author":{"type":"object","description":"Author of the comment.","properties":{"id":{"type":"string","description":"LinkedIn profile identifier."},"object":{"type":"string","description":"Author entity discriminator."},"type":{"type":"string","description":"Author entity type (e.g. individual, organization)."},"display_name":{"type":"string","description":"Author's display name."}}},"can_reply":{"type":"boolean","description":"true if the authenticated account can reply to this comment."},"can_react":{"type":"boolean","description":"true if the authenticated account can react to this comment."},"is_sender":{"type":"boolean","description":"true if the authenticated account authored this comment."},"attachments":{"type":"array","description":"Attachment metadata (inline only).","items":{"type":"object","description":"Attachment metadata on a comment (inline only — no url).","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"Attachment MIME type."},"type":{"type":"string","description":"Attachment type (e.g. img, file)."},"filename":{"type":"string","description":"Original filename, when known."},"file_size":{"type":"number","description":"File size in bytes, when known."}}}}}},"examples":{"comment":{"summary":"A newly created comment","value":{"object":"comment","id":"7480596532522823680","created_at":"2026-07-01T10:00:00.000Z","text":"Great perspective — thanks for sharing this!","reply_count":1,"reactions":[{"type":"celebrate","count":2}],"reaction_count":2,"author":{"id":"ACoAAAEXAMPLE","object":"User","type":"individual","display_name":"Alice Example"},"can_reply":true,"can_react":true,"is_sender":true,"attachments":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing required field, empty text, more than one attachment, or an unrecognized field in the request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the post was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"413":{"description":"Attachment or total request body exceeds the size cap (base64 inflates ~+33%).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"413 error","value":{"code":"PAYLOAD_TOO_LARGE","message":"An uploaded part or the request body exceeds the size limit.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"415":{"description":"Unsupported media type — this endpoint accepts application/json only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"415 error","value":{"code":"UNSUPPORTED_MEDIA_TYPE","message":"The request content type or attachment format is not accepted.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The platform rejected the comment (e.g. content policy). Conservative mapping — outage-indistinguishable errors stay 502.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Publishes a comment on a post. Send application/json; attach one image as a base64 object. Returns the full created Comment object. Comment text passes through to the platform and is never stored.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"Comment body text (1–1250 chars). Inline @mentions live in the text (e.g. \"@ACoAA...\"). Not stored or logged."},"comment_as":{"type":"string","description":"Publish as another user or company page id — the account must administer it."},"attachments":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string","description":"Base64-encoded file bytes."},"content_type":{"type":"string","description":"Attachment MIME type (e.g. image/png)."},"filename":{"type":"string","description":"File name for the attachment."}},"required":["content","content_type","filename"]},"description":"At most one base64 image attachment (LinkedIn's one-image-per-comment limit). Platform rendering of comment attachments is not guaranteed."}},"required":["text"]},"examples":{"minimal":{"summary":"Comment on a post","value":{"text":"Nice post!"}},"withAttachment":{"summary":"Comment with an image attachment","value":{"text":"Check this out","attachments":[{"content":"aGVsbG8=","content_type":"image/png","filename":"a.png"}]}}}}}},"x-order":2},"get":{"operationId":"getV1AccountIdPostsPostIdComments","tags":["Posts"],"summary":"List a post's comments","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"description":"Maximum items to return (1–50, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Pagination cursor from a previous response."},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","enum":["MOST_RECENT","MOST_RELEVANT"]},"description":"Comment sort order (default: MOST_RECENT)."}],"responses":{"200":{"description":"Top-level comments on the post (reply-mode is dropped in v2 — see the Comments group for replies), plus the next-page cursor. Comment text is returned verbatim.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["comment_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","description":"A LinkedIn post comment (content pass-through — text is never stored). Canonical shape defined by the Comments group.","properties":{"object":{"type":"string","enum":["comment"],"description":"Response type discriminator."},"id":{"type":"string","description":"Comment identifier (bare numeric string)."},"created_at":{"type":["string","null"],"description":"ISO-8601 UTC datetime the comment was created, or null."},"text":{"type":["string","null"],"description":"Full comment text (content pass-through — never stored)."},"reply_count":{"type":"number","description":"Total reply count on this comment."},"reactions":{"type":"array","description":"Per-reaction-type count buckets.","items":{"type":"object","description":"A per-reaction-type count bucket.","properties":{"type":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type (unified lowercase enum)."},"count":{"type":"number","description":"Count of this reaction type on the comment."}}}},"reaction_count":{"type":"number","description":"Total reaction count on this comment — the sum of reactions[].count."},"author":{"type":"object","description":"Author of the comment.","properties":{"id":{"type":"string","description":"LinkedIn profile identifier."},"object":{"type":"string","description":"Author entity discriminator."},"type":{"type":"string","description":"Author entity type (e.g. individual, organization)."},"display_name":{"type":"string","description":"Author's display name."}}},"can_reply":{"type":"boolean","description":"true if the authenticated account can reply to this comment."},"can_react":{"type":"boolean","description":"true if the authenticated account can react to this comment."},"is_sender":{"type":"boolean","description":"true if the authenticated account authored this comment."},"attachments":{"type":"array","description":"Attachment metadata (inline only).","items":{"type":"object","description":"Attachment metadata on a comment (inline only — no url).","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"Attachment MIME type."},"type":{"type":"string","description":"Attachment type (e.g. img, file)."},"filename":{"type":"string","description":"Original filename, when known."},"file_size":{"type":"number","description":"File size in bytes, when known."}}}}}},"description":"Page of top-level comments."},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page. cursor:null does not confirm completeness when limit is small — the underlying pagination is offset-based."}}},"examples":{"page":{"summary":"First page of comments","value":{"object":"comment_list","items":[{"object":"comment","id":"7480596532522823680","created_at":"2026-06-10T10:00:00.000Z","text":"Great perspective — thanks for sharing this!","reply_count":0,"reactions":[{"type":"celebrate","count":2}],"reaction_count":2,"author":{"id":"ACoAAAEXAMPLE","object":"User","type":"individual","display_name":"Alice Example"},"can_reply":true,"can_react":true,"is_sender":false,"attachments":[]}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1–50), malformed cursor, invalid sort_by, or an unknown query param (comment_id is removed in v2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the post was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns top-level comments on a post (v2 drops the reply-fetch mode — use the Comments group's dedicated replies endpoint). Full comment text is included.","x-order":4}},"/v1/{account_id}/posts/{post_id}/comments/{comment_id}":{"patch":{"operationId":"patchV1AccountIdPostsPostIdCommentsCommentId","tags":["Comments"],"summary":"Update a comment","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that authored the comment."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string"},"description":"The comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies."}],"responses":{"200":{"description":"Comment updated successfully. Returns the full updated Comment object.","content":{"application/json":{"schema":{"type":"object","description":"A LinkedIn comment or reply (content pass-through — text and attachments are never stored).","properties":{"object":{"type":"string","enum":["comment"],"description":"Response type discriminator."},"id":{"type":"string","description":"Comment identifier (bare numeric string) — use this as the comment_id path param on sub-resource endpoints."},"created_at":{"type":["string","null"],"description":"ISO-8601 UTC datetime the comment was created, or null."},"text":{"type":["string","null"],"description":"Full comment text (content pass-through — never stored)."},"reply_count":{"type":"number","description":"Total reply count on this comment."},"reactions":{"type":"array","description":"Per-reaction-type count buckets.","items":{"type":"object","description":"A per-reaction-type count bucket.","properties":{"type":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type (unified lowercase enum)."},"count":{"type":"number","description":"Count of this reaction type on the comment."}}}},"reaction_count":{"type":"number","description":"Total reaction count on this comment — the sum of reactions[].count."},"author":{"type":"object","description":"Author of the comment.","properties":{"id":{"type":"string","description":"LinkedIn profile identifier."},"object":{"type":"string","description":"Author entity discriminator."},"type":{"type":"string","description":"Author entity type (e.g. individual, organization)."},"display_name":{"type":"string","description":"Author's display name."}}},"can_reply":{"type":"boolean","description":"true if the authenticated account can reply to this comment."},"can_react":{"type":"boolean","description":"true if the authenticated account can react to this comment."},"is_sender":{"type":"boolean","description":"true if the authenticated account authored this comment."},"attachments":{"type":"array","description":"Attachment metadata (inline only).","items":{"type":"object","description":"Attachment metadata on a comment (inline only — no url).","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"Attachment MIME type."},"type":{"type":"string","description":"Attachment type (e.g. img, file)."},"filename":{"type":"string","description":"Original filename, when known."},"file_size":{"type":"number","description":"File size in bytes, when known."}}}}}},"examples":{"comment":{"summary":"The updated comment","value":{"object":"comment","id":"7480596532522823680","created_at":"2026-07-01T10:00:00.000Z","text":"Edited text.","reply_count":1,"reactions":[{"type":"celebrate","count":2}],"reaction_count":2,"author":{"id":"ACoAAAEXAMPLE","object":"User","type":"individual","display_name":"Alice Example"},"can_reply":true,"can_react":true,"is_sender":true,"attachments":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing required field or empty text.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"This account is not the comment's author.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the comment was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Edits the text of a comment. Own comments only — returns the full updated Comment object.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"Updated comment body text (1–1250 chars). Inline @mentions live in the text."}},"required":["text"]},"examples":{"minimal":{"summary":"Edit a comment","value":{"text":"Edited text."}}}}}},"x-order":3},"delete":{"operationId":"deleteV1AccountIdPostsPostIdCommentsCommentId","tags":["Comments"],"summary":"Delete a comment","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that authored the comment."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string"},"description":"The comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies."}],"responses":{"204":{"description":"The comment was deleted. No response body.","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or invalid path parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"This account is not the comment's author.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the comment was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Deletes a comment owned by this account. Own comments only — no response body.","x-order":4},"post":{"operationId":"postV1AccountIdPostsPostIdCommentsCommentId","tags":["Comments"],"summary":"Reply to a comment","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to reply as."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string"},"description":"The parent comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies."}],"responses":{"201":{"description":"Reply published successfully. Returns the full created Comment (reply) object. Same path as update_comment — POST creates a reply, PATCH edits the target comment.","content":{"application/json":{"schema":{"type":"object","description":"A LinkedIn comment or reply (content pass-through — text and attachments are never stored).","properties":{"object":{"type":"string","enum":["comment"],"description":"Response type discriminator."},"id":{"type":"string","description":"Comment identifier (bare numeric string) — use this as the comment_id path param on sub-resource endpoints."},"created_at":{"type":["string","null"],"description":"ISO-8601 UTC datetime the comment was created, or null."},"text":{"type":["string","null"],"description":"Full comment text (content pass-through — never stored)."},"reply_count":{"type":"number","description":"Total reply count on this comment."},"reactions":{"type":"array","description":"Per-reaction-type count buckets.","items":{"type":"object","description":"A per-reaction-type count bucket.","properties":{"type":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type (unified lowercase enum)."},"count":{"type":"number","description":"Count of this reaction type on the comment."}}}},"reaction_count":{"type":"number","description":"Total reaction count on this comment — the sum of reactions[].count."},"author":{"type":"object","description":"Author of the comment.","properties":{"id":{"type":"string","description":"LinkedIn profile identifier."},"object":{"type":"string","description":"Author entity discriminator."},"type":{"type":"string","description":"Author entity type (e.g. individual, organization)."},"display_name":{"type":"string","description":"Author's display name."}}},"can_reply":{"type":"boolean","description":"true if the authenticated account can reply to this comment."},"can_react":{"type":"boolean","description":"true if the authenticated account can react to this comment."},"is_sender":{"type":"boolean","description":"true if the authenticated account authored this comment."},"attachments":{"type":"array","description":"Attachment metadata (inline only).","items":{"type":"object","description":"Attachment metadata on a comment (inline only — no url).","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"Attachment MIME type."},"type":{"type":"string","description":"Attachment type (e.g. img, file)."},"filename":{"type":"string","description":"Original filename, when known."},"file_size":{"type":"number","description":"File size in bytes, when known."}}}}}},"examples":{"reply":{"summary":"A newly created reply","value":{"object":"comment","id":"7480596532522823681","created_at":"2026-07-01T10:05:00.000Z","text":"Totally agree!","reply_count":0,"reactions":[],"reaction_count":0,"author":{"id":"ACoAABEXAMPLE","object":"User","type":"individual","display_name":"Bob Example"},"can_reply":true,"can_react":true,"is_sender":false,"attachments":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing required field, empty text, more than one attachment, or an unrecognized field in the request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the comment was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"413":{"description":"Attachment or total request body exceeds the size cap (base64 inflates ~+33%).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"413 error","value":{"code":"PAYLOAD_TOO_LARGE","message":"An uploaded part or the request body exceeds the size limit.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"415":{"description":"Unsupported media type — this endpoint accepts application/json only.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"415 error","value":{"code":"UNSUPPORTED_MEDIA_TYPE","message":"The request content type or attachment format is not accepted.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The platform rejected the reply (e.g. content policy). Conservative mapping — outage-indistinguishable errors stay 502.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Creates a reply under a top-level comment. Same path as update_comment — POST creates a new reply, PATCH edits the target comment itself. Returns the full created Comment (reply) object.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"Comment body text (1–1250 chars). Inline @mentions live in the text (e.g. \"@ACoAA...\"). Not stored or logged."},"comment_as":{"type":"string","description":"Publish as another user or company page id — the account must administer it."},"attachments":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string","description":"Base64-encoded file bytes."},"content_type":{"type":"string","description":"Attachment MIME type (e.g. image/png)."},"filename":{"type":"string","description":"File name for the attachment."}},"required":["content","content_type","filename"]},"description":"At most one base64 image attachment (LinkedIn's one-image-per-comment limit). Platform rendering of comment attachments is not guaranteed."}},"required":["text"]},"examples":{"minimal":{"summary":"Reply to a comment","value":{"text":"Agreed!"}}}}}},"x-order":6}},"/v1/{account_id}/posts/{post_id}/comments/{comment_id}/replies":{"get":{"operationId":"getV1AccountIdPostsPostIdCommentsCommentIdReplies","tags":["Comments"],"summary":"List replies to a comment","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string"},"description":"The parent comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"description":"Maximum items to return (1–50, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Pagination cursor from a previous response."}],"responses":{"200":{"description":"Replies to the comment, plus the next-page cursor. Reply text is returned verbatim.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["reply_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","description":"A LinkedIn comment or reply (content pass-through — text and attachments are never stored).","properties":{"object":{"type":"string","enum":["comment"],"description":"Response type discriminator."},"id":{"type":"string","description":"Comment identifier (bare numeric string) — use this as the comment_id path param on sub-resource endpoints."},"created_at":{"type":["string","null"],"description":"ISO-8601 UTC datetime the comment was created, or null."},"text":{"type":["string","null"],"description":"Full comment text (content pass-through — never stored)."},"reply_count":{"type":"number","description":"Total reply count on this comment."},"reactions":{"type":"array","description":"Per-reaction-type count buckets.","items":{"type":"object","description":"A per-reaction-type count bucket.","properties":{"type":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type (unified lowercase enum)."},"count":{"type":"number","description":"Count of this reaction type on the comment."}}}},"reaction_count":{"type":"number","description":"Total reaction count on this comment — the sum of reactions[].count."},"author":{"type":"object","description":"Author of the comment.","properties":{"id":{"type":"string","description":"LinkedIn profile identifier."},"object":{"type":"string","description":"Author entity discriminator."},"type":{"type":"string","description":"Author entity type (e.g. individual, organization)."},"display_name":{"type":"string","description":"Author's display name."}}},"can_reply":{"type":"boolean","description":"true if the authenticated account can reply to this comment."},"can_react":{"type":"boolean","description":"true if the authenticated account can react to this comment."},"is_sender":{"type":"boolean","description":"true if the authenticated account authored this comment."},"attachments":{"type":"array","description":"Attachment metadata (inline only).","items":{"type":"object","description":"Attachment metadata on a comment (inline only — no url).","properties":{"id":{"type":"string","description":"Attachment identifier."},"mimetype":{"type":"string","description":"Attachment MIME type."},"type":{"type":"string","description":"Attachment type (e.g. img, file)."},"filename":{"type":"string","description":"Original filename, when known."},"file_size":{"type":"number","description":"File size in bytes, when known."}}}}}},"description":"Page of replies."},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page."},"total_count":{"type":"number","description":"Total reply count, when the platform reports it."}}},"examples":{"page":{"summary":"First page of replies","value":{"object":"reply_list","items":[{"object":"comment","id":"7480596532522823681","created_at":"2026-07-01T10:05:00.000Z","text":"Totally agree!","reply_count":0,"reactions":[],"reaction_count":0,"author":{"id":"ACoAABEXAMPLE","object":"User","type":"individual","display_name":"Bob Example"},"can_reply":true,"can_react":true,"is_sender":false,"attachments":[]}],"cursor":null,"total_count":1}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1–50) or malformed cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the comment was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns replies to a top-level comment, most-recent-first. Full reply text is included.","x-order":5}},"/v1/{account_id}/posts/{post_id}/comments/{comment_id}/reactions":{"get":{"operationId":"getV1AccountIdPostsPostIdCommentsCommentIdReactions","tags":["Comments"],"summary":"List a comment's reactions","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string"},"description":"The comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"description":"Maximum items to return (1–50, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Pagination cursor from a previous response."}],"responses":{"200":{"description":"Reactions on the comment, plus the next-page cursor. Each item's value is the unified lowercase enum.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["reaction_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","description":"A reaction on a comment.","properties":{"object":{"type":"string","enum":["reaction"],"description":"Response type discriminator."},"value":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type (unified lowercase enum)."},"is_sender":{"type":"boolean","description":"true if the authenticated account made this reaction."},"sender":{"type":"object","description":"The member who made this reaction.","properties":{"id":{"type":"string","description":"LinkedIn profile identifier."},"object":{"type":"string","description":"Author entity discriminator."},"type":{"type":"string","description":"Author entity type (e.g. individual, organization)."},"display_name":{"type":"string","description":"Author's display name."}}}}},"description":"Page of reactions."},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page."}}},"examples":{"page":{"summary":"First page of reactions","value":{"object":"reaction_list","items":[{"object":"reaction","value":"celebrate","is_sender":false,"sender":{"id":"ACoAABEXAMPLE","object":"User","type":"individual","display_name":"Bob Example"}}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1–50) or malformed cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the comment was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns reactions on a comment. Each item's value is the unified lowercase enum (used for both reads and writes).","x-order":7},"post":{"operationId":"postV1AccountIdPostsPostIdCommentsCommentIdReactions","tags":["Comments"],"summary":"React to a comment","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to react from."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string"},"description":"The comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies."}],"responses":{"200":{"description":"Reaction applied successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["comment_reaction_added"],"description":"Response type discriminator."},"comment_id":{"type":"string","description":"The comment's identifier."},"reaction":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"The reaction value that was applied, echoing what the caller sent."}}},"examples":{"added":{"summary":"Reaction applied","value":{"object":"comment_reaction_added","comment_id":"7480596532522823680","reaction":"celebrate"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing/invalid reaction value, or an unrecognized field in the request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the comment was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The platform rejected the reaction. Conservative mapping — outage-indistinguishable errors stay 502.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Reacts to a comment. The reaction value uses the unified lowercase enum (the same enum reads use).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reaction":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type (unified lowercase enum): like | celebrate | support | love | insightful | funny."},"react_as":{"type":"string","description":"Company page to react as — the account must administer it."}},"required":["reaction"]},"examples":{"minimal":{"summary":"React to a comment","value":{"reaction":"celebrate"}}}}}},"x-order":8},"delete":{"operationId":"deleteV1AccountIdPostsPostIdCommentsCommentIdReactions","tags":["Comments"],"summary":"Remove a reaction from a comment","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose reaction to remove."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string"},"description":"The comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies."}],"responses":{"200":{"description":"Reaction removed successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["comment_reaction_removed"],"description":"Response type discriminator."},"comment_id":{"type":"string","description":"The comment's identifier."},"reaction":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"The reaction value that was removed."}}},"examples":{"removed":{"summary":"Reaction removed","value":{"object":"comment_reaction_removed","comment_id":"7480596532522823680","reaction":"celebrate"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing/invalid reaction value, or an unrecognized field in the request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the comment was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"No reaction of this value exists to remove.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Removes this account's reaction from a comment.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reaction":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"The reaction value to remove (unified lowercase enum)."}},"required":["reaction"]},"examples":{"minimal":{"summary":"Remove a reaction from a comment","value":{"reaction":"celebrate"}}}}}},"x-order":9}},"/v1/{account_id}/invites":{"post":{"operationId":"postV1AccountIdInvites","tags":["Invites"],"summary":"Send a connect-request","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to act on behalf of."}],"responses":{"201":{"description":"Connect-request sent successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["invitation_sent"],"description":"Response type discriminator."},"id":{"type":"string","description":"Direction-prefixed connect-request id (SENT_…)."},"status":{"type":"string","enum":["sent"],"description":"Outcome status."},"created_at":{"type":"string","description":"ISO-8601 UTC timestamp when the connect-request was created. Optional — omitted when the platform does not return it."},"message":{"type":"string","description":"Echoed note, when the platform returns it."},"user":{"type":"object","description":"The recipient's member object (sent-variant — sparser than received).","properties":{"id":{"type":"string","description":"Native LinkedIn member URN."},"type":{"type":"string","enum":["individual","organization","other"],"description":"Member type."},"display_name":{"type":"string","description":"Display name."},"first_name":{"type":"string","description":"First name."},"last_name":{"type":"string","description":"Last name."},"public_picture_url":{"type":"string","description":"Public profile picture URL."}},"required":["id"]}},"required":["object","id","status"]},"examples":{"sent":{"summary":"Connect-request sent","value":{"object":"invitation_sent","id":"SENT_74670000000001","status":"sent"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — missing or malformed parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Account not found or not owned by this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"409":{"description":"A connect-request to this member already exists, or you are already connected (CONNECTION_REQUEST_CONFLICT). Do not re-send.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"conflict":{"summary":"Duplicate or already-connected connect-request","value":{"code":"CONNECTION_REQUEST_CONFLICT","message":"A connect-request to this member already exists, or you are already connected.","user_fixable":true,"retry_likely_to_succeed":false,"retry_hint":{"kind":"never"}}}}}}},"422":{"description":"Account restricted from performing this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Quota exceeded — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred while processing the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Sends a connect-request to a member by public identifier or URN. Supports an optional note. The note is passed to the platform and immediately discarded — never stored.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"recipient_identifier":{"type":"string","description":"LinkedIn public identifier (vanity slug) or member URN of the recipient."},"message":{"type":"string","description":"Optional connect-request note (up to 300 characters). Passed to the platform and immediately discarded, never stored."}},"required":["recipient_identifier"]},"examples":{"send":{"summary":"Send a connect-request","value":{"recipient_identifier":"raphael-redmer","message":"Hi, I'd like to connect with you!"}},"sendWithoutNote":{"summary":"Send a connect-request with no note","value":{"recipient_identifier":"urn:li:member:123456789"}}}}}},"x-order":1}},"/v1/{account_id}/invites/sent":{"get":{"operationId":"getV1AccountIdInvitesSent","tags":["Invites"],"summary":"List sent connect-requests","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to list sent connect-requests for."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from the previous response. Omit for the first page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Number of connect-requests to return per page (1–100, default 20)."}],"responses":{"200":{"description":"Paginated list of sent connect-requests.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["invitation_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"Sent connect-request items.","items":{"type":"object","description":"Sent connect-request item.","properties":{"object":{"type":"string","enum":["invitation_sent"],"description":"Response type discriminator."},"id":{"type":"string","description":"Direction-prefixed connect-request id (SENT_…)."},"created_at":{"type":"string","description":"ISO-8601 UTC datetime the connect-request was created. Optional — omitted when the platform does not return it."},"message":{"type":"string","description":"The connect-request note, when one was sent. Content pass-through — never stored."},"user":{"type":"object","description":"The recipient's member object (sent-variant — sparser than received).","properties":{"id":{"type":"string","description":"Native LinkedIn member URN."},"type":{"type":"string","enum":["individual","organization","other"],"description":"Member type."},"display_name":{"type":"string","description":"Display name."},"first_name":{"type":"string","description":"First name."},"last_name":{"type":"string","description":"Last name."},"public_picture_url":{"type":"string","description":"Public profile picture URL."}},"required":["id"]}},"required":["object","id","user"]}},"cursor":{"type":["string","null"],"description":"Opaque pagination cursor for the next page, or null if at the end."}}},"examples":{"page":{"summary":"First page of sent connect-requests","value":{"object":"invitation_list","items":[{"object":"invitation_sent","id":"SENT_74670000000001","created_at":"2026-06-10T12:00:00.000Z","message":"Hi, I'd like to connect with you!","user":{"id":"ACoAAC00000000000000000000000000000099","type":"individual","display_name":"Alice Example","first_name":"Alice","last_name":"Example"}}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — missing or malformed parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Account not found or not owned by this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Account restricted from performing this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Quota exceeded — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred while processing the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns paginated sent connect-requests.","x-order":2}},"/v1/{account_id}/invites/received":{"get":{"operationId":"getV1AccountIdInvitesReceived","tags":["Invites"],"summary":"List received connect-requests","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to list received connect-requests for."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from the previous response. Omit for the first page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Number of connect-requests to return per page (1–100, default 20)."}],"responses":{"200":{"description":"Paginated list of received connect-requests.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["invitation_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"Received connect-request items.","items":{"type":"object","description":"Received connect-request item — no top-level message.","properties":{"object":{"type":"string","enum":["invitation_received"],"description":"Response type discriminator."},"id":{"type":"string","description":"Direction-prefixed connect-request id (RECEIVED_…)."},"created_at":{"type":"string","description":"ISO-8601 UTC datetime the connect-request was created. Optional — omitted when the platform does not return it."},"user":{"type":"object","description":"The sender's member object (received-variant — richer than sent).","properties":{"id":{"type":"string","description":"Native LinkedIn member URN."},"type":{"type":"string","enum":["individual","organization","other"],"description":"Member type."},"display_name":{"type":"string","description":"Display name."},"first_name":{"type":"string","description":"First name."},"last_name":{"type":"string","description":"Last name."},"public_picture_url":{"type":"string","description":"Public profile picture URL."},"public_identifier":{"type":"string","description":"LinkedIn public identifier (vanity URL slug)."},"profile_url":{"type":"string","description":"Public profile URL."},"description":{"type":"string","description":"Headline or description."}},"required":["id"]}},"required":["object","id","user"]}},"cursor":{"type":["string","null"],"description":"Opaque pagination cursor for the next page, or null if at the end."}}},"examples":{"page":{"summary":"First page of received connect-requests","value":{"object":"invitation_list","items":[{"object":"invitation_received","id":"RECEIVED_000000000000000000000001","created_at":"2026-06-09T10:00:00.000Z","user":{"id":"ACoAAD00000000000000000000000000000098","type":"individual","display_name":"Bob Builder","public_identifier":"bob-builder","profile_url":"https://www.linkedin.com/in/bob-builder","description":"Engineering Manager","first_name":"Bob","last_name":"Builder"}}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — missing or malformed parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Account not found or not owned by this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Account restricted from performing this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Quota exceeded — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred while processing the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns paginated received connect-requests.","x-order":3}},"/v1/{account_id}/invites/received/{invitation_id}/accept":{"post":{"operationId":"postV1AccountIdInvitesReceivedInvitationIdAccept","tags":["Invites"],"summary":"Accept a received connect-request","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to act on behalf of."},{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string"},"description":"The received connect-request's id (from GET .../invites/received items[].id)."}],"responses":{"200":{"description":"Connect-request accepted, or already absent (not_found).","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["invitation_accepted"],"description":"Response type discriminator."},"invitation_id":{"type":"string","description":"The accepted connect-request's id."},"status":{"type":"string","enum":["accepted","not_found"],"description":"Outcome status. not_found means the connect-request was already absent — not an error."}}},"examples":{"accepted":{"summary":"Connect-request accepted","value":{"object":"invitation_accepted","invitation_id":"RECEIVED_000000000000000000000001","status":"accepted"}},"notFound":{"summary":"Connect-request not found (idempotent absence)","value":{"object":"invitation_accepted","invitation_id":"RECEIVED_unknown","status":"not_found"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — missing or malformed parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Account not found or not owned by this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Quota exceeded — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred while processing the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Accepts a received connect-request. An unrecognized or non-pending invitation_id returns status:not_found rather than an error. No request body.","x-order":4}},"/v1/{account_id}/invites/received/{invitation_id}/decline":{"post":{"operationId":"postV1AccountIdInvitesReceivedInvitationIdDecline","tags":["Invites"],"summary":"Decline a received connect-request","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to act on behalf of."},{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string"},"description":"The received connect-request's id (from GET .../invites/received items[].id)."}],"responses":{"200":{"description":"Connect-request declined, or already absent (not_found).","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["invitation_declined"],"description":"Response type discriminator."},"invitation_id":{"type":"string","description":"The declined connect-request's id."},"status":{"type":"string","enum":["declined","not_found"],"description":"Outcome status. not_found means the connect-request was already absent — not an error."}}},"examples":{"declined":{"summary":"Connect-request declined","value":{"object":"invitation_declined","invitation_id":"RECEIVED_000000000000000000000001","status":"declined"}},"notFound":{"summary":"Connect-request not found (idempotent absence)","value":{"object":"invitation_declined","invitation_id":"RECEIVED_unknown","status":"not_found"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — missing or malformed parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Account not found or not owned by this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Quota exceeded — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred while processing the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Declines a received connect-request. An unrecognized or non-pending invitation_id returns status:not_found rather than an error. No request body.","x-order":5}},"/v1/{account_id}/invites/sent/{invitation_id}":{"delete":{"operationId":"deleteV1AccountIdInvitesSentInvitationId","tags":["Invites"],"summary":"Withdraw a sent connect-request","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to act on behalf of."},{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string"},"description":"The sent connect-request's id to withdraw."}],"responses":{"200":{"description":"Connect-request withdrawn, or already absent (not_found).","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["invitation_withdrawn"],"description":"Response type discriminator."},"invitation_id":{"type":"string","description":"The withdrawn connect-request's id."},"status":{"type":"string","enum":["withdrawn","not_found"],"description":"Outcome status. not_found means the connect-request was already absent — not an error."}}},"examples":{"withdrawn":{"summary":"Connect-request withdrawn","value":{"object":"invitation_withdrawn","invitation_id":"SENT_74670000000001","status":"withdrawn"}},"notFound":{"summary":"Connect-request not found (idempotent absence)","value":{"object":"invitation_withdrawn","invitation_id":"SENT_unknown","status":"not_found"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — missing or malformed parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Account not found or not owned by this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Quota exceeded — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred while processing the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Withdraws a previously sent connect-request by id. An already-absent or unrecognized invitation_id returns status:not_found rather than an error.","x-order":6}},"/v1/{account_id}/jobs":{"get":{"operationId":"getV1AccountIdJobs","tags":["Jobs"],"summary":"List job postings","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account whose job postings to list."},{"name":"state","in":"query","required":true,"schema":{"type":"string","enum":["DRAFT","OPEN","CLOSED","REVIEW","SUSPENDED"]},"description":"Filter by posting lifecycle state (request vocabulary). Required. Filtering is applied by LinkedIn and is best-effort: OPEN commonly returns the same postings as DRAFT, and no query is guaranteed to return an item whose own `state` is LISTED even though LISTED is a valid value of that field. Callers needing a strict filter should re-filter on each returned item's own `state`."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Number of results to return (1–100)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response."}],"responses":{"200":{"description":"The connected account's own classic job postings matching the filter. Content fields (title) are returned verbatim and are never stored.","content":{"application/json":{"schema":{"type":"object","required":["object","items","cursor"],"properties":{"object":{"type":"string","enum":["job_posting_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","required":["object","id","title","company","state","applications_count"],"properties":{"object":{"type":"string","enum":["job_posting"],"description":"Response type discriminator."},"id":{"type":"string","description":"The job posting's numeric identifier."},"title":{"type":"string","description":"Job title (content pass-through — never stored)."},"company":{"type":"string","description":"Hiring company's display name."},"state":{"type":"string","enum":["DRAFT","LISTED","CLOSED","REVIEW","SUSPENDED"],"description":"Posting lifecycle state."},"applications_count":{"type":"number","description":"Number of applicants so far."},"location":{"type":"string","description":"Job location, when set."}}},"description":"The connected account's own classic job postings matching the filter."},"cursor":{"type":"string","nullable":true,"description":"Opaque pagination cursor for the next page; null when no next page. A string only when a full page was returned — pass it back verbatim to page forward."}}},"examples":{"jobPostingList":{"summary":"A page of the connected account's DRAFT postings","value":{"object":"job_posting_list","items":[{"object":"job_posting","id":"6600000001","title":"Growth Marketing Manager","company":"Brightlane Labs","state":"DRAFT","applications_count":10,"location":"Berlin, Germany"}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing, empty, or invalid state; or limit greater than 100.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Lists the connected account's own classic LinkedIn job postings. Filtering by `state` is applied by LinkedIn and is best-effort — see the state parameter's own description for the request/response vocabulary mismatch.","x-order":0},"post":{"operationId":"postV1AccountIdJobs","tags":["Jobs"],"summary":"Create job posting draft","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account to create the job posting on behalf of."}],"responses":{"201":{"description":"The created job posting, in DRAFT state. Content fields (title, description) are returned verbatim and are never stored. This op never publishes and never spends money.","content":{"application/json":{"schema":{"type":"object","required":["object","id","title","company","state","is_repost","is_application_limit_reached","created_at","description","applications_count","workplace_type","employment_status"],"properties":{"object":{"type":"string","enum":["job_posting"],"description":"Response type discriminator."},"id":{"type":"string","description":"The job posting's numeric identifier."},"title":{"type":"string","description":"Job title (content pass-through — never stored)."},"company":{"type":"object","description":"The hiring company.","properties":{"id":{"type":"string","description":"The hiring company's numeric identifier."},"name":{"type":"string","description":"The hiring company's display name."},"public_picture_url":{"type":"string","description":"The company's public logo URL, when set."},"profile_url":{"type":"string","description":"The company's public LinkedIn profile URL, when set."},"public_identifier":{"type":"string","description":"The company's vanity slug, when set."}}},"location":{"type":"string","description":"Job location, when set."},"state":{"type":"string","enum":["DRAFT","LISTED","CLOSED","REVIEW","SUSPENDED"],"description":"Posting lifecycle state."},"is_repost":{"type":"boolean","description":"Whether this posting is a repost of a prior one."},"is_application_limit_reached":{"type":"boolean","description":"Whether this posting has reached its application limit."},"industries":{"type":"array","items":{"type":"string"},"description":"Industries associated with this posting, when set."},"created_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was created."},"description":{"type":"string","description":"Full job description text (content pass-through — never stored)."},"views_count":{"type":"number","description":"Number of views so far, when tracked."},"applications_count":{"type":"number","description":"Number of applicants so far."},"screening_questions":{"type":"array","items":{},"description":"Screening questions attached to this posting, when any are set."},"workplace_type":{"type":"string","enum":["ON_SITE","HYBRID","REMOTE"],"description":"Workplace arrangement."},"employment_status":{"type":"string","enum":["FULL_TIME","PART_TIME","CONTRACT","TEMPORARY","OTHER","VOLUNTEER","INTERNSHIP"],"description":"Employment type."},"budget":{"type":"object","description":"Promotion budget, when this posting has one set.","properties":{"total":{"type":"object","properties":{"amount":{"type":"number","description":"Total budget amount."},"currency":{"type":"string","description":"ISO-4217 currency code."}}},"daily":{"type":"object","properties":{"amount":{"type":"number","description":"Daily budget amount."},"currency":{"type":"string","description":"ISO-4217 currency code."}}}}},"published_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was published, when set."},"expires_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting expires, when set."},"closed_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was closed, when set."},"listed_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was listed, when set."},"hiring_team":{"type":"array","items":{},"description":"Hiring team members associated with this posting, when the posting exposes any."}}},"examples":{"jobPosting":{"summary":"A newly created DRAFT job posting","value":{"object":"job_posting","id":"7700000001","title":"Growth Marketing Manager","company":{"id":"10000001","name":"Brightlane Labs"},"location":"105646813","state":"DRAFT","is_repost":false,"is_application_limit_reached":false,"created_at":"2026-07-07T00:00:00.000Z","description":"We are hiring a Growth Marketing Manager to work directly with the founding team on our most important growth initiatives. In this role you will own analytics, coordinate partner outreach, and help run early go-to-market experiments across the business. This is a hands-on generalist role for someone who wants broad exposure to how an early-stage company operates.","applications_count":0,"workplace_type":"ON_SITE","employment_status":"FULL_TIME"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"The request body failed validation (e.g. description under 200 characters).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot create a job posting.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Creates a classic LinkedIn job posting as a DRAFT on the connected account. This op never publishes and never spends money — the draft is safe to create and leave unpublished. Publishing is a separate, explicit operation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"job_title":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"description":"The job title, reference an existing LinkedIn job title by id, or supply a free-text name."},"company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"description":"The hiring company, reference an existing company by id, or supply a free-text name."},"workplace_type":{"type":"string","enum":["ON_SITE","HYBRID","REMOTE"],"description":"Workplace arrangement."},"location":{"type":"string","description":"A LOCATION parameter id from GET /v1/{account_id}/search/parameters."},"employment_status":{"type":"string","enum":["FULL_TIME","PART_TIME","CONTRACT","TEMPORARY","OTHER","VOLUNTEER","INTERNSHIP"],"description":"Employment type."},"description":{"type":"string","description":"Full job description (minimum 200 characters). Content passes through verbatim, never stored."},"apply_method":{"oneOf":[{"type":"object","properties":{"method":{"type":"string","const":"linkedin"},"notification_email":{"type":"string","description":"Email address notified of new applicants."}},"required":["method","notification_email"],"title":"Linkedin"},{"type":"object","properties":{"method":{"type":"string","const":"external"},"website_url":{"type":"string","description":"External URL candidates apply through."}},"required":["method","website_url"],"title":"External"}],"discriminator":{"propertyName":"method","mapping":{"linkedin":"#/oneOf/0","external":"#/oneOf/1"}},"description":"How candidates apply, through LinkedIn (with a notification email) or an external site."},"skills":{"type":"array","items":{"type":"string"},"description":"Optional skill parameter ids from GET /v1/{account_id}/search/parameters."},"screening_questions":{"type":"array","items":{},"description":"Optional screening questions attached to the posting."},"rejection_settings":{"description":"Optional automatic-rejection configuration."}},"required":["job_title","company","workplace_type","location","employment_status","description","apply_method"]},"examples":{"jobPosting":{"summary":"A complete draft job posting","value":{"job_title":{"name":"Growth Marketing Manager"},"company":{"name":"Brightlane Labs"},"workplace_type":"ON_SITE","location":"105646813","employment_status":"FULL_TIME","description":"We are hiring a Growth Marketing Manager to work directly with the founding team on our most important growth initiatives. In this role you will own analytics, coordinate partner outreach, and help run early go-to-market experiments across the business. This is a hands-on generalist role for someone who wants broad exposure to how an early-stage company operates.","apply_method":{"method":"linkedin","notification_email":"hiring@example.invalid"}}}}}}},"x-order":3}},"/v1/{account_id}/jobs/{job_id}":{"get":{"operationId":"getV1AccountIdJobsJobId","tags":["Jobs"],"summary":"Get job posting","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account to retrieve the job posting on behalf of."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The numeric id of the job posting, e.g. 4100000000. This is the number in a LinkedIn job URL (https://www.linkedin.com/jobs/view/4100000000) and the job_urn value in a POST /v1/{account_id}/search/jobs result. Pass the number only — a full URL is not accepted by the API (the SDK and CLI extract the id from a URL for you)."},{"name":"with_sections","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Which additional sections to include on the response (e.g. hiring_team, salary, benefits). The exact set of accepted values is not finalized, supply the section names you need, comma-separated for more than one, and they are forwarded verbatim. Omit for the base fields only."}],"responses":{"200":{"description":"The classic job posting's full detail. Content fields (title, description) are returned verbatim and are never stored.","content":{"application/json":{"schema":{"type":"object","required":["object","id","title","company","state","is_repost","is_application_limit_reached","created_at","description","applications_count","workplace_type","employment_status"],"properties":{"object":{"type":"string","enum":["job_posting"],"description":"Response type discriminator."},"id":{"type":"string","description":"The job posting's numeric identifier."},"title":{"type":"string","description":"Job title (content pass-through — never stored)."},"company":{"type":"object","description":"The hiring company.","properties":{"id":{"type":"string","description":"The hiring company's numeric identifier."},"name":{"type":"string","description":"The hiring company's display name."},"public_picture_url":{"type":"string","description":"The company's public logo URL, when set."},"profile_url":{"type":"string","description":"The company's public LinkedIn profile URL, when set."},"public_identifier":{"type":"string","description":"The company's vanity slug, when set."}}},"location":{"type":"string","description":"Job location, when set."},"state":{"type":"string","enum":["DRAFT","LISTED","CLOSED","REVIEW","SUSPENDED"],"description":"Posting lifecycle state."},"is_repost":{"type":"boolean","description":"Whether this posting is a repost of a prior one."},"is_application_limit_reached":{"type":"boolean","description":"Whether this posting has reached its application limit."},"industries":{"type":"array","items":{"type":"string"},"description":"Industries associated with this posting, when set."},"created_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was created."},"description":{"type":"string","description":"Full job description text (content pass-through — never stored)."},"views_count":{"type":"number","description":"Number of views so far, when tracked."},"applications_count":{"type":"number","description":"Number of applicants so far."},"screening_questions":{"type":"array","items":{},"description":"Screening questions attached to this posting, when any are set."},"workplace_type":{"type":"string","enum":["ON_SITE","HYBRID","REMOTE"],"description":"Workplace arrangement."},"employment_status":{"type":"string","enum":["FULL_TIME","PART_TIME","CONTRACT","TEMPORARY","OTHER","VOLUNTEER","INTERNSHIP"],"description":"Employment type."},"budget":{"type":"object","description":"Promotion budget, when this posting has one set.","properties":{"total":{"type":"object","properties":{"amount":{"type":"number","description":"Total budget amount."},"currency":{"type":"string","description":"ISO-4217 currency code."}}},"daily":{"type":"object","properties":{"amount":{"type":"number","description":"Daily budget amount."},"currency":{"type":"string","description":"ISO-4217 currency code."}}}}},"published_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was published, when set."},"expires_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting expires, when set."},"closed_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was closed, when set."},"listed_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was listed, when set."},"hiring_team":{"type":"array","items":{},"description":"Hiring team members associated with this posting, when the posting exposes any."}}},"examples":{"jobPosting":{"summary":"A classic job posting owned by the connected account","value":{"object":"job_posting","id":"4100000001","title":"Growth Marketing Manager","company":{"id":"10000001","name":"Brightlane Labs","public_picture_url":"https://media.example.invalid/company_10000001.jpg","profile_url":"https://www.linkedin.com/company/brightlane-labs-fake/","public_identifier":"brightlane-labs-fake"},"location":"Berlin, Germany","state":"DRAFT","is_repost":false,"is_application_limit_reached":false,"industries":["Technology, Information and Internet"],"created_at":"2026-06-12T17:27:09.000Z","description":"As our Growth Marketing Manager you will own the paid and organic acquisition channels and run experiments across the full funnel.","views_count":42,"applications_count":75,"screening_questions":[],"workplace_type":"ON_SITE","employment_status":"FULL_TIME","budget":{"total":{"amount":50000,"currency":"EUR"},"daily":{"amount":1000,"currency":"EUR"}}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the job posting was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns one classic LinkedIn job posting at full detail — title, company, location, description, applicant count, and budget when set. Any posting reachable by its numeric id can be retrieved — including public postings not owned by the connected account. Pass `with_sections` to request additional sections such as hiring team, salary, or benefits.","x-order":1},"patch":{"operationId":"patchV1AccountIdJobsJobId","tags":["Jobs"],"summary":"Edit job posting","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account that owns the job posting."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The numeric id of the job posting, e.g. 4100000000. This is the number in a LinkedIn job URL (https://www.linkedin.com/jobs/view/4100000000) and the job_urn value in a POST /v1/{account_id}/search/jobs result. Pass the number only — a full URL is not accepted by the API (the SDK and CLI extract the id from a URL for you)."}],"responses":{"200":{"description":"The updated job posting, reflecting only the fields included in the request. Content fields (title, description) are returned verbatim and are never stored.","content":{"application/json":{"schema":{"type":"object","required":["object","id","title","company","state","is_repost","is_application_limit_reached","created_at","description","applications_count","workplace_type","employment_status"],"properties":{"object":{"type":"string","enum":["job_posting"],"description":"Response type discriminator."},"id":{"type":"string","description":"The job posting's numeric identifier."},"title":{"type":"string","description":"Job title (content pass-through — never stored)."},"company":{"type":"object","description":"The hiring company.","properties":{"id":{"type":"string","description":"The hiring company's numeric identifier."},"name":{"type":"string","description":"The hiring company's display name."},"public_picture_url":{"type":"string","description":"The company's public logo URL, when set."},"profile_url":{"type":"string","description":"The company's public LinkedIn profile URL, when set."},"public_identifier":{"type":"string","description":"The company's vanity slug, when set."}}},"location":{"type":"string","description":"Job location, when set."},"state":{"type":"string","enum":["DRAFT","LISTED","CLOSED","REVIEW","SUSPENDED"],"description":"Posting lifecycle state."},"is_repost":{"type":"boolean","description":"Whether this posting is a repost of a prior one."},"is_application_limit_reached":{"type":"boolean","description":"Whether this posting has reached its application limit."},"industries":{"type":"array","items":{"type":"string"},"description":"Industries associated with this posting, when set."},"created_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was created."},"description":{"type":"string","description":"Full job description text (content pass-through — never stored)."},"views_count":{"type":"number","description":"Number of views so far, when tracked."},"applications_count":{"type":"number","description":"Number of applicants so far."},"screening_questions":{"type":"array","items":{},"description":"Screening questions attached to this posting, when any are set."},"workplace_type":{"type":"string","enum":["ON_SITE","HYBRID","REMOTE"],"description":"Workplace arrangement."},"employment_status":{"type":"string","enum":["FULL_TIME","PART_TIME","CONTRACT","TEMPORARY","OTHER","VOLUNTEER","INTERNSHIP"],"description":"Employment type."},"budget":{"type":"object","description":"Promotion budget, when this posting has one set.","properties":{"total":{"type":"object","properties":{"amount":{"type":"number","description":"Total budget amount."},"currency":{"type":"string","description":"ISO-4217 currency code."}}},"daily":{"type":"object","properties":{"amount":{"type":"number","description":"Daily budget amount."},"currency":{"type":"string","description":"ISO-4217 currency code."}}}}},"published_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was published, when set."},"expires_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting expires, when set."},"closed_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was closed, when set."},"listed_at":{"type":"string","description":"ISO-8601 UTC timestamp the posting was listed, when set."},"hiring_team":{"type":"array","items":{},"description":"Hiring team members associated with this posting, when the posting exposes any."}}},"examples":{"jobPosting":{"summary":"A job posting after a partial edit","value":{"object":"job_posting","id":"4100000001","title":"Growth Marketing Manager II","company":{"id":"10000001","name":"Brightlane Labs","public_picture_url":"https://media.example.invalid/company_10000001.jpg","profile_url":"https://www.linkedin.com/company/brightlane-labs-fake/","public_identifier":"brightlane-labs-fake"},"location":"Berlin, Germany","state":"DRAFT","is_repost":false,"is_application_limit_reached":false,"industries":["Technology, Information and Internet"],"created_at":"2026-06-12T17:27:09.000Z","description":"As our Growth Marketing Manager you will own the paid and organic acquisition channels and run experiments across the full funnel.","views_count":42,"applications_count":75,"screening_questions":[],"workplace_type":"ON_SITE","employment_status":"FULL_TIME","budget":{"total":{"amount":50000,"currency":"EUR"},"daily":{"amount":1000,"currency":"EUR"}}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"The request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the job posting was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot edit this job posting.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Applies a partial update to a classic job posting the connected account owns — only the fields you include are changed; everything else is left as-is. This can affect real money: editing a posting that is already published (LISTED) changes a live, money-spending listing, and the connected account may be billed differently as a result. Only postings the connected account owns can be edited.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"job_title":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"description":"The job title, reference an existing LinkedIn job title by id, or supply a free-text name."},"company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"description":"The hiring company, reference an existing company by id, or supply a free-text name."},"workplace_type":{"type":"string","enum":["ON_SITE","HYBRID","REMOTE"],"description":"Workplace arrangement."},"location":{"type":"string","description":"A LOCATION parameter id from GET /v1/{account_id}/search/parameters."},"employment_status":{"type":"string","enum":["FULL_TIME","PART_TIME","CONTRACT","TEMPORARY","OTHER","VOLUNTEER","INTERNSHIP"],"description":"Employment type."},"description":{"type":"string","description":"Full job description (minimum 200 characters). Content passes through verbatim, never stored."},"apply_method":{"oneOf":[{"type":"object","properties":{"method":{"type":"string","const":"linkedin"},"notification_email":{"type":"string","description":"Email address notified of new applicants."}},"required":["method","notification_email"],"title":"Linkedin"},{"type":"object","properties":{"method":{"type":"string","const":"external"},"website_url":{"type":"string","description":"External URL candidates apply through."}},"required":["method","website_url"],"title":"External"}],"discriminator":{"propertyName":"method","mapping":{"linkedin":"#/oneOf/0","external":"#/oneOf/1"}},"description":"How candidates apply, through LinkedIn (with a notification email) or an external site."},"skills":{"type":"array","items":{"type":"string"},"description":"Optional skill parameter ids from GET /v1/{account_id}/search/parameters."},"screening_questions":{"type":"array","items":{},"description":"Optional screening questions attached to the posting."},"rejection_settings":{"description":"Optional automatic-rejection configuration."}}},"examples":{"titleChange":{"summary":"Change only the job title","value":{"job_title":{"name":"Growth Marketing Manager II"}}}}}}},"x-order":4}},"/v1/{account_id}/jobs/{job_id}/budget":{"get":{"operationId":"getV1AccountIdJobsJobIdBudget","tags":["Jobs"],"summary":"Get job posting budget","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account that owns the job posting."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The numeric id of the job posting, e.g. 4100000000. This is the number in a LinkedIn job URL (https://www.linkedin.com/jobs/view/4100000000) and the job_urn value in a POST /v1/{account_id}/search/jobs result. Pass the number only — a full URL is not accepted by the API (the SDK and CLI extract the id from a URL for you)."}],"responses":{"200":{"description":"Pricing to publish this posting — the read-only companion to publishing, so a client can price a publish before committing money. There is no currency under `free` — currency only applies to promoted pricing.","content":{"application/json":{"schema":{"type":"object","required":["object","promoted","free"],"properties":{"object":{"type":"string","enum":["job_posting_budget"],"description":"Response type discriminator."},"promoted":{"type":"object","description":"Paid-promotion pricing.","properties":{"currency":{"type":"string","description":"ISO-4217 currency code."},"daily":{"type":"object","properties":{"min":{"type":"number","description":"Minimum daily budget."},"max":{"type":"number","description":"Maximum daily budget."},"recommended":{"type":"number","description":"Recommended daily budget for PROMOTED."},"promoted_plus_recommended":{"type":"number","description":"Recommended daily budget for PROMOTED_PLUS."}}},"total":{"type":"object","properties":{"min":{"type":"number","description":"Minimum total budget."},"max":{"type":"number","description":"Maximum total budget."},"recommended":{"type":"number","description":"Recommended total budget for PROMOTED."},"promoted_plus_recommended":{"type":"number","description":"Recommended total budget for PROMOTED_PLUS."}}},"estimated_daily_applicants_count":{"type":"number","description":"Estimated daily applicants if promoted."}}},"free":{"type":"object","description":"Free-posting eligibility. Note there is no currency field here — currency only applies to promoted pricing.","properties":{"eligible":{"type":"boolean","description":"Whether this posting can be published for free."},"estimated_daily_applicants_count":{"type":"number","description":"Estimated daily applicants if published for free."}}}}},"examples":{"jobPostingBudget":{"summary":"Pricing for a draft posting","value":{"object":"job_posting_budget","promoted":{"currency":"EUR","daily":{"min":10,"max":500,"recommended":45,"promoted_plus_recommended":65},"total":{"min":100,"max":5000,"recommended":450,"promoted_plus_recommended":650},"estimated_daily_applicants_count":8},"free":{"eligible":true,"estimated_daily_applicants_count":2}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the job posting was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns pricing to publish this job posting — the read-only companion to publishing, so you can price a publish before committing any money.","x-order":2}},"/v1/{account_id}/jobs/{job_id}/publish":{"post":{"operationId":"postV1AccountIdJobsJobIdPublish","tags":["Jobs"],"summary":"Publish job posting","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account to publish the job posting on behalf of."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The numeric id of the job posting, e.g. 4100000000. This is the number in a LinkedIn job URL (https://www.linkedin.com/jobs/view/4100000000) and the job_urn value in a POST /v1/{account_id}/search/jobs result. Pass the number only — a full URL is not accepted by the API (the SDK and CLI extract the id from a URL for you)."}],"responses":{"200":{"description":"The posting was published. This spends real money on the connected account's LinkedIn payment method when `mode` is PROMOTED or PROMOTED_PLUS — the `budget` you provide is the explicit opt-in. job_state reflects the posting's lifecycle state after publishing.","content":{"application/json":{"schema":{"type":"object","title":"JobPostingPublished","description":"The posting's lifecycle state after publishing.","required":["object","job_state"],"properties":{"object":{"type":"string","enum":["job_posting_published"],"description":"Response type discriminator."},"job_state":{"type":"string","enum":["DRAFT","LISTED","CLOSED","REVIEW","SUSPENDED"],"description":"The posting's lifecycle state after publishing."}}},"examples":{"published":{"summary":"Posting published","value":{"object":"job_posting_published","job_state":"LISTED"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"The request body failed validation (e.g. budget missing for PROMOTED/PROMOTED_PLUS), or this posting cannot be published in the requested mode right now (check its draft eligibility and the mode/budget combination).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either the account does not have the required Core seat (TIER_NOT_ACTIVE, carries required_tier:'core'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the subscription/entitlement LinkedIn requires to publish job postings, even a FREE posting (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks the required Jobs subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the job posting was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot publish this job posting.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Publishes a classic job posting draft. THIS CAN SPEND REAL MONEY: publishing with mode PROMOTED or PROMOTED_PLUS charges the connected account's LinkedIn payment method for the budget you provide — providing `budget` on those modes IS the explicit opt-in to spend. FREE publishing spends nothing but requires free-posting eligibility (check GET .../budget's free.eligible first). Returns either the published posting or a verification checkpoint that must be resolved before the posting goes live.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"mode":{"type":"string","const":"FREE","description":"Publish for free. Requires free-posting eligibility; check GET .../budget's free.eligible first."},"set_hiring_frame":{"type":"boolean","description":"Add the hiring frame to the poster's profile picture.","default":true},"bypass_email_verification":{"type":"boolean","description":"Skip the posting-eligibility email verification step.","default":false}},"required":["mode"],"title":"FREE"},{"type":"object","properties":{"mode":{"type":"string","const":"PROMOTED","description":"Paid promoted posting. Real money; spends on the connected account's LinkedIn payment method."},"budget":{"type":"object","properties":{"currency":{"type":"string","description":"ISO-4217 currency code, e.g. EUR."},"amount":{"type":"number","minimum":0,"description":"Budget amount, in the given currency."},"scope":{"type":"string","enum":["DAILY","TOTAL"],"description":"Whether the amount is a daily or a total budget."}},"required":["currency","amount","scope"],"description":"Required. The paid-promotion budget; providing it is the explicit opt-in to spend real money."}},"required":["mode","budget"],"title":"PROMOTED"},{"type":"object","properties":{"mode":{"type":"string","const":"PROMOTED_PLUS","description":"Premium promoted posting. Real money; spends on the connected account's LinkedIn payment method."},"budget":{"type":"object","properties":{"currency":{"type":"string","description":"ISO-4217 currency code, e.g. EUR."},"amount":{"type":"number","minimum":0,"description":"Budget amount, in the given currency."},"scope":{"type":"string","enum":["DAILY","TOTAL"],"description":"Whether the amount is a daily or a total budget."}},"required":["currency","amount","scope"],"description":"Required. The paid-promotion budget; providing it is the explicit opt-in to spend real money."}},"required":["mode","budget"],"title":"PROMOTED PLUS"}],"discriminator":{"propertyName":"mode","mapping":{"FREE":"#/oneOf/0","PROMOTED":"#/oneOf/1","PROMOTED_PLUS":"#/oneOf/2"}}},"examples":{"free":{"summary":"Publish for free","value":{"mode":"FREE"}},"promotedDaily":{"summary":"Publish PROMOTED with a daily budget — REAL MONEY","value":{"mode":"PROMOTED","budget":{"currency":"EUR","amount":25,"scope":"DAILY"}}},"promotedPlusTotal":{"summary":"Publish PROMOTED_PLUS with a total budget — REAL MONEY","value":{"mode":"PROMOTED_PLUS","budget":{"currency":"EUR","amount":250,"scope":"TOTAL"}}}}}}},"x-order":5}},"/v1/{account_id}/jobs/{job_id}/close":{"post":{"operationId":"postV1AccountIdJobsJobIdClose","tags":["Jobs"],"summary":"Close job posting","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account that owns the job posting."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The numeric id of the job posting, e.g. 4100000000. This is the number in a LinkedIn job URL (https://www.linkedin.com/jobs/view/4100000000) and the job_urn value in a POST /v1/{account_id}/search/jobs result. Pass the number only — a full URL is not accepted by the API (the SDK and CLI extract the id from a URL for you)."}],"responses":{"200":{"description":"The posting was closed and stops accepting further applications. Closing a published posting can affect a live, money-spending listing, and cannot be undone. The response is a minimal acknowledgement — it does not echo the posting.","content":{"application/json":{"schema":{"type":"object","title":"JobPostingClosed","description":"The posting was closed.","required":["object"],"properties":{"object":{"type":"string","enum":["job_posting_closed"],"description":"Response type discriminator."}}},"examples":{"closed":{"summary":"Posting closed","value":{"object":"job_posting_closed"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either the account does not have the required Core seat (TIER_NOT_ACTIVE, carries required_tier:'core'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the subscription/entitlement LinkedIn requires to manage job postings (the same gate that blocks publish also blocks close; activate it on LinkedIn — reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks the required Jobs subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the job posting was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot close this job posting.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Closes a classic job posting so it stops accepting further applications. Closing a posting that is already published (LISTED) can affect a live, money-spending listing, and this cannot be undone. Only postings the connected account owns can be closed. No request body.","x-order":6}},"/v1/{account_id}/jobs/{job_id}/applicants":{"post":{"operationId":"postV1AccountIdJobsJobIdApplicants","tags":["Jobs"],"summary":"List job applicants","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account that owns the job posting."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The numeric id of the job posting, e.g. 4100000000. This is the number in a LinkedIn job URL (https://www.linkedin.com/jobs/view/4100000000) and the job_urn value in a POST /v1/{account_id}/search/jobs result. Pass the number only — a full URL is not accepted by the API (the SDK and CLI extract the id from a URL for you)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Number of results to return (1–100)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response."}],"responses":{"200":{"description":"Applicants matching the filter. Omitting `ratings` requests all four values, so the default view reflects the posting's whole applicant funnel. Content fields (profile, screening-question answers) are returned verbatim and are never stored.","content":{"application/json":{"schema":{"type":"object","required":["object","items","paging"],"properties":{"object":{"type":"string","enum":["job_applicant_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","required":["object","id","messaging_token","applied_at","profile","rating","screening_questions"],"properties":{"object":{"type":"string","enum":["job_applicant"],"description":"Response type discriminator."},"id":{"type":"string","description":"The applicant's numeric identifier."},"messaging_token":{"type":"string","description":"Opaque token — pass it to start a chat with this applicant."},"applied_at":{"type":"string","description":"ISO-8601 UTC timestamp the applicant applied."},"viewed_at":{"type":"string","description":"ISO-8601 UTC timestamp this applicant was viewed, when set."},"last_messaged_at":{"type":"string","description":"ISO-8601 UTC timestamp last messaged, when set."},"profile":{"type":"object","description":"The applicant's profile (content pass-through — never stored).","properties":{"id":{"type":"string","description":"The profile's identifier."},"display_name":{"type":"string","description":"The applicant's display name."},"headline":{"type":"string","description":"The applicant's headline, when set."},"location":{"type":"string","description":"The applicant's location, when set."},"network_distance":{"type":"string","description":"Network distance to the connected account."},"profile_url":{"type":"string","description":"The applicant's public LinkedIn profile URL, when set."},"public_identifier":{"type":"string","description":"The applicant's vanity slug, when set."},"public_picture_url":{"type":"string","description":"The applicant's public picture URL, when set."}}},"rating":{"type":["string","null"],"enum":["UNRATED","NOT_A_FIT","MAYBE","GOOD_FIT",null],"description":"This applicant's rating, or null when not yet rated."},"screening_questions":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","description":"The screening question text (content pass-through — never stored)."},"has_succeeded":{"type":"boolean","description":"Whether this applicant's answer met the question's bar."},"is_eliminatory":{"type":"boolean","description":"Whether failing this question disqualifies the applicant."},"answers":{"type":"array","items":{"type":"string"},"description":"The applicant's answer(s) (content pass-through — never stored)."}}},"description":"Screening questions and this applicant's answers, when the posting has any."}}},"description":"Applicants matching the filter."},"paging":{"type":"object","required":["total_count"],"properties":{"total_count":{"type":"number","description":"Total applicants matching the requested filter (post-filter — omitting `ratings` requests all four values, so this reflects the posting's whole applicant funnel by default)."}}},"cursor":{"type":"string","description":"Opaque pagination cursor for the next page. Present only when more applicants remain past this page — omit on the first request, pass back verbatim to page forward."}}},"examples":{"jobApplicantList":{"summary":"A page of applicants across all four ratings","value":{"object":"job_applicant_list","items":[{"object":"job_applicant","id":"80000000001","messaging_token":"msg_token_80000000001","applied_at":"2026-06-01T09:00:00.000Z","profile":{"id":"profile_80000000001","display_name":"Applicant 1","headline":"Growth marketing candidate","location":"Berlin, Germany","network_distance":"DISTANCE_2","profile_url":"https://www.linkedin.com/in/applicant-1-fake/","public_identifier":"applicant-1-fake"},"rating":null,"screening_questions":[{"question":"Do you have 3+ years of relevant experience?","has_succeeded":true,"is_eliminatory":false,"answers":["Yes"]}]}],"paging":{"total_count":54}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid filter body, or limit greater than 100.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the job posting was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Lists applicants for a classic job posting the connected account owns. This is a read — POST is used to carry the filter body, matching the /v1/search/* convention; nothing is mutated. Omit `ratings` to see the full applicant funnel — the server sends all four rating values by default.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ratings":{"type":"array","items":{"type":"string","enum":["UNRATED","NOT_A_FIT","MAYBE","GOOD_FIT"]},"description":"Filter by applicant rating. Omit to see the full funnel: the server sends all four ratings by default so the total matches the posting's own applicant count."},"keywords":{"type":"string","description":"Free-text keyword filter over applicant profiles."},"sort_by":{"type":"string","enum":["APPLIED_DATE","FIRST_NAME","LAST_NAME"],"description":"Sort order for the returned applicants. Defaults to APPLIED_DATE."},"location":{"type":"array","items":{"type":"string"},"description":"Location parameter ids from GET /v1/{account_id}/search/parameters."},"years_of_experience":{"type":"array","items":{"type":"object","properties":{"min":{"type":"integer","minimum":0},"max":{"type":"integer","minimum":0}}},"description":"Years-of-experience ranges to filter applicants by."},"skills":{"type":"array","items":{"type":"string"},"description":"Skill parameter ids from GET /v1/{account_id}/search/parameters."}}},"examples":{"fullFunnel":{"summary":"Every applicant (omit ratings for the full funnel)","value":{}},"goodFitOnly":{"summary":"Only GOOD_FIT-rated applicants, sorted by application date","value":{"ratings":["GOOD_FIT"],"sort_by":"APPLIED_DATE"}}}}}},"x-order":7}},"/v1/{account_id}/jobs/{job_id}/applicants/{applicant_id}":{"get":{"operationId":"getV1AccountIdJobsJobIdApplicantsApplicantId","tags":["Jobs"],"summary":"Get job applicant","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account that owns the job posting."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The numeric id of the job posting, e.g. 4100000000. This is the number in a LinkedIn job URL (https://www.linkedin.com/jobs/view/4100000000) and the job_urn value in a POST /v1/{account_id}/search/jobs result. Pass the number only — a full URL is not accepted by the API (the SDK and CLI extract the id from a URL for you)."},{"name":"applicant_id","in":"path","required":true,"schema":{"type":"string"},"description":"The numeric id of the job applicant, obtained from the list-applicants endpoint's items[].id."}],"responses":{"200":{"description":"Full detail for one applicant, including contact information. Content fields (profile, screening-question answers, contact information) are returned verbatim and are never stored.","content":{"application/json":{"schema":{"type":"object","required":["object","id","messaging_token","applied_at","profile","rating","screening_questions","has_resume","contact_info"],"properties":{"object":{"type":"string","enum":["job_applicant"],"description":"Response type discriminator."},"id":{"type":"string","description":"The applicant's numeric identifier."},"messaging_token":{"type":"string","description":"Opaque token — pass it to start a chat with this applicant."},"applied_at":{"type":"string","description":"ISO-8601 UTC timestamp the applicant applied."},"viewed_at":{"type":"string","description":"ISO-8601 UTC timestamp this applicant was viewed, when set."},"last_messaged_at":{"type":"string","description":"ISO-8601 UTC timestamp last messaged, when set."},"profile":{"type":"object","description":"The applicant's profile (content pass-through — never stored).","properties":{"id":{"type":"string","description":"The profile's identifier."},"display_name":{"type":"string","description":"The applicant's display name."},"headline":{"type":"string","description":"The applicant's headline, when set."},"location":{"type":"string","description":"The applicant's location, when set."},"network_distance":{"type":"string","description":"Network distance to the connected account."},"profile_url":{"type":"string","description":"The applicant's public LinkedIn profile URL, when set."},"public_identifier":{"type":"string","description":"The applicant's vanity slug, when set."},"public_picture_url":{"type":"string","description":"The applicant's public picture URL, when set."}}},"rating":{"type":["string","null"],"enum":["UNRATED","NOT_A_FIT","MAYBE","GOOD_FIT",null],"description":"This applicant's rating, or null when not yet rated."},"screening_questions":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","description":"The screening question text (content pass-through — never stored)."},"has_succeeded":{"type":"boolean","description":"Whether this applicant's answer met the question's bar."},"is_eliminatory":{"type":"boolean","description":"Whether failing this question disqualifies the applicant."},"answers":{"type":"array","items":{"type":"string"},"description":"The applicant's answer(s) (content pass-through — never stored)."}}},"description":"Screening questions and this applicant's answers, when the posting has any."},"has_resume":{"type":"boolean","description":"Whether this applicant has a résumé on file."},"contact_info":{"type":"object","description":"The applicant's contact information (real personal data — never stored).","properties":{"email":{"type":"string","description":"The applicant's email address."},"phone":{"type":"string","description":"The applicant's phone number."}}}}},"examples":{"jobApplicant":{"summary":"An applicant with a résumé on file","value":{"object":"job_applicant","id":"80000000001","messaging_token":"msg_token_80000000001","applied_at":"2026-06-01T09:00:00.000Z","profile":{"id":"profile_80000000001","display_name":"Applicant 1","headline":"Growth marketing candidate","location":"Berlin, Germany","network_distance":"DISTANCE_2","profile_url":"https://www.linkedin.com/in/applicant-1-fake/","public_identifier":"applicant-1-fake"},"rating":null,"screening_questions":[{"question":"Do you have 3+ years of relevant experience?","has_succeeded":true,"is_eliminatory":false,"answers":["Yes"]}],"has_resume":true,"contact_info":{"email":"applicant.fake@example.invalid","phone":"+49 30 00000000"}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, or the job posting/applicant was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns full detail for one applicant to a classic job posting the connected account owns, including contact information.","x-order":8}},"/v1/{account_id}/jobs/{job_id}/applicants/{applicant_id}/resume":{"get":{"operationId":"getV1AccountIdJobsJobIdApplicantsApplicantIdResume","tags":["Jobs"],"summary":"Download job applicant résumé","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The connected LinkedIn account that owns the job posting."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The numeric id of the job posting, e.g. 4100000000. This is the number in a LinkedIn job URL (https://www.linkedin.com/jobs/view/4100000000) and the job_urn value in a POST /v1/{account_id}/search/jobs result. Pass the number only — a full URL is not accepted by the API (the SDK and CLI extract the id from a URL for you)."},{"name":"applicant_id","in":"path","required":true,"schema":{"type":"string"},"description":"The numeric id of the job applicant, obtained from the list-applicants endpoint's items[].id."}],"responses":{"200":{"description":"The raw résumé bytes, served on demand with the original content type. Curviate never caches, stores, or logs the résumé body — there is no résumé URL anywhere in this API.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary","description":"Raw résumé file bytes. The Content-Type and Content-Disposition headers are set by the server."},"examples":{"binary":{"summary":"Raw résumé file bytes","value":"<binary résumé bytes — served with the original Content-Type and a Content-Disposition filename>"}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or empty account_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"The account does not have the required Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant, the job posting/applicant was not found, or this applicant has no résumé on file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The account is restricted and cannot be queried.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"The résumé is still being generated and was not ready in time. Retry the request shortly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Streams the résumé file for an applicant to a classic job posting the connected account owns, as raw bytes. Curviate never caches, stores, or logs the résumé body. LinkedIn may still be generating the file — a request may need a moment to succeed.","x-order":9}},"/v1/{account_id}/posts/{post_id}":{"get":{"operationId":"getV1AccountIdPostsPostId","tags":["Posts"],"summary":"Retrieve a post","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id`, as returned by get-post / list-posts. Full LinkedIn share URLs are also accepted (e.g. `https://www.linkedin.com/posts/someone_title-activity-7332661864792854528-Qh99/` or `https://www.linkedin.com/feed/update/urn:li:activity:7332661864792854528-slug`). Bare numeric ids and URN forms are also accepted: `7332661864792854528`, `urn:li:activity:N`, `urn:li:ugcPost:N`, `urn:li:share:N`."}],"responses":{"200":{"description":"The requested post, with full text, nullable counters, author, attachments, and poll.","content":{"application/json":{"schema":{"type":"object","description":"A LinkedIn post (content pass-through — text and attachments are never stored).","properties":{"object":{"type":"string","enum":["post"],"description":"Response type discriminator."},"id":{"type":"string","description":"The post's own identifier — use this value as the post_id path param on sub-resource endpoints."},"share_url":{"type":["string","null"],"description":"Shareable URL for the post."},"title":{"type":["string","null"],"description":"Post title, or null if not set."},"text":{"type":["string","null"],"description":"Full post text (content pass-through — never stored)."},"created_at":{"type":["string","null"],"description":"ISO-8601 UTC datetime the post was created, or null if unavailable."},"comment_count":{"type":["number","null"],"description":"Total comment count, or null when the platform hides it."},"reactions":{"type":"array","description":"Per-reaction-type count buckets.","items":{"type":"object","description":"A per-reaction-type count bucket.","properties":{"type":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type (unified lowercase enum)."},"count":{"type":"number","description":"Count of this reaction type on the post."}}}},"reaction_count":{"type":["number","null"],"description":"Total reaction count — the sum of reactions[].count, or null when the platform hides it."},"repost_count":{"type":["number","null"],"description":"Total repost count, or null when the platform hides it."},"impressions_count":{"type":["number","null"],"description":"Total impression count, or null if not available."},"user_reacted":{"type":["string","null"],"enum":["like","celebrate","support","love","insightful","funny",null],"description":"The authenticated account's own reaction (unified lowercase enum), or null if not reacted."},"author":{"type":"object","description":"Author of the post or comment.","properties":{"id":{"type":"string","description":"LinkedIn profile identifier."},"name":{"type":"string","description":"Author's display name."},"profile_picture_url":{"type":["string","null"],"description":"Author's profile picture URL, or null if not set."}}},"written_by":{"type":["object","null"],"description":"The member who wrote the post (may differ from author for organization posts), or null."},"permissions":{"type":["object","null"],"description":"Interaction permissions for the authenticated account, or null.","properties":{"can_react":{"type":"boolean","description":"true if the account can react to this post."},"can_share":{"type":"boolean","description":"true if the account can share this post."},"can_post_comments":{"type":"boolean","description":"true if the account can comment on this post."}}},"is_repost":{"type":"boolean","description":"true if this post is a repost of another post."},"repost_id":{"type":["string","null"],"description":"id of the original post if is_repost is true, else null."},"reposted_by":{"type":["object","null"],"description":"Profile of the account that reposted, or null."},"repost_content":{"type":["object","null"],"description":"Embedded original post content for reposts, or null."},"attachments":{"type":"array","description":"Media attachments on the post.","items":{"type":"object"}},"poll":{"type":["object","null"],"description":"Poll data if the post contains a poll, or null."},"specifics":{"type":["object","null"],"description":"Job-posting or article context on the post, present only when applicable."}}},"examples":{"post":{"summary":"A standard post","value":{"object":"post","id":"urn:li:ugcPost:7123456789012345678","share_url":"https://www.linkedin.com/feed/update/urn:li:ugcPost:7123456789012345678","title":null,"text":"Excited to share our latest update with the community — three months in the making.","created_at":"2026-07-01T10:00:00.000Z","comment_count":7,"reactions":[{"type":"celebrate","count":42}],"reaction_count":42,"repost_count":3,"impressions_count":1500,"user_reacted":null,"author":{"id":"ACoAAAEXAMPLE","name":"Alice Example","profile_picture_url":null},"written_by":{"id":"ACoAAAEXAMPLE","name":"Alice Example","profile_picture_url":null},"permissions":{"can_react":true,"can_share":true,"can_post_comments":true},"is_repost":false,"repost_id":null,"reposted_by":null,"repost_content":null,"attachments":[],"poll":null,"specifics":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or invalid path parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the post was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns the full post object including text, nullable counters, author, attachments, and poll.","x-order":1},"delete":{"operationId":"deleteV1AccountIdPostsPostId","tags":["Posts"],"summary":"Delete a post","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that owns the post."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id`, as returned by get-post / list-posts. Full LinkedIn share URLs are also accepted (e.g. `https://www.linkedin.com/posts/someone_title-activity-7332661864792854528-Qh99/` or `https://www.linkedin.com/feed/update/urn:li:activity:7332661864792854528-slug`). Bare numeric ids and URN forms are also accepted: `7332661864792854528`, `urn:li:activity:N`, `urn:li:ugcPost:N`, `urn:li:share:N`."}],"responses":{"204":{"description":"The post was deleted. No response body.","content":{"application/json":{"schema":{"type":"object"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing or invalid path parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"This account is not the post's owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the post was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Deletes a post owned by this account. Own posts only — no response body.","x-order":6}},"/v1/{account_id}/posts":{"post":{"operationId":"postV1AccountIdPosts","tags":["Posts"],"summary":"Create a post","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to post as."}],"responses":{"201":{"description":"Post published successfully. Returns the new post's id.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["post_created"],"description":"Response type discriminator."},"id":{"type":"string","description":"The newly published post's own identifier."}},"required":["object","id"]},"examples":{"created":{"summary":"Post created","value":{"object":"post_created","id":"urn:li:ugcPost:7123456789012345678"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing required field, empty text, or an unrecognized field in the request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"413":{"description":"Attachment or total request body exceeds the size cap (base64 inflates ~+33%).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"413 error","value":{"code":"PAYLOAD_TOO_LARGE","message":"An uploaded part or the request body exceeds the size limit.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"415":{"description":"Unsupported media type — this endpoint accepts application/json only (multipart is retired).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"415 error","value":{"code":"UNSUPPORTED_MEDIA_TYPE","message":"The request content type or attachment format is not accepted.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The platform rejected the post (e.g. content policy). Conservative mapping — outage-indistinguishable errors stay 502.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Publishes a post on the authenticated LinkedIn account. Send application/json; attach files as base64 objects. Post text passes through to the platform and is never stored.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"Post body text (1–3000 chars). Inline @mentions live in the text (e.g. \"@ACoAA...\"). Not stored or logged."},"attachments":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string","description":"Base64-encoded file bytes."},"content_type":{"type":"string","description":"Attachment MIME type (e.g. image/png, application/pdf)."},"filename":{"type":"string","description":"File name for the attachment."}},"required":["content","content_type","filename"]},"description":"Media attachments (base64 JSON objects). Multiple entries produce a multi-image carousel; a document/PDF entry produces a document post."},"quoted_post_id":{"type":"string","description":"A post_id to quote/repost. Empty text + quoted_post_id = a simple repost; non-empty text + quoted_post_id = a quote-post."},"can_read":{"type":"string","enum":["anyone","relations_only"],"description":"Who can read the post (substrate default: anyone if omitted)."},"can_comment":{"type":"string","enum":["anyone","relations_only","no_one"],"description":"Who may comment (substrate default: anyone if omitted)."},"post_as":{"type":"string","description":"Company page id to post as — the account must administer it."}},"required":["text"]},"examples":{"minimal":{"summary":"Publish a text post","value":{"text":"Excited to share our latest update with the community."}},"quotePost":{"summary":"Quote-post (repost with commentary)","value":{"text":"Adding my own take on this:","quoted_post_id":"urn:li:ugcPost:7123456789012345678"}},"restrictedVisibility":{"summary":"Restrict who can read and comment","value":{"text":"Sharing with my network only.","can_read":"relations_only","can_comment":"relations_only"}}}}}},"x-order":2}},"/v1/{account_id}/users/{user_id}/posts":{"get":{"operationId":"getV1AccountIdUsersUserIdPosts","tags":["Posts"],"summary":"List a user's posts","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"\"me\" for the caller's own account, or another LinkedIn user's public identifier, member ID, or profile URL."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"description":"Maximum items to return (1–50, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Pagination cursor from a previous response."}],"responses":{"200":{"description":"Returns posts authored by this account (user_id=\"me\") or another LinkedIn user, plus the next-page cursor. Post text is returned verbatim.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["post_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","description":"A LinkedIn post (content pass-through — text and attachments are never stored).","properties":{"object":{"type":"string","enum":["post"],"description":"Response type discriminator."},"id":{"type":"string","description":"The post's own identifier — use this value as the post_id path param on sub-resource endpoints."},"share_url":{"type":["string","null"],"description":"Shareable URL for the post."},"title":{"type":["string","null"],"description":"Post title, or null if not set."},"text":{"type":["string","null"],"description":"Full post text (content pass-through — never stored)."},"created_at":{"type":["string","null"],"description":"ISO-8601 UTC datetime the post was created, or null if unavailable."},"comment_count":{"type":["number","null"],"description":"Total comment count, or null when the platform hides it."},"reactions":{"type":"array","description":"Per-reaction-type count buckets.","items":{"type":"object","description":"A per-reaction-type count bucket.","properties":{"type":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type (unified lowercase enum)."},"count":{"type":"number","description":"Count of this reaction type on the post."}}}},"reaction_count":{"type":["number","null"],"description":"Total reaction count — the sum of reactions[].count, or null when the platform hides it."},"repost_count":{"type":["number","null"],"description":"Total repost count, or null when the platform hides it."},"impressions_count":{"type":["number","null"],"description":"Total impression count, or null if not available."},"user_reacted":{"type":["string","null"],"enum":["like","celebrate","support","love","insightful","funny",null],"description":"The authenticated account's own reaction (unified lowercase enum), or null if not reacted."},"author":{"type":"object","description":"Author of the post or comment.","properties":{"id":{"type":"string","description":"LinkedIn profile identifier."},"name":{"type":"string","description":"Author's display name."},"profile_picture_url":{"type":["string","null"],"description":"Author's profile picture URL, or null if not set."}}},"written_by":{"type":["object","null"],"description":"The member who wrote the post (may differ from author for organization posts), or null."},"permissions":{"type":["object","null"],"description":"Interaction permissions for the authenticated account, or null.","properties":{"can_react":{"type":"boolean","description":"true if the account can react to this post."},"can_share":{"type":"boolean","description":"true if the account can share this post."},"can_post_comments":{"type":"boolean","description":"true if the account can comment on this post."}}},"is_repost":{"type":"boolean","description":"true if this post is a repost of another post."},"repost_id":{"type":["string","null"],"description":"id of the original post if is_repost is true, else null."},"reposted_by":{"type":["object","null"],"description":"Profile of the account that reposted, or null."},"repost_content":{"type":["object","null"],"description":"Embedded original post content for reposts, or null."},"attachments":{"type":"array","description":"Media attachments on the post.","items":{"type":"object"}},"poll":{"type":["object","null"],"description":"Poll data if the post contains a poll, or null."},"specifics":{"type":["object","null"],"description":"Job-posting or article context on the post, present only when applicable."}}},"description":"Page of posts."},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page."}}},"examples":{"page":{"summary":"First page of posts","value":{"object":"post_list","items":[{"object":"post","id":"urn:li:ugcPost:7123456789012345678","share_url":"https://www.linkedin.com/feed/update/urn:li:ugcPost:7123456789012345678","title":null,"text":"Excited to share our latest update with the community — three months in the making.","created_at":"2026-07-01T10:00:00.000Z","comment_count":7,"reactions":[{"type":"celebrate","count":42}],"reaction_count":42,"repost_count":3,"impressions_count":1500,"user_reacted":null,"author":{"id":"ACoAAAEXAMPLE","name":"Alice Example","profile_picture_url":null},"written_by":{"id":"ACoAAAEXAMPLE","name":"Alice Example","profile_picture_url":null},"permissions":{"can_react":true,"can_share":true,"can_post_comments":true},"is_repost":false,"repost_id":null,"reposted_by":null,"repost_content":null,"attachments":[],"poll":null,"specifics":null}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1–50), malformed cursor, or an unknown query param (before/after are removed in v2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the user_id could not be resolved (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns posts authored by this account. Use `user_id=\"me\"` for the caller's own account, or another LinkedIn user's identifier for read-only access. The activity feed (including reposts) semantics for a non-own user are unconfirmed pending live verification.","x-order":3}},"/v1/{account_id}/posts/{post_id}/reactions":{"get":{"operationId":"getV1AccountIdPostsPostIdReactions","tags":["Posts"],"summary":"List a post's reactions","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"description":"Maximum items to return (1–50, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Pagination cursor from a previous response."}],"responses":{"200":{"description":"Reactions on the post. Each item's value is the unified lowercase enum.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["reaction_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","description":"A reaction on a LinkedIn post.","properties":{"object":{"type":"string","enum":["reaction"],"description":"Response type discriminator."},"value":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type — the unified lowercase enum, used for both reads and writes."},"author":{"type":"object","description":"The member who made this reaction.","properties":{"id":{"type":"string","description":"LinkedIn profile identifier."},"type":{"type":"string","enum":["INDIVIDUAL","COMPANY"],"description":"Author entity type."},"name":{"type":"string","description":"Author's display name."},"headline":{"type":["string","null"],"description":"Author's LinkedIn headline."},"profile_url":{"type":["string","null"],"description":"Author's LinkedIn profile URL."},"profile_picture_url":{"type":["string","null"],"description":"Author's profile picture URL."},"network_distance":{"type":["string","null"],"description":"Relationship distance to the authenticated account."}}}}},"description":"Page of reactions."},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page. cursor:null does not confirm completeness when limit is small — the underlying pagination is offset-based; use --all / paginate() for exhaustive reads."}}},"examples":{"page":{"summary":"First page of reactions","value":{"object":"reaction_list","items":[{"object":"reaction","value":"celebrate","author":{"id":"ACoAABEXAMPLE","type":"INDIVIDUAL","name":"Bob Example","headline":"Senior Developer","profile_url":"https://www.linkedin.com/in/bob-example","profile_picture_url":null,"network_distance":"SECOND_DEGREE"}}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1–50) or malformed cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the post was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns reactions on a post. Each item's value is the unified lowercase enum (used for both reads and writes in v2).","x-order":5},"post":{"operationId":"postV1AccountIdPostsPostIdReactions","tags":["Posts"],"summary":"React to a post","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to react from."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."}],"responses":{"200":{"description":"Reaction applied (or updated). Returns the reaction value the caller sent.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["reaction_added"],"description":"Response type discriminator."},"reaction":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"The reaction value that was applied, echoing what the caller sent."}},"required":["object","reaction"]},"examples":{"reacted":{"summary":"Reaction applied","value":{"object":"reaction_added","reaction":"like"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing required field, reaction value not in the enum, or an unknown field (comment_id is removed — moved to the Comments group).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the post was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The platform rejected the reaction. Conservative mapping.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Reacts to a LinkedIn post. The reaction value uses the unified lowercase enum (the same enum reads use).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reaction":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type (unified lowercase enum): like | celebrate | support | love | insightful | funny."},"react_as":{"type":"string","description":"Company page to react as — the account must administer it."}},"required":["reaction"]},"examples":{"minimal":{"summary":"React with 'like'","value":{"reaction":"like"}},"celebrate":{"summary":"React with 'celebrate'","value":{"reaction":"celebrate"}}}}}},"x-order":7},"delete":{"operationId":"deleteV1AccountIdPostsPostIdReactions","tags":["Posts"],"summary":"Remove a reaction","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose reaction to remove."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post's `id` exactly as returned by get-post / list-posts (the opaque id form). Other id forms (bare numeric, `urn:li:…`, share URLs) are not accepted on this operation — fetch the post first and use its `id` verbatim."}],"responses":{"200":{"description":"The reaction was removed. Returns the reaction value that was removed.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["reaction_removed"],"description":"Response type discriminator."},"reaction":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"The reaction value that was removed."}},"required":["object","reaction"]},"examples":{"removed":{"summary":"Reaction removed","value":{"object":"reaction_removed","reaction":"like"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing required field, or reaction value not in the enum.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the post was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"No reaction of the given value exists to remove.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Removes this account's reaction from a post.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reaction":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"The reaction value to remove (unified lowercase enum)."}},"required":["reaction"]},"examples":{"minimal":{"summary":"Remove a 'like' reaction","value":{"reaction":"like"}}}}}},"x-order":9}},"/v1/{account_id}/users/{user_id}/reactions":{"get":{"operationId":"getV1AccountIdUsersUserIdReactions","tags":["Posts"],"summary":"List a user's reactions","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) to use for the request."},{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"\"me\" for the caller's own account, or another LinkedIn user's public identifier, member ID, or profile URL."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"description":"Maximum items to return (1–50, default 20)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Pagination cursor from a previous response."}],"responses":{"200":{"description":"Reactions made by this account (user_id=\"me\") or another LinkedIn user. Each item embeds the reacted-on post and whether the queried account is the sender.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["reaction_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","description":"A reaction made by (or, when listing another user, made by that user).","properties":{"object":{"type":"string","enum":["reaction"],"description":"Response type discriminator."},"value":{"type":"string","enum":["like","celebrate","support","love","insightful","funny"],"description":"Reaction type — unified lowercase enum."},"is_sender":{"type":"boolean","description":"true when the queried account itself made this reaction."},"sender":{"type":"object","description":"The user who made the reaction."},"parent_post":{"type":"object","description":"The post this reaction was made on (full Post or a lighter preview)."}}},"description":"Page of reactions."},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page."}}},"examples":{"page":{"summary":"First page of reactions","value":{"object":"reaction_list","items":[{"object":"reaction","value":"like","is_sender":true,"sender":{"id":"urn:li:member:self","name":"Test Account"},"parent_post":{"id":"urn:li:ugcPost:7123456789012345678","object":"post"}}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1–50) or malformed cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the user_id could not be resolved (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns reactions made by this account (`user_id=\"me\"`) or another LinkedIn user. Each item embeds the reacted-on post and whether the queried account made it.","x-order":8}},"/v1/{account_id}/saved-posts":{"get":{"operationId":"getV1AccountIdSavedPosts","tags":["Posts"],"summary":"List the account's saved posts","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose OWN saved posts to list."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Page-size lower bound (1–100, default 20); returns AT LEAST this many items, up to the next upstream page boundary (a page may return slightly more). Paginate with the returned cursor and walk until `cursor` is null for the complete list."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response's `cursor`; omit for the first page. Page until `cursor` is null. There is no `offset` parameter; an unanchored numeric offset is inert upstream, so it is not a product-surface knob."}],"responses":{"200":{"description":"The connected account's own saved posts, newest-saved-first, each a PREVIEW (never the full post body). Self resource — no other-member view exists.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["saved_post_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","description":"A PREVIEW of one saved post — never the full post body.","properties":{"object":{"type":"string","enum":["saved_post_preview"],"description":"Response type discriminator."},"id":{"type":["string","null"],"description":"The numeric activity id."},"activity_urn_id":{"type":["string","null"],"description":"The activity id, stripped of the urn:li:activity: prefix — the actionable handle for save/unsave and for GET /v1/{account_id}/posts/{post_id}."},"url":{"type":["string","null"],"description":"Canonical post URL."},"type":{"type":"string","enum":["post","article"],"description":"Basic post-type metadata."},"author":{"type":"object","description":"Author of the saved post.","properties":{"type":{"type":"string","enum":["person","company"],"description":"Author entity type."},"name":{"type":["string","null"],"description":"Author's display name."},"id":{"type":["string","null"],"description":"Obfuscated member id (person) or company id."},"numeric_id":{"type":["string","null"],"description":"Numeric member id (person), or null for a company author."},"headline":{"type":["string","null"],"description":"Author's headline, or null if not set."},"profile_url":{"type":["string","null"],"description":"Author's profile or company page URL, or null."}}},"posted_ago":{"type":["string","null"],"description":"The post's published age as rendered (e.g. \"1w\"), NOT saved-time."},"snippet":{"type":["string","null"],"description":"A preview of the post body, capped at 140 characters — never the full body."},"saved_at":{"type":"null","description":"Always null — no per-item saved-time is exposed. Rely on list order (newest-saved-first)."}}},"description":"Page of saved-post previews."},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page."}}},"examples":{"page":{"summary":"A page of saved posts","value":{"object":"saved_post_list","items":[{"object":"saved_post_preview","id":"7478150139782557696","activity_urn_id":"7478150139782557696","url":"https://www.linkedin.com/feed/update/urn:li:activity:7478150139782557696/","type":"post","author":{"type":"person","name":"Dana Ellison","id":"ACoAAExampleSaved0001","numeric_id":"60243645","headline":"VP of Engineering at ExampleCo","profile_url":"https://www.linkedin.com/in/ACoAAExampleSaved0001/"},"posted_ago":"1w","snippet":"Excited to share our latest milestone with the community.","saved_at":null}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid account_id, an out-of-range limit, or a corrupt/foreign cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"This account does not have an active Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Returns the connected account's own saved posts (a private bookmark list), newest-saved-first, each a preview — never the full post body. Self resource: there is no other-member saved-posts view.","x-order":10},"post":{"operationId":"postV1AccountIdSavedPosts","tags":["Posts"],"summary":"Save a post","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that performs the save."}],"responses":{"200":{"description":"The post is now saved (a private bookmark — no notification to the author, never visible to third parties). Re-saving an already-saved post is idempotent.","content":{"application/json":{"schema":{"type":"object","description":"A save-state write result.","properties":{"object":{"type":"string","enum":["save_result"],"description":"Response type discriminator."},"saved":{"type":"boolean","description":"true after save_post, false after unsave_post."},"post_id":{"type":"string","description":"The target post's activity id, stripped of the urn:li:activity: prefix."}},"required":["object","saved","post_id"]},"examples":{"saved":{"summary":"Post saved","value":{"object":"save_result","saved":true,"post_id":"7459869580333576193"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing/malformed account_id, or post_id is not a bare numeric id or a urn:li:activity:<id>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"This account does not have an active Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the target post was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Saves a post to the connected account's private bookmark list. Any post may be saved — it does not notify the author and is never visible to third parties.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"post_id":{"type":"string","description":"The post to save. Accepts the id returned by get_post / list_profile_activity, a full LinkedIn post URL, or urn:li:activity:/ugcPost:/share:/<id>, or a bare numeric <id>; all resolve to the same target."}},"required":["post_id"]},"examples":{"minimal":{"summary":"Save a post by full activity urn","value":{"post_id":"urn:li:activity:7459869580333576193"}},"bareId":{"summary":"Save a post by bare numeric id","value":{"post_id":"7459869580333576193"}}}}}},"x-order":11}},"/v1/{account_id}/saved-posts/{post_id}":{"delete":{"operationId":"deleteV1AccountIdSavedPostsPostId","tags":["Posts"],"summary":"Unsave a post","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) that performs the unsave."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string"},"description":"The post to unsave. Accepts `urn:li:activity:<id>` or a bare numeric `<id>`."}],"responses":{"200":{"description":"The post is no longer saved. Unsaving a not-currently-saved post is idempotent.","content":{"application/json":{"schema":{"type":"object","description":"A save-state write result.","properties":{"object":{"type":"string","enum":["save_result"],"description":"Response type discriminator."},"saved":{"type":"boolean","description":"true after save_post, false after unsave_post."},"post_id":{"type":"string","description":"The target post's activity id, stripped of the urn:li:activity: prefix."}},"required":["object","saved","post_id"]},"examples":{"unsaved":{"summary":"Post unsaved","value":{"object":"save_result","saved":false,"post_id":"7459869580333576193"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Missing/malformed account_id, or post_id is not a bare numeric id or a urn:li:activity:<id>.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"This account does not have an active Core seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"403 error","value":{"code":"TIER_NOT_ACTIVE","message":"The seat plan does not permit this operation; a higher plan is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"The account_id does not belong to this tenant (ACCOUNT_NOT_FOUND), or the target post was not found (RESOURCE_NOT_FOUND).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Removes a post from the connected account's private bookmark list.","x-order":12}},"/v1/{account_id}/recruiter/profiles/{user_id}":{"get":{"operationId":"getV1AccountIdRecruiterProfilesUserId","tags":["Recruiter: User Profile"],"summary":"Retrieve a Recruiter-enriched profile.","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat resolves the profile view."},{"name":"user_id","in":"path","required":true,"schema":{"type":"string"},"description":"The target profile: 'me', a public identifier, or a member ID."},{"name":"with_sections","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["linkedin_*","linkedin_experience","linkedin_education","linkedin_languages","linkedin_skills","linkedin_certifications","linkedin_volunteer_experience","linkedin_projects","linkedin_recommendations","linkedin_interests","linkedin_recruiting_activity","linkedin_*_preview","linkedin_experience_preview","linkedin_education_preview","linkedin_languages_preview","linkedin_skills_preview","linkedin_certifications_preview","linkedin_volunteer_experience_preview","linkedin_projects_preview","linkedin_recommendations_preview","linkedin_interests_preview","linkedin_recruiting_activity_preview"]}},"description":"Which recruiter profile sections to fetch (repeatable, flat). Allowed values: linkedin_*, linkedin_experience, linkedin_education, linkedin_languages, linkedin_skills, linkedin_certifications, linkedin_volunteer_experience, linkedin_projects, linkedin_recommendations, linkedin_interests, linkedin_recruiting_activity, and the _preview variant of each. Omit for base fields only."}],"responses":{"200":{"description":"Recruiter-enriched profile. Returns the base profile shape plus the recruiting_profile enrichment. Section arrays under specifics (skills, experience, education, etc.) are only present when the corresponding with_sections value was requested. No inline quota — read from GET /v1/accounts/{account_id}. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","description":"A LinkedIn profile retrieved with Recruiter enrichment. Section arrays under specifics (skills, experience, education, etc.) are only present when the corresponding with_sections value was requested. No inline quota — read quota from GET /v1/accounts/{account_id}.","properties":{"object":{"type":"string","enum":["recruiter_profile"],"description":"Response type discriminator."},"id":{"type":"string","description":"The profile's opaque identifier."},"type":{"type":"string","enum":["individual","organization","other"],"description":"Profile type."},"display_name":{"type":"string","description":"The member's display name."},"provider":{"type":"string","enum":["linkedin"],"description":"Source platform."},"first_name":{"type":"string","description":"First name."},"last_name":{"type":"string","description":"Last name."},"public_identifier":{"type":"string","description":"LinkedIn public URL slug (e.g. 'jane-doe')."},"profile_url":{"type":"string","description":"Full LinkedIn profile URL."},"public_picture_url":{"type":"string","description":"Profile picture URL."},"public_picture_url_large":{"type":"string","description":"Large profile picture URL."},"description":{"type":"string","description":"Profile summary/about section. Passes through verbatim — never stored."},"location":{"type":"string","description":"Geographic location string."},"specifics":{"type":"object","description":"Structured profile-lens data, incl. connection distance and (when requested) section arrays.","properties":{"network_distance":{"type":"string","enum":["SELF","FIRST_DEGREE","SECOND_DEGREE","THIRD_DEGREE","OUT_OF_NETWORK"],"description":"Connection distance from the operator account."},"member_id":{"type":"string","description":"The member's platform-native ID."},"can_send_inmail":{"type":"boolean","description":"Whether an InMail can be sent to this member."},"is_open_profile":{"type":"boolean","description":"Whether the member has Open Profile enabled."},"is_premium":{"type":"boolean","description":"Whether the member has a LinkedIn Premium subscription."},"is_creator":{"type":"boolean","description":"Whether the member is a LinkedIn creator."},"is_hiring":{"type":"boolean","description":"Whether the member has hiring mode active."},"is_open_to_work":{"type":"boolean","description":"Whether the member has Open to Work enabled."},"skills":{"type":"array","description":"Skills entries. Present only when skills or linkedin_* was requested.","items":{"type":"object","additionalProperties":true}},"experience":{"type":"array","description":"Work experience entries. Present only when experience or linkedin_* was requested.","items":{"type":"object","additionalProperties":true}},"education":{"type":"array","description":"Education entries. Present only when education or linkedin_* was requested.","items":{"type":"object","additionalProperties":true}},"languages":{"type":"array","description":"Languages entries. Present only when languages or linkedin_* was requested.","items":{"type":"object","additionalProperties":true}},"certifications":{"type":"array","description":"Certification entries. Present only when certifications or linkedin_* was requested.","items":{"type":"object","additionalProperties":true}},"projects":{"type":"array","description":"Project entries. Present only when projects or linkedin_* was requested.","items":{"type":"object","additionalProperties":true}},"volunteering":{"type":"array","description":"Volunteering entries. Present only when volunteering or linkedin_* was requested.","items":{"type":"object","additionalProperties":true}},"recommendations":{"type":"array","description":"Recommendations entries. Present only when recommendations or linkedin_* was requested.","items":{"type":"object","additionalProperties":true}},"throttled_sections":{"type":"array","description":"Section names that were requested but throttled by LinkedIn.","items":{"type":"string"}}}},"recruiting_profile":{"type":"object","description":"Recruiter-only enrichment: notes, tags, and message-activity events. Passes through verbatim — never stored.","properties":{"notes":{"type":["string","null"],"description":"Recruiter notes on this candidate. Passes through — never stored."},"tags":{"type":"array","description":"Recruiter tags applied to this candidate.","items":{"type":"string"}},"events":{"type":"array","description":"Recruiter message-activity events for this candidate.","items":{"type":"object","properties":{"last_updated_at":{"type":"string","description":"ISO-8601 timestamp of the last update."},"last_updated_by":{"type":"string","description":"The seat member who last updated this event."},"message_content":{"type":"string","description":"Message text. Passes through — never stored."},"message_status":{"type":"string","description":"Message delivery/read status."}}}}}}},"required":["object","id","type","display_name","provider","recruiting_profile"]},"examples":{"baseFields":{"summary":"Profile — base fields (no with_sections requested)","value":{"object":"recruiter_profile","id":"ACo_rc_profile_001","type":"individual","display_name":"Jane Doe","provider":"linkedin","first_name":"Jane","last_name":"Doe","public_identifier":"jane-doe","profile_url":"https://www.linkedin.com/in/jane-doe","public_picture_url":"https://media.linkedin.com/dms/image/fake_rc_jane.jpg","location":"Berlin, Germany","specifics":{"network_distance":"SECOND_DEGREE","is_open_profile":false,"is_premium":true},"recruiting_profile":{"notes":"Strong backend candidate — follow up next sprint.","tags":["senior","backend"],"events":[]}}},"withSections":{"summary":"Profile — with sections (with_sections=linkedin_experience&with_sections=linkedin_education)","value":{"object":"recruiter_profile","id":"ACo_rc_profile_001","type":"individual","display_name":"Jane Doe","provider":"linkedin","first_name":"Jane","last_name":"Doe","public_identifier":"jane-doe","profile_url":"https://www.linkedin.com/in/jane-doe","public_picture_url":"https://media.linkedin.com/dms/image/fake_rc_jane.jpg","location":"Berlin, Germany","specifics":{"network_distance":"SECOND_DEGREE","is_open_profile":false,"is_premium":true,"experience":[{"company":"TechCorp","title":"Senior Software Engineer","started_on":"2021-01","ended_on":null}],"education":[{"school":"TU Berlin","degree":"MSc Computer Science"}],"skills":[],"languages":[],"certifications":[],"projects":[],"volunteering":[],"recommendations":[],"throttled_sections":[]},"recruiting_profile":{"notes":"Strong backend candidate — follow up next sprint.","tags":["senior","backend"],"events":[{"last_updated_at":"2026-06-01T10:00:00.000Z","last_updated_by":"seat_owner_001","message_content":"Reached out about the Platform Engineer role.","message_status":"SENT"}]}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an invalid with_sections value, or a request carrying a preset selector field (e.g. variant).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidSection":{"summary":"Invalid with_sections value","value":{"code":"INVALID_REQUEST","message":"with_sections contains an unrecognized value.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on (carries required_tier:'recruiter'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks an active Recruiter subscription. The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"RESOURCE_NOT_FOUND — the profile does not exist or is not visible to the operator account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Profile not found","value":{"code":"RESOURCE_NOT_FOUND","message":"Profile not found.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the connected LinkedIn account is restricted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account restricted","value":{"code":"ACCOUNT_RESTRICTED","message":"The connected LinkedIn account is restricted.","user_fixable":false,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many profile views.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Get a LinkedIn profile with Recruiter enrichment (recruiting_profile: notes, tags, events). The {user_id} is 'me', the target profile's public identifier, or a member ID. Request specific profile sections via with_sections (repeatable). Requires a Recruiter seat.","x-order":1}},"/v1/{account_id}/recruiter/chats":{"post":{"operationId":"postV1AccountIdRecruiterChats","tags":["Recruiter: Messaging"],"summary":"Start a chat (Recruiter)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat starts the chat."}],"responses":{"201":{"description":"Recruiter chat started. Returns the object discriminator, the chat_id, and the message_id of the opening message. Message content is never echoed back. The InMail daily quota is consumed; remaining capacity is read from GET /v1/accounts/{account_id}, never echoed here. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["chat_started"],"description":"Response type discriminator."},"chat_id":{"type":"string","description":"The newly created chat's identifier."},"message_id":{"type":"string","description":"The opening message identifier."}},"required":["object","chat_id","message_id"]},"examples":{"created":{"summary":"Recruiter chat started","value":{"object":"chat_started","chat_id":"chat_rec_fake_001","message_id":"msg_rec_fake_001"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — missing required fields, invalid enum, malformed follow_up, or malformed multipart payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidVisibility":{"summary":"Invalid visibility value","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for visibility.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on (carries required_tier:'recruiter'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Recruiter subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"413":{"description":"PAYLOAD_TOO_LARGE — an attachment exceeds 5 MiB, or the total body exceeds 8 MiB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Attachment too large","value":{"code":"PAYLOAD_TOO_LARGE","message":"An attachment exceeds the 5 MiB per-file limit.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"415":{"description":"Unsupported media type — the request must use application/json (multipart is not supported).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Wrong content type","value":{"code":"UNSUPPORTED_MEDIA_TYPE","message":"The request must be sent as application/json.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the recipient is unreachable, or the connected account is restricted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Recipient unreachable","value":{"code":"ACCOUNT_RESTRICTED","message":"The connected LinkedIn account is restricted.","user_fixable":false,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Send an opening InMail-style message to one or more Recruiter member IDs (AE… format). subject and signature are REQUIRED for Recruiter (InMail-based messaging). Accepts optional base64-encoded file / voice / video attachments (application/json only; multipart is not supported). Recruiter PRO: optionally schedule a follow-up. Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"attendees_ids":{"type":"array","items":{"type":"string"},"description":"One or more Recruiter member IDs (AE… format) to include in the chat."},"text":{"type":"string","description":"Opening message text (1–8000 chars). Passed to the platform and discarded; never stored or logged."},"subject":{"type":"string","description":"Subject line; REQUIRED for Recruiter (InMail-based messaging), unlike the classic surface (≤ 200 chars)."},"signature":{"type":"string","description":"Sender signature; REQUIRED for Recruiter. Not stored or logged."},"visibility":{"type":"string","enum":["PUBLIC","PRIVATE","PROJECT"],"description":"Visibility of the recruiter chat."},"intent":{"type":"string","enum":["HIRE_FOR_CLIENT","HIRE_FOR_OWN_COMPANY"],"description":"Whether this outreach is on behalf of a client or the operator's own company."},"send_as":{"type":"string","enum":["INMAIL","EMAIL"],"description":"Send the opening message as an InMail or as email."},"channel_type":{"type":"string","description":"Sourcing channel for tracking purposes (e.g. CAREER_SITE, MANUAL_IMPORT, INTERNAL_CANDIDATES, RECRUITER_SEARCH, REFERRAL; the vendor's own vocabulary is broader than this illustrative set, so any non-empty value is accepted rather than a closed enum)."},"follow_up":{"type":"object","properties":{"subject":{"type":"string","description":"Follow-up message subject. Not stored or logged."},"text":{"type":"string","description":"Follow-up message body. Not stored or logged."},"attachments":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string","description":"Base64-encoded file bytes."},"content_type":{"type":"string","description":"Attachment MIME type (e.g. image/png, audio/mp4)."},"filename":{"type":"string","description":"File name for the attachment."},"send_mode":{"type":"string","enum":["file","native"],"description":"'file' = a normal file attachment; 'native' = a platform-native voice/video bubble.","default":"file"},"metadata":{"type":"object","properties":{"duration":{"type":"integer","minimum":0,"description":"Duration in milliseconds; required for native voice/video."}},"description":"Extra attachment metadata (duration for native voice/video)."}},"required":["content","content_type","filename"]},"description":"Optional follow-up attachments."},"scheduled_for":{"oneOf":[{"type":"object","properties":{"days":{"type":"integer","minimum":3,"maximum":28,"description":"Number of days to delay the follow-up (3–28)."},"timezone":{"type":"string","description":"IANA timezone string, e.g. 'Europe/Paris'."}},"required":["days"]},{"type":"object","properties":{"weeks":{"type":"integer","minimum":1,"maximum":4,"description":"Number of weeks to delay the follow-up (1–4)."},"timezone":{"type":"string","description":"IANA timezone string, e.g. 'Europe/Paris'."}},"required":["weeks"]}],"description":"When to send the follow-up. Either { days: 3..28, timezone } or { weeks: 1..4, timezone }."}},"required":["subject","text","scheduled_for"],"description":"Recruiter PRO only: schedule a follow-up message. subject/text are not stored or logged."},"attachments":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string","description":"Base64-encoded file bytes."},"content_type":{"type":"string","description":"Attachment MIME type (e.g. image/png, audio/mp4)."},"filename":{"type":"string","description":"File name for the attachment."},"send_mode":{"type":"string","enum":["file","native"],"description":"'file' = a normal file attachment; 'native' = a platform-native voice/video bubble.","default":"file"},"metadata":{"type":"object","properties":{"duration":{"type":"integer","minimum":0,"description":"Duration in milliseconds; required for native voice/video."}},"description":"Extra attachment metadata (duration for native voice/video)."}},"required":["content","content_type","filename"]},"description":"Optional file / voice / video attachments (base64-encoded)."}},"required":["attendees_ids","text","subject","signature"]},"examples":{"basic":{"summary":"Open a Recruiter chat with one member","value":{"attendees_ids":["AE_recruiter_member_001"],"text":"Hi — I came across your profile and would love to connect about a role.","subject":"Senior Engineer opportunity","signature":"Jane Doe, Talent Partner"}},"withFollowUp":{"summary":"Open a chat and schedule a Recruiter PRO follow-up","value":{"attendees_ids":["AE_recruiter_member_001"],"text":"Hi — reaching out about a Senior Engineer role.","subject":"Senior Engineer opportunity","signature":"Jane Doe, Talent Partner","visibility":"PROJECT","follow_up":{"subject":"Following up","text":"Just circling back on my note above.","scheduled_for":{"days":5,"timezone":"Europe/Paris"}}}},"withAttachment":{"summary":"Attach a file (base64-encoded)","value":{"attendees_ids":["AE_recruiter_member_001"],"text":"Sending you a quick summary of the role.","subject":"Senior Engineer opportunity","signature":"Jane Doe, Talent Partner","attachments":[{"content":"aGVsbG8=","content_type":"application/pdf","filename":"role-summary.pdf","send_mode":"file"}]}}}}}},"x-order":2}},"/v1/{account_id}/recruiter/search/people":{"post":{"operationId":"postV1AccountIdRecruiterSearchPeople","tags":["Recruiter: Search"],"summary":"Search for people on the Recruiter surface.","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat performs the search."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"description":"Number of results to return (1–100). Defaults to 25."}],"responses":{"200":{"description":"Recruiter people search results, matching any supplied filters. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_people_search_result"],"description":"Response type discriminator."},"data":{"type":"array","description":"Matched Recruiter people.","items":{"type":"object","properties":{"visibility":{"type":"string","enum":["partial","full"],"description":"Profile detail level."},"id":{"type":"string","description":"Provider identifier."},"network_distance":{"type":"string","description":"SCREAMING_CASE network-distance enum."},"headline":{"type":"string","description":"Content — not stored."},"location":{"type":"string"},"can_send_inmail":{"type":"boolean"},"candidate_id":{"type":"string"},"is_hidden_candidate":{"type":"boolean"},"hiring_project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pipeline_stage":{"type":"string"}}},"work_experience":{"type":"array","items":{"type":"object","properties":{"company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"job_title":{"type":"string"},"started_on":{"type":"string"},"ended_on":{"type":"string"},"employment_type":{"type":"string"},"workplace_type":{"type":"string"}}}},"display_name":{"type":"string","description":"Content — not stored."},"public_identifier":{"type":"string"},"profile_url":{"type":"string"},"public_picture_url":{"type":"string"},"public_picture_url_large":{"type":"string"},"member_id":{"type":"string"},"industry":{"type":"string"},"relations_count":{"type":"number"},"followers_count":{"type":"number"},"summary":{"type":"string","description":"Content — not stored."},"emails":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"phone_numbers":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"endorsement_count":{"type":"number"}}}}},"required":["visibility","id","network_distance","candidate_id","is_hidden_candidate","work_experience"]}},"cursor":{"type":"string","description":"Opaque cursor for the next page. Absent when there are no more results."},"total_count":{"type":"number","description":"Total number of matching results, when the platform returns it."}},"required":["object","data"]},"examples":{"withResults":{"summary":"Recruiter people search results","value":{"object":"recruiter_people_search_result","data":[{"visibility":"partial","id":"ACoAA_abc","network_distance":"SECOND_DEGREE","candidate_id":"cand_abc123","is_hidden_candidate":false,"work_experience":[]}]}},"empty":{"summary":"No results","value":{"object":"recruiter_people_search_result","data":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Search LinkedIn members using Recruiter filters. The POST body carries the (all-optional) people-search filter set. Pagination is driven by the limit (1-100) and cursor query params. Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"string","description":"Free-text keyword search. Content, forwarded verbatim, never persisted."},"spotlights":{"type":"array","items":{"type":"string"},"description":"Filter by candidate spotlight tags."},"load_saved_search":{"type":"string","description":"Load filters from a saved search id."},"load_custom_filter":{"type":"string","description":"Load filters from a saved custom-filter id."},"save_search":{"type":"string","description":"Persist this search under a name on the LinkedIn side."},"save_custom_filter":{"type":"string","description":"Persist this filter set under a name on the LinkedIn side."},"network_distance":{"type":"array","items":{"type":"string"},"description":"Filter by network distance."},"location":{"type":"array","items":{"type":"string"},"description":"Resolved LOCATION parameter ids."},"postal_code":{"type":"string","description":"A postal code to search around."},"postal_code_radius":{"type":"number","minimum":0,"description":"Radius (in the substrate's own unit) around postal_code."},"job_title":{"type":"array","items":{"type":"string"},"description":"Resolved JOB_TITLE parameter ids."},"occupation":{"type":"array","items":{"type":"string"},"description":"Resolved OCCUPATION parameter ids."},"skills":{"type":"array","items":{"type":"string"},"description":"Resolved SKILL parameter ids."},"company":{"type":"array","items":{"type":"string"},"description":"Resolved COMPANY parameter ids."},"current_company":{"type":"array","items":{"type":"string"},"description":"Resolved CURRENT_COMPANY parameter ids."},"past_company":{"type":"array","items":{"type":"string"},"description":"Resolved company parameter ids for past employers."},"company_size":{"type":"array","items":{"type":"string"},"description":"Filter by company size bucket."},"years_of_experience":{"type":"array","items":{"type":"object","properties":{"min":{"type":"integer","minimum":0},"max":{"type":"integer","minimum":0}}},"description":"One or more {min?,max?} years-of-experience ranges."},"years_in_current_position":{"type":"array","items":{"type":"object","properties":{"min":{"type":"integer","minimum":0},"max":{"type":"integer","minimum":0}}},"description":"One or more {min?,max?} years-in-current-position ranges."},"years_in_current_company":{"type":"array","items":{"type":"object","properties":{"min":{"type":"integer","minimum":0},"max":{"type":"integer","minimum":0}}},"description":"One or more {min?,max?} years-in-current-company ranges."},"degree":{"type":"array","items":{"type":"string"},"description":"Resolved DEGREE parameter ids."},"workplace_type":{"type":"array","items":{"type":"string"},"description":"Filter by workplace type (e.g. ON_SITE, REMOTE, HYBRID)."},"school":{"type":"array","items":{"type":"string"},"description":"Resolved SCHOOL parameter ids."},"field_of_study":{"type":"array","items":{"type":"string"},"description":"Resolved FIELD_OF_STUDY parameter ids."},"employment_type":{"type":"array","items":{"type":"string"},"description":"Filter by employment type."},"graduation_year":{"type":"array","items":{"type":"integer"},"description":"Filter by one or more graduation years."},"industry":{"type":"array","items":{"type":"string"},"description":"Resolved INDUSTRY parameter ids."},"seniority":{"type":"array","items":{"type":"string"},"description":"Filter by seniority level."},"spoken_language":{"type":"array","items":{"type":"string"},"description":"Resolved SPOKEN_LANGUAGE parameter ids."},"profile_language":{"type":"array","items":{"type":"string"},"description":"Filter by the profile's display language."},"project":{"type":"string","description":"Resolved PROJECT parameter id."},"job_function":{"type":"array","items":{"type":"string"},"description":"Resolved JOB_FUNCTION parameter ids."},"first_name":{"type":"string","description":"Content, forwarded verbatim, never persisted."},"last_name":{"type":"string","description":"Content, forwarded verbatim, never persisted."},"recently_joined":{"type":"boolean","description":"Filter to members who recently joined LinkedIn."},"is_military_veteran":{"type":"boolean","description":"Filter to members who self-identify as military veterans."},"recruiting_activity":{"type":"object","properties":{"include":{"type":"object","properties":{"timespan":{"type":"string"},"activity_types":{"type":"array","items":{"type":"string"}}}},"exclude":{"type":"object","properties":{"timespan":{"type":"string"},"activity_types":{"type":"array","items":{"type":"string"}}}}},"description":"Include/exclude by recent recruiting activity."},"hide_previously_viewed":{"type":"boolean","description":"Exclude profiles already viewed."},"group":{"type":"array","items":{"type":"string"},"description":"Resolved GROUP parameter ids."},"is_past_applicant":{"type":"boolean","description":"Filter to members who previously applied."},"notes":{"type":"string","description":"Content, forwarded verbatim, never persisted."},"tags":{"type":"array","items":{"type":"string"},"description":"Resolved TAG parameter ids."}}},"examples":{"basic":{"summary":"Keyword search","value":{"keywords":"backend engineer","seniority":["senior"]}}}}}},"x-order":3}},"/v1/{account_id}/recruiter/search/parameters":{"post":{"operationId":"postV1AccountIdRecruiterSearchParameters","tags":["Recruiter: Search"],"summary":"Resolve search-filter IDs (Recruiter)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat resolves the parameters."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Zero-based pagination offset. Defaults to 0."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Number of parameter items to return (1–100). Defaults to 10."}],"responses":{"200":{"description":"Resolved Recruiter filter parameter ids. Pass the returned id values in structured filter arrays on the ops that reference this filter family (pipeline, search, applicants).","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_search_parameter_list"],"description":"Response type discriminator."},"data":{"type":"array","description":"Resolved filter items.","items":{"type":"object","description":"A single resolved Recruiter search filter parameter. Maps an opaque id to a human-readable name.","properties":{"object":{"type":"string","enum":["recruiter_search_parameter"],"description":"Response type discriminator."},"id":{"type":"string","description":"Opaque filter id to pass in structured filter arrays on ops that reference this filter family."},"name":{"type":"string","description":"Human-readable filter label. Content — passed through, never stored."},"metadata":{"type":"object","description":"Free-form filter metadata. Pass-through — only present when the platform returns it.","additionalProperties":true}},"required":["object","id","name"]}},"cursor":{"type":"string","description":"Opaque cursor for the next page. Only present when the platform returns one."},"total_count":{"type":"number","description":"Total number of matching parameters, when the platform returns it."}},"required":["object","data"]},"examples":{"pipeline":{"summary":"PIPELINE / SEAT resolution","value":{"object":"recruiter_search_parameter_list","data":[{"object":"recruiter_search_parameter","id":"seat_001","name":"Jane Doe"},{"object":"recruiter_search_parameter","id":"seat_002","name":"John Smith"}]}},"search":{"summary":"SEARCH / LOCATION resolution","value":{"object":"recruiter_search_parameter_list","data":[{"object":"recruiter_search_parameter","id":"loc_001","name":"Berlin, Germany"}]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — source is missing or unrecognized, type is not a valid value for the given source, or project_id is required for this source (PIPELINE, APPLICANTS) but was omitted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missingSource":{"summary":"source missing or unrecognized","value":{"code":"INVALID_REQUEST","message":"Invalid discriminator value. Expected 'APPLICANTS' | 'PIPELINE' | 'SEARCH' | 'JOB_POSTING' | 'JOBS'","user_fixable":true,"retry_likely_to_succeed":false}},"invalidType":{"summary":"type not valid for this source","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for type.","user_fixable":true,"retry_likely_to_succeed":false}},"missingProjectId":{"summary":"project_id required for PIPELINE/APPLICANTS","value":{"code":"INVALID_REQUEST","message":"Required","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on (carries required_tier:'recruiter'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account does not have an active Recruiter subscription. The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id supplied in the body (PIPELINE, APPLICANTS) does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Slow down and retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically a temporary condition.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Resolve human-readable terms to opaque Recruiter filter ids for use in pipeline, search, and applicant requests. The request body is a discriminated union on source: APPLICANTS and PIPELINE require project_id (a bad or missing project_id on these sources returns 404/400 respectively); SEARCH, JOB_POSTING, and JOBS do not take project_id. Each source has its own type enum — an out-of-family type value is rejected with 400 before any external call. Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"APPLICANTS"},"project_id":{"type":"string","description":"The Recruiter project whose applicant filters are resolved."},"type":{"type":"string","enum":["SKILL","LOCATION","JOB_TITLE","JOB_FUNCTION","COMPANY","CURRENT_COMPANY","INDUSTRY","FIELD_OF_STUDY","DEGREE","TAG","SPOKEN_LANGUAGE"]},"keywords":{"type":"string"}},"required":["source","project_id","type"],"title":"APPLICANTS"},{"type":"object","properties":{"source":{"type":"string","const":"PIPELINE"},"project_id":{"type":"string","description":"The Recruiter project whose pipeline filters are resolved."},"type":{"type":"string","enum":["SEAT","SKILL","CURRENT_COMPANY","JOB_TITLE","LOCATION"]},"stage_id":{"type":"string","description":"Filter to a single pipeline stage id."},"keywords":{"type":"string"}},"required":["source","project_id","type"],"title":"PIPELINE"},{"type":"object","properties":{"source":{"type":"string","enum":["SEARCH","JOB_POSTING"]},"type":{"type":"string","enum":["OCCUPATION","JOB_TITLE","JOB_FUNCTION","LOCATION","ZIPCODE","SKILL","COMPANY","SCHOOL","INDUSTRY","GROUP","PROJECT","CUSTOM_FILTER","PROFILE_LANGUAGE","SEAT","SAVED_SEARCH","DEGREE"]},"keywords":{"type":"string"}},"required":["source","type"],"title":"SEARCH"},{"type":"object","properties":{"source":{"type":"string","const":"JOBS"},"type":{"type":"string","enum":["CONTRACT","SEAT","LOCATION"]},"keywords":{"type":"string"}},"required":["source","type"],"title":"JOBS"}],"discriminator":{"propertyName":"source","mapping":{"APPLICANTS":"#/oneOf/0","PIPELINE":"#/oneOf/1","SEARCH":"#/oneOf/2","JOB_POSTING":"#/oneOf/2","JOBS":"#/oneOf/3"}}},"examples":{"pipeline":{"summary":"PIPELINE — resolve SEAT ids in a project's pipeline","value":{"source":"PIPELINE","project_id":"proj_abc123","type":"SEAT"}},"applicants":{"summary":"APPLICANTS — resolve TAG ids for a project's talent pool","value":{"source":"APPLICANTS","project_id":"proj_abc123","type":"TAG","keywords":"x"}},"search":{"summary":"SEARCH — resolve LOCATION ids (no project_id)","value":{"source":"SEARCH","type":"LOCATION"}},"jobs":{"summary":"JOBS — resolve CONTRACT ids","value":{"source":"JOBS","type":"CONTRACT"}}}}}},"x-order":4}},"/v1/{account_id}/recruiter/projects":{"get":{"operationId":"getV1AccountIdRecruiterProjects","tags":["Recruiter: Projects"],"summary":"List Recruiter projects","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat lists the projects."},{"name":"status","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["ACTIVE","CLOSED","DRAFT","REVIEW"]}},"description":"Filter by project status (repeatable, flat). One or more of: ACTIVE, CLOSED, DRAFT, REVIEW."},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","enum":["LAST_USED_BY_ME","MOST_USED_BY_ME","LAST_VIEWED_BY_ME","NEWEST_TO_OLDEST","OLDEST_TO_NEWEST","ALPHABETICAL","REVERSE_ALPHABETICAL"]},"description":"Field to sort results by. Defaults to LAST_USED_BY_ME."},{"name":"keywords","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by project name (content, forwarded verbatim, never persisted)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Number of projects to return (1–100). Defaults to 10."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."}],"responses":{"200":{"description":"List of Recruiter projects visible to the account. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_project_list"],"description":"Response type discriminator."},"data":{"type":"array","description":"Project items — the full recruiter_project shape.","items":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_project"],"description":"Response type discriminator."},"id":{"type":"string","description":"Unique project identifier."},"name":{"type":"string","description":"Project name. Content — not stored."},"readonly":{"type":"boolean","description":"Whether the project is read-only for this account."},"created_at":{"type":"string","description":"ISO 8601 timestamp when the project was created."},"last_modified_at":{"type":"string","description":"ISO 8601 timestamp of the last modification."},"visibility":{"type":"string","enum":["PRIVATE","SHARED"],"description":"Project visibility."},"owner":{"type":"object","properties":{"id":{"type":"string","description":"Platform identifier of the project owner."},"seat_id":{"type":"string","description":"The owner's Recruiter seat identifier."},"name":{"type":"string","description":"Owner display name. Content — not stored."},"email":{"type":"string","description":"Owner email address."},"profile_url":{"type":"string","description":"Owner profile URL."},"profile_headline":{"type":"string","description":"Owner headline. Content — not stored."},"public_picture_url":{"type":"string","description":"Owner profile picture URL."}},"required":["id","seat_id","name","email","profile_url","profile_headline"]},"metadata":{"type":"object","properties":{"locations":{"type":"array","items":{"type":"string"},"description":"Target locations."},"industries":{"type":"array","items":{"type":"string"},"description":"Target industries."},"job_title":{"type":"string","description":"Target job title."},"job_posting_id":{"type":"string","description":"Linked job posting ID, when the project has one."},"seniority_level":{"type":"string","description":"Target seniority level."},"employment_type":{"type":"string","description":"Target employment type."},"company":{"type":"string","description":"Target company."}},"required":["locations","industries"]},"talent_pool":{"type":"object","properties":{"channels":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Talent-pool channel identifier."},"name":{"type":"string","description":"Talent-pool channel name."}},"required":["id","name"]},"description":"Talent-pool channels."}},"required":["channels"]},"pipeline":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Whether the pipeline is enabled for this project."},"name":{"type":"string","description":"Pipeline name."},"description":{"type":"string","description":"Pipeline description. Content — not stored."},"created_at":{"type":"string","description":"ISO 8601 timestamp."},"last_modified_at":{"type":"string","description":"ISO 8601 timestamp."},"stages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Pipeline stage identifier."},"name":{"type":"string","description":"Pipeline stage name."}},"required":["id","name"]},"description":"Pipeline stages."}},"required":["enabled","name","description","created_at","last_modified_at","stages"]},"last_accessed_at":{"type":"string","description":"ISO 8601 timestamp of the account's last access, when known."}},"required":["object","id","name","readonly","created_at","last_modified_at","visibility","owner","metadata","talent_pool","pipeline"]}},"cursor":{"type":"string","description":"Opaque cursor for the next page. Absent when there are no more results."},"total_count":{"type":"number","description":"Total number of projects, when the platform returns it."}},"required":["object","data"]},"examples":{"withProjects":{"summary":"Recruiter projects list","value":{"object":"recruiter_project_list","data":[{"object":"recruiter_project","id":"proj_abc123","name":"Senior Engineer Search","readonly":false,"created_at":"2026-01-15T10:00:00.000Z","last_modified_at":"2026-01-20T10:00:00.000Z","visibility":"PRIVATE","owner":{"id":"urn:li:member:recruiter_11111","seat_id":"seat_11111","name":"Jane Recruiter","email":"jane.recruiter@example.com","profile_url":"https://www.linkedin.com/in/jane-recruiter","profile_headline":"Technical Recruiter"},"metadata":{"locations":["Berlin, Germany"],"industries":["Technology, Information and Internet"]},"talent_pool":{"channels":[]},"pipeline":{"enabled":true,"name":"Senior Engineer Search — pipeline","description":"Default pipeline.","created_at":"2026-01-15T10:00:00.000Z","last_modified_at":"2026-01-20T10:00:00.000Z","stages":[{"id":"stage_uncontacted","name":"Uncontacted"}]}}],"total_count":1}},"empty":{"summary":"No recruiter projects","value":{"object":"recruiter_project_list","data":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"List Recruiter projects visible to the account. Supports filtering by status and keywords, sorting, and opaque cursor-based pagination. Requires a Recruiter seat.","x-order":5}},"/v1/{account_id}/recruiter/projects/{project_id}":{"get":{"operationId":"getV1AccountIdRecruiterProjectsProjectId","tags":["Recruiter: Projects"],"summary":"Get one Recruiter project","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat resolves the project."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."}],"responses":{"200":{"description":"A single Recruiter project — the full recruiter_project shape. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_project"],"description":"Response type discriminator."},"id":{"type":"string","description":"Unique project identifier."},"name":{"type":"string","description":"Project name. Content — not stored."},"readonly":{"type":"boolean","description":"Whether the project is read-only for this account."},"created_at":{"type":"string","description":"ISO 8601 timestamp when the project was created."},"last_modified_at":{"type":"string","description":"ISO 8601 timestamp of the last modification."},"visibility":{"type":"string","enum":["PRIVATE","SHARED"],"description":"Project visibility."},"owner":{"type":"object","properties":{"id":{"type":"string","description":"Platform identifier of the project owner."},"seat_id":{"type":"string","description":"The owner's Recruiter seat identifier."},"name":{"type":"string","description":"Owner display name. Content — not stored."},"email":{"type":"string","description":"Owner email address."},"profile_url":{"type":"string","description":"Owner profile URL."},"profile_headline":{"type":"string","description":"Owner headline. Content — not stored."},"public_picture_url":{"type":"string","description":"Owner profile picture URL."}},"required":["id","seat_id","name","email","profile_url","profile_headline"]},"metadata":{"type":"object","properties":{"locations":{"type":"array","items":{"type":"string"},"description":"Target locations."},"industries":{"type":"array","items":{"type":"string"},"description":"Target industries."},"job_title":{"type":"string","description":"Target job title."},"job_posting_id":{"type":"string","description":"Linked job posting ID, when the project has one."},"seniority_level":{"type":"string","description":"Target seniority level."},"employment_type":{"type":"string","description":"Target employment type."},"company":{"type":"string","description":"Target company."}},"required":["locations","industries"]},"talent_pool":{"type":"object","properties":{"channels":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Talent-pool channel identifier."},"name":{"type":"string","description":"Talent-pool channel name."}},"required":["id","name"]},"description":"Talent-pool channels."}},"required":["channels"]},"pipeline":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Whether the pipeline is enabled for this project."},"name":{"type":"string","description":"Pipeline name."},"description":{"type":"string","description":"Pipeline description. Content — not stored."},"created_at":{"type":"string","description":"ISO 8601 timestamp."},"last_modified_at":{"type":"string","description":"ISO 8601 timestamp."},"stages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Pipeline stage identifier."},"name":{"type":"string","description":"Pipeline stage name."}},"required":["id","name"]},"description":"Pipeline stages."}},"required":["enabled","name","description","created_at","last_modified_at","stages"]},"last_accessed_at":{"type":"string","description":"ISO 8601 timestamp of the account's last access, when known."}},"required":["object","id","name","readonly","created_at","last_modified_at","visibility","owner","metadata","talent_pool","pipeline"]},"examples":{"project":{"summary":"Recruiter project","value":{"object":"recruiter_project","id":"proj_abc123","name":"Senior Engineer Search","readonly":false,"created_at":"2026-01-15T10:00:00.000Z","last_modified_at":"2026-01-20T10:00:00.000Z","visibility":"PRIVATE","owner":{"id":"urn:li:member:recruiter_11111","seat_id":"seat_11111","name":"Jane Recruiter","email":"jane.recruiter@example.com","profile_url":"https://www.linkedin.com/in/jane-recruiter","profile_headline":"Technical Recruiter"},"metadata":{"locations":["Berlin, Germany"],"industries":["Technology, Information and Internet"]},"talent_pool":{"channels":[]},"pipeline":{"enabled":true,"name":"Senior Engineer Search — pipeline","description":"Default pipeline.","created_at":"2026-01-15T10:00:00.000Z","last_modified_at":"2026-01-20T10:00:00.000Z","stages":[{"id":"stage_uncontacted","name":"Uncontacted"}]}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Retrieve a single Recruiter project by ID — the full recruiter_project shape (owner, metadata, talent_pool, pipeline). Unknown project_id returns 404 RESOURCE_NOT_FOUND. Requires a Recruiter seat.","x-order":6},"patch":{"operationId":"patchV1AccountIdRecruiterProjectsProjectId","tags":["Recruiter: Projects"],"summary":"Edit a Recruiter project","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat edits the project."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."}],"responses":{"200":{"description":"The project was edited. Thin acknowledgement only — no echoed project. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_project_edited"],"description":"Response type discriminator."}},"required":["object"]},"examples":{"edited":{"summary":"Project edited","value":{"object":"recruiter_project_edited"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Edit a Recruiter project's config (name, visibility, description, target company/job title/location/seniority). All fields optional — omitted fields are left unchanged. Returns a thin acknowledgement only (no echoed project). Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"New project name. Content; not stored."},"visibility":{"type":"string","enum":["PRIVATE","PUBLIC"],"description":"New project visibility: PRIVATE or PUBLIC."},"description":{"type":"string","description":"New project description. Content; not stored."},"company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"description":"Target company (by id or free-text name)."},"job_title":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"description":"Target job title (resolved id + display name)."},"location":{"type":"string","description":"A LOCATION parameter id (resolve via search/parameters)."},"seniority_level":{"type":"string","enum":["INTERNSHIP","ENTRY_LEVEL","ASSOCIATE","MID_SENIOR_LEVEL","DIRECTOR","EXECUTIVE","NOT_APPLICABLE"],"description":"Target seniority level."}}},"examples":{"rename":{"summary":"Rename a project","value":{"name":"Q3 Backend Hiring"}},"updateTarget":{"summary":"Update the target job title and seniority level","value":{"job_title":{"id":"title_123","name":"Senior Backend Engineer"},"seniority_level":"MID_SENIOR_LEVEL"}}}}}},"x-order":7}},"/v1/{account_id}/recruiter/projects/{project_id}/pipeline":{"post":{"operationId":"postV1AccountIdRecruiterProjectsProjectIdPipeline","tags":["Recruiter: Projects"],"summary":"List pipeline candidates","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat lists the pipeline."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":5000,"default":25},"description":"Number of pipeline candidates to return (1–5000). Defaults to 25."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."}],"responses":{"200":{"description":"List of candidates in the project's pipeline, matching any supplied filters. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_pipeline_candidate_list"],"description":"Response type discriminator."},"data":{"type":"array","description":"Pipeline candidate items.","items":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_pipeline_candidate"],"description":"Response type discriminator."},"candidate_id":{"type":"string"},"is_hidden_candidate":{"type":"boolean"},"hiring_project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pipeline_stage":{"type":"string"}}},"profile":{"type":"object","properties":{"visibility":{"type":"string","enum":["partial","full"],"description":"Profile detail level."},"id":{"type":"string","description":"Provider identifier."},"network_distance":{"type":"string","description":"SCREAMING_CASE network-distance enum."},"headline":{"type":"string","description":"Content — not stored."},"location":{"type":"string"},"can_send_inmail":{"type":"boolean"},"candidate_id":{"type":"string"},"is_hidden_candidate":{"type":"boolean"},"hiring_project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pipeline_stage":{"type":"string"}}},"work_experience":{"type":"array","items":{"type":"object","properties":{"company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"job_title":{"type":"string"},"started_on":{"type":"string"},"ended_on":{"type":"string"},"employment_type":{"type":"string"},"workplace_type":{"type":"string"}}}},"display_name":{"type":"string","description":"Content — not stored."},"public_identifier":{"type":"string"},"profile_url":{"type":"string"},"public_picture_url":{"type":"string"},"public_picture_url_large":{"type":"string"},"member_id":{"type":"string"},"industry":{"type":"string"},"relations_count":{"type":"number"},"followers_count":{"type":"number"},"summary":{"type":"string","description":"Content — not stored."},"emails":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"phone_numbers":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"endorsement_count":{"type":"number"}}}}},"required":["visibility","id","network_distance","candidate_id","is_hidden_candidate","work_experience"]}},"required":["object","candidate_id","is_hidden_candidate","profile"]}},"cursor":{"type":"string","description":"Opaque cursor for the next page. Absent when there are no more results."},"total_count":{"type":"number","description":"Total number of matching candidates, when the platform returns it."}},"required":["object","data"]},"examples":{"withCandidates":{"summary":"Pipeline candidates","value":{"object":"recruiter_pipeline_candidate_list","data":[{"object":"recruiter_pipeline_candidate","candidate_id":"cand_abc123","is_hidden_candidate":false,"profile":{"visibility":"partial","id":"ACoAA_abc","network_distance":"SECOND_DEGREE","candidate_id":"cand_abc123","is_hidden_candidate":false,"work_experience":[]}}]}},"empty":{"summary":"No candidates","value":{"object":"recruiter_pipeline_candidate_list","data":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"List candidates in a Recruiter project's pipeline. A POST body carries the (all-optional) filter set — keywords, stage, sort, spotlights, recruiting activity, skills, experience, and more. Pagination is driven by the limit (1-5000) and cursor query params. Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"string"},"stage_id":{"type":"string","description":"Filter to a single pipeline stage id."},"sort_by":{"type":"string","enum":["LAST_MODIFIED","ALPHABETICAL"],"description":"Sort field. One of: LAST_MODIFIED, ALPHABETICAL."},"spotlights":{"type":"array","items":{"type":"string","enum":["OPEN_TO_WORK","ACTIVE_TALENT","MISSED_CANDIDATES"]},"description":"Filter by candidate spotlight. One or more of: OPEN_TO_WORK, ACTIVE_TALENT, MISSED_CANDIDATES."},"recruiting_activity":{"type":"object","properties":{"include":{"type":"object","properties":{"timespan":{"type":"string"},"activity_types":{"type":"array","items":{"type":"string"}}}},"exclude":{"type":"object","properties":{"timespan":{"type":"string"},"activity_types":{"type":"array","items":{"type":"string"}}}}},"description":"Include/exclude by recent recruiting activity."},"added_by":{"type":"array","items":{"type":"string"},"description":"Filter by the recruiter(s) who added the candidate."},"skills":{"type":"array","items":{"type":"string"},"description":"Filter by resolved skill parameter ids."},"years_of_experience":{"type":"array","items":{"type":"object","properties":{"min":{"type":"integer","minimum":0},"max":{"type":"integer","minimum":0}}},"description":"Filter by one or more {min?,max?} years-of-experience ranges."},"job_title":{"type":"array","items":{"type":"string"},"description":"Filter by resolved job-title parameter ids."},"current_company":{"type":"array","items":{"type":"string"},"description":"Filter by resolved company parameter ids."},"current_location":{"type":"array","items":{"type":"string"},"description":"Filter by resolved location parameter ids."}}},"examples":{"allCandidates":{"summary":"List every candidate in the pipeline (no filters)","value":{}},"filtered":{"summary":"Filter by stage and spotlight","value":{"stage_id":"stage_1","spotlights":["OPEN_TO_WORK"],"sort_by":"LAST_MODIFIED"}}}}}},"x-order":8}},"/v1/{account_id}/recruiter/projects/{project_id}/talent-pool/search":{"post":{"operationId":"postV1AccountIdRecruiterProjectsProjectIdTalentPoolSearch","tags":["Recruiter: Search"],"summary":"Search a project's talent pool","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat performs the search."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"description":"Number of results to return (1–100). Defaults to 25."}],"responses":{"200":{"description":"Talent-pool search results, matching any supplied filters. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_people_search_result"],"description":"Response type discriminator."},"data":{"type":"array","description":"Talent-pool search result items.","items":{"type":"object","properties":{"visibility":{"type":"string","enum":["partial","full"],"description":"Profile detail level."},"id":{"type":"string","description":"Provider identifier."},"network_distance":{"type":"string","description":"SCREAMING_CASE network-distance enum."},"headline":{"type":"string","description":"Content — not stored."},"location":{"type":"string"},"can_send_inmail":{"type":"boolean"},"candidate_id":{"type":"string"},"is_hidden_candidate":{"type":"boolean"},"hiring_project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pipeline_stage":{"type":"string"}}},"work_experience":{"type":"array","items":{"type":"object","properties":{"company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"job_title":{"type":"string"},"started_on":{"type":"string"},"ended_on":{"type":"string"},"employment_type":{"type":"string"},"workplace_type":{"type":"string"}}}},"display_name":{"type":"string","description":"Content — not stored."},"public_identifier":{"type":"string"},"profile_url":{"type":"string"},"public_picture_url":{"type":"string"},"public_picture_url_large":{"type":"string"},"member_id":{"type":"string"},"industry":{"type":"string"},"relations_count":{"type":"number"},"followers_count":{"type":"number"},"summary":{"type":"string","description":"Content — not stored."},"emails":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"phone_numbers":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"endorsement_count":{"type":"number"}}}}},"required":["visibility","id","network_distance","candidate_id","is_hidden_candidate","work_experience"]}},"cursor":{"type":"string","description":"Opaque cursor for the next page. Absent when there are no more results."},"total_count":{"type":"number","description":"Total number of matching results, when the platform returns it."}},"required":["object","data"]},"examples":{"withResults":{"summary":"Talent-pool search results","value":{"object":"recruiter_people_search_result","data":[{"visibility":"partial","id":"ACoAA_abc","network_distance":"SECOND_DEGREE","candidate_id":"cand_abc123","is_hidden_candidate":false,"work_experience":[]}]}},"empty":{"summary":"No results","value":{"object":"recruiter_people_search_result","data":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Search a Recruiter project's talent pool. A POST body carries the required channel_id (the project's own RECRUITER_SEARCH talent-pool channel — read it off talent_pool.channels[] of GET …/recruiter/projects/{project_id}) plus the (all-optional) people-search filter set. Pagination is driven by the limit (1-100) and cursor query params. Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"string","description":"Free-text keyword search. Content, forwarded verbatim, never persisted."},"spotlights":{"type":"array","items":{"type":"string"},"description":"Filter by candidate spotlight tags."},"load_saved_search":{"type":"string","description":"Load filters from a saved search id."},"load_custom_filter":{"type":"string","description":"Load filters from a saved custom-filter id."},"save_search":{"type":"string","description":"Persist this search under a name on the LinkedIn side."},"save_custom_filter":{"type":"string","description":"Persist this filter set under a name on the LinkedIn side."},"network_distance":{"type":"array","items":{"type":"string"},"description":"Filter by network distance."},"location":{"type":"array","items":{"type":"string"},"description":"Resolved LOCATION parameter ids."},"postal_code":{"type":"string","description":"A postal code to search around."},"postal_code_radius":{"type":"number","minimum":0,"description":"Radius (in the substrate's own unit) around postal_code."},"job_title":{"type":"array","items":{"type":"string"},"description":"Resolved JOB_TITLE parameter ids."},"occupation":{"type":"array","items":{"type":"string"},"description":"Resolved OCCUPATION parameter ids."},"skills":{"type":"array","items":{"type":"string"},"description":"Resolved SKILL parameter ids."},"company":{"type":"array","items":{"type":"string"},"description":"Resolved COMPANY parameter ids."},"current_company":{"type":"array","items":{"type":"string"},"description":"Resolved CURRENT_COMPANY parameter ids."},"past_company":{"type":"array","items":{"type":"string"},"description":"Resolved company parameter ids for past employers."},"company_size":{"type":"array","items":{"type":"string"},"description":"Filter by company size bucket."},"years_of_experience":{"type":"array","items":{"type":"object","properties":{"min":{"type":"integer","minimum":0},"max":{"type":"integer","minimum":0}}},"description":"One or more {min?,max?} years-of-experience ranges."},"years_in_current_position":{"type":"array","items":{"type":"object","properties":{"min":{"type":"integer","minimum":0},"max":{"type":"integer","minimum":0}}},"description":"One or more {min?,max?} years-in-current-position ranges."},"years_in_current_company":{"type":"array","items":{"type":"object","properties":{"min":{"type":"integer","minimum":0},"max":{"type":"integer","minimum":0}}},"description":"One or more {min?,max?} years-in-current-company ranges."},"degree":{"type":"array","items":{"type":"string"},"description":"Resolved DEGREE parameter ids."},"workplace_type":{"type":"array","items":{"type":"string"},"description":"Filter by workplace type (e.g. ON_SITE, REMOTE, HYBRID)."},"school":{"type":"array","items":{"type":"string"},"description":"Resolved SCHOOL parameter ids."},"field_of_study":{"type":"array","items":{"type":"string"},"description":"Resolved FIELD_OF_STUDY parameter ids."},"employment_type":{"type":"array","items":{"type":"string"},"description":"Filter by employment type."},"graduation_year":{"type":"array","items":{"type":"integer"},"description":"Filter by one or more graduation years."},"industry":{"type":"array","items":{"type":"string"},"description":"Resolved INDUSTRY parameter ids."},"seniority":{"type":"array","items":{"type":"string"},"description":"Filter by seniority level."},"spoken_language":{"type":"array","items":{"type":"string"},"description":"Resolved SPOKEN_LANGUAGE parameter ids."},"profile_language":{"type":"array","items":{"type":"string"},"description":"Filter by the profile's display language."},"project":{"type":"string","description":"Resolved PROJECT parameter id."},"job_function":{"type":"array","items":{"type":"string"},"description":"Resolved JOB_FUNCTION parameter ids."},"first_name":{"type":"string","description":"Content, forwarded verbatim, never persisted."},"last_name":{"type":"string","description":"Content, forwarded verbatim, never persisted."},"recently_joined":{"type":"boolean","description":"Filter to members who recently joined LinkedIn."},"is_military_veteran":{"type":"boolean","description":"Filter to members who self-identify as military veterans."},"recruiting_activity":{"type":"object","properties":{"include":{"type":"object","properties":{"timespan":{"type":"string"},"activity_types":{"type":"array","items":{"type":"string"}}}},"exclude":{"type":"object","properties":{"timespan":{"type":"string"},"activity_types":{"type":"array","items":{"type":"string"}}}}},"description":"Include/exclude by recent recruiting activity."},"hide_previously_viewed":{"type":"boolean","description":"Exclude profiles already viewed."},"group":{"type":"array","items":{"type":"string"},"description":"Resolved GROUP parameter ids."},"is_past_applicant":{"type":"boolean","description":"Filter to members who previously applied."},"notes":{"type":"string","description":"Content, forwarded verbatim, never persisted."},"tags":{"type":"array","items":{"type":"string"},"description":"Resolved TAG parameter ids."},"channel_id":{"type":"string","description":"The project's RECRUITER_SEARCH talent-pool channel id. Read it off talent_pool.channels[] of GET .../recruiter/projects/{project_id}."}},"required":["channel_id"]},"examples":{"basic":{"summary":"Keyword search in the talent pool","value":{"channel_id":"chan_abc123","keywords":"backend engineer"}}}}}},"x-order":9}},"/v1/{account_id}/recruiter/search":{"post":{"operationId":"postV1AccountIdRecruiterSearch","tags":["Recruiter: Search"],"summary":"Search from a pasted Recruiter URL","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat performs the search."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":5000,"default":25},"description":"Number of results to return (1–5000; the effective cap depends on the URL kind). Defaults to 25."}],"responses":{"200":{"description":"One of three branches, determined by the pasted URL's own kind: recruiter_people_search_result (people/search URL), recruiter_job_applicant_list (applicant/pipeline-channel URL), or recruiter_pipeline_candidate_list (talent-pool/pipeline-view URL, added 2026-07-09 — SDK cross-check). Requires a Recruiter seat.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"RecruiterPeopleSearchResult","properties":{"object":{"type":"string","enum":["recruiter_people_search_result"]},"data":{"type":"array","items":{"type":"object","properties":{"visibility":{"type":"string","enum":["partial","full"],"description":"Profile detail level."},"id":{"type":"string","description":"Provider identifier."},"network_distance":{"type":"string","description":"SCREAMING_CASE network-distance enum."},"headline":{"type":"string","description":"Content — not stored."},"location":{"type":"string"},"can_send_inmail":{"type":"boolean"},"candidate_id":{"type":"string"},"is_hidden_candidate":{"type":"boolean"},"hiring_project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pipeline_stage":{"type":"string"}}},"work_experience":{"type":"array","items":{"type":"object","properties":{"company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"job_title":{"type":"string"},"started_on":{"type":"string"},"ended_on":{"type":"string"},"employment_type":{"type":"string"},"workplace_type":{"type":"string"}}}},"display_name":{"type":"string","description":"Content — not stored."},"public_identifier":{"type":"string"},"profile_url":{"type":"string"},"public_picture_url":{"type":"string"},"public_picture_url_large":{"type":"string"},"member_id":{"type":"string"},"industry":{"type":"string"},"relations_count":{"type":"number"},"followers_count":{"type":"number"},"summary":{"type":"string","description":"Content — not stored."},"emails":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"phone_numbers":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"endorsement_count":{"type":"number"}}}}},"required":["visibility","id","network_distance","candidate_id","is_hidden_candidate","work_experience"]}},"cursor":{"type":"string"},"total_count":{"type":"number"}},"required":["object","data"]},{"type":"object","title":"RecruiterJobApplicantList","properties":{"object":{"type":"string","enum":["recruiter_job_applicant_list"]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"applied_at":{"type":"string","description":"ISO-8601 timestamp."},"has_resume":{"type":"boolean"},"screening_questions":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","description":"Content — not stored."},"has_succedeed":{"type":"boolean","description":"sic — verbatim wire key."},"is_eliminatory":{"type":"boolean"},"answers":{"type":"array","items":{"type":"string"}}}}},"profile":{"type":"object","properties":{"visibility":{"type":"string","enum":["partial","full"],"description":"Profile detail level."},"id":{"type":"string","description":"Provider identifier."},"network_distance":{"type":"string","description":"SCREAMING_CASE network-distance enum."},"headline":{"type":"string","description":"Content — not stored."},"location":{"type":"string"},"can_send_inmail":{"type":"boolean"},"candidate_id":{"type":"string"},"is_hidden_candidate":{"type":"boolean"},"hiring_project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pipeline_stage":{"type":"string"}}},"work_experience":{"type":"array","items":{"type":"object","properties":{"company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"job_title":{"type":"string"},"started_on":{"type":"string"},"ended_on":{"type":"string"},"employment_type":{"type":"string"},"workplace_type":{"type":"string"}}}},"display_name":{"type":"string","description":"Content — not stored."},"public_identifier":{"type":"string"},"profile_url":{"type":"string"},"public_picture_url":{"type":"string"},"public_picture_url_large":{"type":"string"},"member_id":{"type":"string"},"industry":{"type":"string"},"relations_count":{"type":"number"},"followers_count":{"type":"number"},"summary":{"type":"string","description":"Content — not stored."},"emails":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"phone_numbers":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"endorsement_count":{"type":"number"}}}}},"required":["visibility","id","network_distance","candidate_id","is_hidden_candidate","work_experience"]}},"required":["id","applied_at","screening_questions","profile"]}},"cursor":{"type":"string"},"total_count":{"type":"number"}},"required":["object","data"]},{"type":"object","title":"RecruiterPipelineCandidateList","properties":{"object":{"type":"string","enum":["recruiter_pipeline_candidate_list"]},"data":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_pipeline_candidate"],"description":"Response type discriminator."},"candidate_id":{"type":"string"},"is_hidden_candidate":{"type":"boolean"},"hiring_project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pipeline_stage":{"type":"string"}}},"profile":{"type":"object","properties":{"visibility":{"type":"string","enum":["partial","full"],"description":"Profile detail level."},"id":{"type":"string","description":"Provider identifier."},"network_distance":{"type":"string","description":"SCREAMING_CASE network-distance enum."},"headline":{"type":"string","description":"Content — not stored."},"location":{"type":"string"},"can_send_inmail":{"type":"boolean"},"candidate_id":{"type":"string"},"is_hidden_candidate":{"type":"boolean"},"hiring_project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pipeline_stage":{"type":"string"}}},"work_experience":{"type":"array","items":{"type":"object","properties":{"company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"job_title":{"type":"string"},"started_on":{"type":"string"},"ended_on":{"type":"string"},"employment_type":{"type":"string"},"workplace_type":{"type":"string"}}}},"display_name":{"type":"string","description":"Content — not stored."},"public_identifier":{"type":"string"},"profile_url":{"type":"string"},"public_picture_url":{"type":"string"},"public_picture_url_large":{"type":"string"},"member_id":{"type":"string"},"industry":{"type":"string"},"relations_count":{"type":"number"},"followers_count":{"type":"number"},"summary":{"type":"string","description":"Content — not stored."},"emails":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"phone_numbers":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"endorsement_count":{"type":"number"}}}}},"required":["visibility","id","network_distance","candidate_id","is_hidden_candidate","work_experience"]}},"required":["object","candidate_id","is_hidden_candidate","profile"]}},"cursor":{"type":"string"},"total_count":{"type":"number"}},"required":["object","data"]}],"discriminator":{"propertyName":"object"}},"examples":{"people":{"summary":"People-search URL","value":{"object":"recruiter_people_search_result","data":[]}},"applicants":{"summary":"Applicant URL","value":{"object":"recruiter_job_applicant_list","data":[]}},"pipelineCandidates":{"summary":"Talent-pool/pipeline-view URL","value":{"object":"recruiter_pipeline_candidate_list","data":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Search using a pasted Recruiter search, talent-pool, or applicant URL — nothing else in the body. The response is a recruiter_people_search_result, recruiter_job_applicant_list, or recruiter_pipeline_candidate_list, depending on the kind of URL pasted. Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"A pasted Recruiter search, talent-pool, or applicant URL. Content, forwarded verbatim, never persisted."}},"required":["url"]},"examples":{"search":{"summary":"Pasted people-search URL","value":{"url":"https://www.linkedin.com/talent/search/..."}}}}}},"x-order":10}},"/v1/{account_id}/recruiter/projects/{project_id}/jobs":{"get":{"operationId":"getV1AccountIdRecruiterProjectsProjectIdJobs","tags":["Recruiter: Jobs"],"summary":"Get a project's job posting","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat resolves the job posting."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."}],"responses":{"200":{"description":"The single job posting attached to this project. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_job_posting"],"description":"Response type discriminator."},"id":{"type":"string"},"project_id":{"type":"string"},"title":{"type":"string","description":"Content — not stored."},"company":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":"string"},"public_picture_url":{"type":"string"},"profile_url":{"type":"string"}},"required":["name"]},"location":{"type":"string"},"state":{"type":"string","enum":["DRAFT","LISTED","CLOSED","REVIEW","SUSPENDED"]},"workplace_type":{"type":"string","enum":["ON_SITE","HYBRID","REMOTE"]},"industries":{"type":"array","items":{"type":"string"}},"job_functions":{"type":"array","items":{"type":"string"}},"employment_status":{"type":"string","enum":["FULL_TIME","PART_TIME","CONTRACT","TEMPORARY","OTHER","VOLUNTEER","INTERNSHIP"]},"experience_level":{"type":"string","enum":["INTERNSHIP","ENTRY_LEVEL","ASSOCIATE","MID_SENIOR_LEVEL","DIRECTOR","EXECUTIVE"]},"description":{"type":"string","description":"Content — not stored."},"views_count":{"type":"number"},"applications_count":{"type":"number"},"hiring_team":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"full_name":{"type":"string"},"public_picture_url":{"type":"string"}}}},"published_at":{"type":"string","description":"ISO-8601 timestamp."},"expires_at":{"type":"string","description":"ISO-8601 timestamp."},"closed_at":{"type":"string","description":"ISO-8601 timestamp."},"company_apply_url":{"type":"string"},"tracking_pixel_url":{"type":"string"},"screening_questions":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","description":"Content — not stored."},"is_eliminatory":{"type":"boolean"},"choices":{"type":"array","items":{"type":"string"}}}}}},"required":["object","id","project_id","title","company","location","state","workplace_type","industries","job_functions","employment_status","experience_level","description","views_count","applications_count","hiring_team","screening_questions"]},"examples":{"job":{"summary":"Attached job posting","value":{"object":"recruiter_job_posting","id":"jp_abc123","project_id":"proj_abc123","title":"Senior Product Lead","company":{"id":"comp_abc","name":"Acme Corp"},"location":"Remote","state":"LISTED","workplace_type":"REMOTE","industries":["Technology, Information and Internet"],"job_functions":["Product Management"],"employment_status":"FULL_TIME","experience_level":"DIRECTOR","description":"Lead our product organization through its next stage of growth.","views_count":128,"applications_count":14,"hiring_team":[],"screening_questions":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Retrieve the single job posting attached to a Recruiter project (not a list). A project with no attached job, or an unknown project_id, returns 404 RESOURCE_NOT_FOUND. Requires a Recruiter seat.","x-order":11},"post":{"operationId":"postV1AccountIdRecruiterProjectsProjectIdJobs","tags":["Recruiter: Jobs"],"summary":"Create a job posting draft in an existing project","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat creates the draft."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."}],"responses":{"201":{"description":"Job posting draft created in an EXISTING project. isDestructive:false — a reversible draft; nothing is spent and nothing is published until you call the publish endpoint. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_job_posting_created"],"description":"Response type discriminator."},"job_id":{"type":"string"},"project_id":{"type":"string"}},"required":["object","job_id","project_id"]},"examples":{"created":{"summary":"Draft created (existing project)","value":{"object":"recruiter_job_posting_created","job_id":"jp_new_002","project_id":"proj_fake_002"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Create a Recruiter job-posting DRAFT attached to an EXISTING hiring project (project_name is not accepted on this route — the project comes from the path). isDestructive:false — nothing is spent and nothing is published until you call the publish endpoint. Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"job_title":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"description":"The resolved job-title parameter id + its display name."},"company":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}],"description":"Target company: a resolved company id, or a free-text name."},"workplace_type":{"type":"string","enum":["ON_SITE","HYBRID","REMOTE"]},"location":{"type":"string","description":"A resolved LOCATION parameter id."},"employment_status":{"type":"string","enum":["FULL_TIME","PART_TIME","CONTRACT","TEMPORARY","OTHER","VOLUNTEER","INTERNSHIP"]},"seniority_level":{"type":"string","enum":["INTERNSHIP","ENTRY_LEVEL","ASSOCIATE","MID_SENIOR_LEVEL","DIRECTOR","EXECUTIVE","NOT_APPLICABLE"]},"description":{"type":"string","description":"Content; minimum 200 characters, forwarded verbatim, never persisted."},"industry":{"type":"array","items":{"type":"string"},"description":"1–3 resolved industry parameter ids."},"job_function":{"type":"array","items":{"type":"string"},"description":"1–3 resolved job-function parameter ids."},"apply_method":{"oneOf":[{"type":"object","properties":{"method":{"type":"string","const":"linkedin"},"notification_email":{"type":"string","description":"Email address notified for LinkedIn-apply submissions."},"resume_required":{"type":"boolean"}},"required":["method","notification_email"],"title":"Linkedin"},{"type":"object","properties":{"method":{"type":"string","const":"external"},"website_url":{"type":"string","description":"The external URL applicants are routed to."}},"required":["method","website_url"],"title":"External"}],"discriminator":{"propertyName":"method","mapping":{"linkedin":"#/oneOf/0","external":"#/oneOf/1"}},"description":"How candidates apply: {method:'linkedin', notification_email, resume_required?} or {method:'external', website_url}."},"skills":{"type":"array","items":{"type":"string"},"description":"Up to 10 resolved skill parameter ids."},"include_poster_info":{"type":"boolean","description":"Whether to show the posting recruiter's info. Defaults to true."},"tracking_pixel_url":{"type":"string"},"company_job_id":{"type":"string","description":"Your own external job-requisition id, for reference."},"screening_questions":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","description":"Content, forwarded verbatim, never persisted."},"answer_type":{"type":"string","description":"The substrate's own screening-question answer-type discriminator."},"qualification_required":{"type":"boolean"}},"required":["question","answer_type"]}},"salary":{"type":"object","properties":{"currency":{"type":"string","description":"ISO-4217 currency code."},"pay_frequency":{"type":"string","enum":["YEARLY","MONTHLY","HOURLY"]},"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0}},"required":["currency","pay_frequency","min","max"]},"additional_compensation":{"type":"object","properties":{"currency":{"type":"string","description":"ISO-4217 currency code."},"pay_frequency":{"type":"string","enum":["YEARLY","MONTHLY","HOURLY"]},"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0}},"required":["currency","pay_frequency","min","max"]},"rejection_settings":{"type":"object","properties":{"send_rejection_notification":{"type":"boolean"},"rejection_template":{"type":"string"},"reject_unqualified_applicants":{"type":"boolean"},"reject_out_of_country_applicants":{"type":"boolean"}},"required":["send_rejection_notification"]}},"required":["job_title","company","workplace_type","location","employment_status","seniority_level","description","industry","job_function","apply_method"]},"examples":{"externalApply":{"summary":"Existing project — external apply method","value":{"job_title":{"id":"title_001","name":"Senior Backend Engineer"},"company":{"name":"Acme Corp"},"workplace_type":"REMOTE","location":"105072678","employment_status":"FULL_TIME","seniority_level":"MID_SENIOR_LEVEL","description":"We are looking for a Senior Backend Engineer to join our growing platform team. You will design and operate distributed systems that scale to millions of requests per day across multiple regions and business lines.","industry":["4"],"job_function":["eng"],"apply_method":{"method":"external","website_url":"https://acme.test/apply"}}}}}}},"x-order":14}},"/v1/{account_id}/recruiter/projects/{project_id}/jobs/{job_id}/budget":{"get":{"operationId":"getV1AccountIdRecruiterProjectsProjectIdJobsJobIdBudget","tags":["Recruiter: Jobs"],"summary":"Get job posting budget","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat resolves the budget."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The job posting ID. Obtain it from GET …/recruiter/projects/{project_id}/jobs."}],"responses":{"200":{"description":"Pricing to publish this job posting. Note the Recruiter-specific shape: no promoted.daily/total.promoted_plus_recommended, and free carries only eligible (both differ from the classic Jobs budget shape). Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_job_posting_budget"],"description":"Response type discriminator."},"promoted":{"type":"object","properties":{"currency":{"type":"string"},"daily":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"recommended":{"type":"number"}}},"total":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"recommended":{"type":"number"}}},"estimated_daily_applicants_count":{"type":"number"}}},"free":{"type":"object","properties":{"eligible":{"type":"boolean"}}}},"required":["object","promoted","free"]},"examples":{"budget":{"summary":"Job posting budget","value":{"object":"recruiter_job_posting_budget","promoted":{"currency":"EUR","daily":{"min":10,"max":500,"recommended":45},"total":{"min":70,"max":3500,"recommended":315},"estimated_daily_applicants_count":6},"free":{"eligible":true}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Returns pricing to publish this job posting — the read-only companion to publishing, so you can price a publish before committing any money. Requires a Recruiter seat.","x-order":12}},"/v1/{account_id}/recruiter/jobs":{"post":{"operationId":"postV1AccountIdRecruiterJobs","tags":["Recruiter: Jobs"],"summary":"Create a job posting draft in a new project","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat creates the draft."}],"responses":{"201":{"description":"Job posting draft created in a NEW project. isDestructive:false — a reversible draft; nothing is spent and nothing is published until you call the publish endpoint. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_job_posting_created"],"description":"Response type discriminator."},"job_id":{"type":"string"},"project_id":{"type":"string"}},"required":["object","job_id","project_id"]},"examples":{"created":{"summary":"Draft created (new project)","value":{"object":"recruiter_job_posting_created","job_id":"jp_new_001","project_id":"proj_new_001"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Create a Recruiter job-posting DRAFT together with a brand-new hiring project (project_name is required). isDestructive:false — nothing is spent and nothing is published until you call the publish endpoint. description must be at least 200 characters. Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"job_title":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"description":"The resolved job-title parameter id + its display name."},"company":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}],"description":"Target company: a resolved company id, or a free-text name."},"workplace_type":{"type":"string","enum":["ON_SITE","HYBRID","REMOTE"]},"location":{"type":"string","description":"A resolved LOCATION parameter id."},"employment_status":{"type":"string","enum":["FULL_TIME","PART_TIME","CONTRACT","TEMPORARY","OTHER","VOLUNTEER","INTERNSHIP"]},"seniority_level":{"type":"string","enum":["INTERNSHIP","ENTRY_LEVEL","ASSOCIATE","MID_SENIOR_LEVEL","DIRECTOR","EXECUTIVE","NOT_APPLICABLE"]},"description":{"type":"string","description":"Content; minimum 200 characters, forwarded verbatim, never persisted."},"industry":{"type":"array","items":{"type":"string"},"description":"1–3 resolved industry parameter ids."},"job_function":{"type":"array","items":{"type":"string"},"description":"1–3 resolved job-function parameter ids."},"apply_method":{"oneOf":[{"type":"object","properties":{"method":{"type":"string","const":"linkedin"},"notification_email":{"type":"string","description":"Email address notified for LinkedIn-apply submissions."},"resume_required":{"type":"boolean"}},"required":["method","notification_email"],"title":"Linkedin"},{"type":"object","properties":{"method":{"type":"string","const":"external"},"website_url":{"type":"string","description":"The external URL applicants are routed to."}},"required":["method","website_url"],"title":"External"}],"discriminator":{"propertyName":"method","mapping":{"linkedin":"#/oneOf/0","external":"#/oneOf/1"}},"description":"How candidates apply: {method:'linkedin', notification_email, resume_required?} or {method:'external', website_url}."},"skills":{"type":"array","items":{"type":"string"},"description":"Up to 10 resolved skill parameter ids."},"include_poster_info":{"type":"boolean","description":"Whether to show the posting recruiter's info. Defaults to true."},"tracking_pixel_url":{"type":"string"},"company_job_id":{"type":"string","description":"Your own external job-requisition id, for reference."},"screening_questions":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","description":"Content, forwarded verbatim, never persisted."},"answer_type":{"type":"string","description":"The substrate's own screening-question answer-type discriminator."},"qualification_required":{"type":"boolean"}},"required":["question","answer_type"]}},"salary":{"type":"object","properties":{"currency":{"type":"string","description":"ISO-4217 currency code."},"pay_frequency":{"type":"string","enum":["YEARLY","MONTHLY","HOURLY"]},"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0}},"required":["currency","pay_frequency","min","max"]},"additional_compensation":{"type":"object","properties":{"currency":{"type":"string","description":"ISO-4217 currency code."},"pay_frequency":{"type":"string","enum":["YEARLY","MONTHLY","HOURLY"]},"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0}},"required":["currency","pay_frequency","min","max"]},"rejection_settings":{"type":"object","properties":{"send_rejection_notification":{"type":"boolean"},"rejection_template":{"type":"string"},"reject_unqualified_applicants":{"type":"boolean"},"reject_out_of_country_applicants":{"type":"boolean"}},"required":["send_rejection_notification"]},"project_name":{"type":"string","description":"Content; the new project's name, forwarded verbatim, never persisted."}},"required":["job_title","company","workplace_type","location","employment_status","seniority_level","description","industry","job_function","apply_method","project_name"]},"examples":{"linkedinApply":{"summary":"New project — LinkedIn apply method","value":{"job_title":{"id":"title_001","name":"Senior Backend Engineer"},"company":{"name":"Acme Corp"},"workplace_type":"REMOTE","location":"105072678","employment_status":"FULL_TIME","seniority_level":"MID_SENIOR_LEVEL","description":"We are looking for a Senior Backend Engineer to join our growing platform team. You will design and operate distributed systems that scale to millions of requests per day across multiple regions and business lines.","industry":["4"],"job_function":["eng"],"apply_method":{"method":"linkedin","notification_email":"jobs@acme.test"},"project_name":"Senior Backend Engineer Search"}}}}}},"x-order":13},"get":{"operationId":"getV1AccountIdRecruiterJobs","tags":["Recruiter: Jobs"],"summary":"List Recruiter job postings","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat lists the job postings."},{"name":"state","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["DRAFT","OPEN","CLOSED","REVIEW","SUSPENDED"]}},"description":"Filter by posting lifecycle state (repeatable, flat). Defaults to OPEN. One or more of: DRAFT, OPEN, CLOSED, REVIEW, SUSPENDED."},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","enum":["LAST_ACCESS_TIME","CHRONOLOGICAL","REVERSE_CHRONOLOGICAL"]},"description":"Field to sort results by. Defaults to LAST_ACCESS_TIME."},{"name":"location","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Resolved LOCATION parameter ids (repeatable, flat)."},{"name":"job_poster","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Resolved job-poster (SEAT) parameter ids (repeatable, flat)."},{"name":"contract","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}},"description":"Resolved CONTRACT parameter ids (repeatable, flat)."},{"name":"workplace_type","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["ON_SITE","REMOTE","HYBRID"]}},"description":"Filter by workplace type (repeatable, flat). One or more of: ON_SITE, REMOTE, HYBRID."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Number of results to return (1–100). Defaults to 10."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."}],"responses":{"200":{"description":"List of Recruiter job postings, matching any supplied filters. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_job_posting_list"],"description":"Response type discriminator."},"data":{"type":"array","description":"Job posting list items — company is a NAME STRING (contrast the retrieve shape).","items":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_job_posting"],"description":"Response type discriminator."},"id":{"type":"string"},"project_id":{"type":"string"},"title":{"type":"string","description":"Content — not stored."},"company":{"type":"string","description":"Company name."},"location":{"type":"string"},"state":{"type":"string","enum":["DRAFT","LISTED","CLOSED","REVIEW","SUSPENDED"]},"applications_count":{"type":"number"},"views_count":{"type":"number"}},"required":["object","id","project_id","title","company","location","state","applications_count","views_count"]}},"cursor":{"type":"string","description":"Opaque cursor for the next page. Absent when there are no more results."},"total_count":{"type":"number","description":"Total number of matching job postings, when the platform returns it."}},"required":["object","data"]},"examples":{"withJobs":{"summary":"Recruiter job postings list","value":{"object":"recruiter_job_posting_list","data":[{"object":"recruiter_job_posting","id":"jp_fake_001","project_id":"proj_fake_002","title":"Senior Product Lead","company":"Acme Corp","location":"Remote","state":"LISTED","applications_count":14,"views_count":128}]}},"empty":{"summary":"No job postings","value":{"object":"recruiter_job_posting_list","data":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"List Recruiter job postings. Filter by state (default OPEN), sort, location, job_poster, contract, and workplace_type (all repeatable). Pagination is driven by the limit (1-100) and cursor query params. Requires a Recruiter seat.","x-order":15}},"/v1/{account_id}/recruiter/jobs/{job_id}":{"get":{"operationId":"getV1AccountIdRecruiterJobsJobId","tags":["Recruiter: Jobs"],"summary":"Get one Recruiter job posting","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat resolves the job posting."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The job posting ID. Obtain it from data[].id of GET …/recruiter/jobs."}],"responses":{"200":{"description":"The job posting's full detail — the v2 recruiter_job_posting retrieve shape (company an OBJECT). Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_job_posting"],"description":"Response type discriminator."},"id":{"type":"string"},"project_id":{"type":"string"},"title":{"type":"string","description":"Content — not stored."},"company":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":"string"},"public_picture_url":{"type":"string"},"profile_url":{"type":"string"}},"required":["name"]},"location":{"type":"string"},"state":{"type":"string","enum":["DRAFT","LISTED","CLOSED","REVIEW","SUSPENDED"]},"workplace_type":{"type":"string","enum":["ON_SITE","HYBRID","REMOTE"]},"industries":{"type":"array","items":{"type":"string"}},"job_functions":{"type":"array","items":{"type":"string"}},"employment_status":{"type":"string","enum":["FULL_TIME","PART_TIME","CONTRACT","TEMPORARY","OTHER","VOLUNTEER","INTERNSHIP"]},"experience_level":{"type":"string","enum":["INTERNSHIP","ENTRY_LEVEL","ASSOCIATE","MID_SENIOR_LEVEL","DIRECTOR","EXECUTIVE"]},"description":{"type":"string","description":"Content — not stored."},"views_count":{"type":"number"},"applications_count":{"type":"number"},"hiring_team":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"full_name":{"type":"string"},"public_picture_url":{"type":"string"}}}},"published_at":{"type":"string","description":"ISO-8601 timestamp."},"expires_at":{"type":"string","description":"ISO-8601 timestamp."},"closed_at":{"type":"string","description":"ISO-8601 timestamp."},"company_apply_url":{"type":"string"},"tracking_pixel_url":{"type":"string"},"screening_questions":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","description":"Content — not stored."},"is_eliminatory":{"type":"boolean"},"choices":{"type":"array","items":{"type":"string"}}}}}},"required":["object","id","project_id","title","company","location","state","workplace_type","industries","job_functions","employment_status","experience_level","description","views_count","applications_count","hiring_team","screening_questions"]},"examples":{"jobPosting":{"summary":"A Recruiter job posting","value":{"object":"recruiter_job_posting","id":"jp_fake_001","project_id":"proj_fake_002","title":"Senior Product Lead","company":{"id":"comp_fake_001","name":"Acme Corp","profile_url":"https://www.linkedin.com/company/acme-corp"},"location":"Remote","state":"LISTED","workplace_type":"REMOTE","industries":["Technology, Information and Internet"],"job_functions":["Product Management"],"employment_status":"FULL_TIME","experience_level":"DIRECTOR","description":"Lead our product organization through its next stage of growth.","views_count":128,"applications_count":14,"hiring_team":[{"id":"urn:li:member:recruiter_22222","full_name":"Bob Hiring Manager"}],"published_at":"2026-02-05T10:00:00.000Z","screening_questions":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Retrieve a single Recruiter job posting by ID — the full recruiter_job_posting shape (company an OBJECT). Unknown job_id returns 404 RESOURCE_NOT_FOUND. Requires a Recruiter seat.","x-order":16}},"/v1/{account_id}/recruiter/projects/{project_id}/jobs/{job_id}":{"patch":{"operationId":"patchV1AccountIdRecruiterProjectsProjectIdJobsJobId","tags":["Recruiter: Jobs"],"summary":"Edit a job posting","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat edits the posting."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The job posting ID. Obtain it from GET …/recruiter/projects/{project_id}/jobs."}],"responses":{"200":{"description":"The job posting was edited. Thin acknowledgement only — no echoed posting. MONEY WARNING: if this posting is already PUBLISHED (LISTED/REVIEW/SUSPENDED), this mutates a live, money-spending listing — the posting keeps running and spending under the edited fields. Omitted fields are left unchanged. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_job_posting_edited"],"description":"Response type discriminator."}},"required":["object"]},"examples":{"edited":{"summary":"Job posting edited","value":{"object":"recruiter_job_posting_edited"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"MONEY WARNING: if this job posting is already PUBLISHED (LISTED/REVIEW/SUSPENDED), editing it mutates a live, money-spending listing — the posting keeps running and spending under the edited fields. Partial update: every field is optional, and any field you omit is left unchanged. Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"job_title":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"description":"The resolved job-title parameter id + its display name."},"company":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}],"description":"Target company: a resolved company id, or a free-text name."},"workplace_type":{"type":"string","enum":["ON_SITE","HYBRID","REMOTE"]},"location":{"type":"string","description":"A resolved LOCATION parameter id."},"employment_status":{"type":"string","enum":["FULL_TIME","PART_TIME","CONTRACT","TEMPORARY","OTHER","VOLUNTEER","INTERNSHIP"]},"seniority_level":{"type":"string","enum":["INTERNSHIP","ENTRY_LEVEL","ASSOCIATE","MID_SENIOR_LEVEL","DIRECTOR","EXECUTIVE","NOT_APPLICABLE"]},"description":{"type":"string","description":"Content; minimum 200 characters, forwarded verbatim, never persisted."},"industry":{"type":"array","items":{"type":"string"},"description":"1–3 resolved industry parameter ids."},"job_function":{"type":"array","items":{"type":"string"},"description":"1–3 resolved job-function parameter ids."},"apply_method":{"oneOf":[{"type":"object","properties":{"method":{"type":"string","const":"linkedin"},"notification_email":{"type":"string","description":"Email address notified for LinkedIn-apply submissions."},"resume_required":{"type":"boolean"}},"required":["method","notification_email"],"title":"Linkedin"},{"type":"object","properties":{"method":{"type":"string","const":"external"},"website_url":{"type":"string","description":"The external URL applicants are routed to."}},"required":["method","website_url"],"title":"External"}],"discriminator":{"propertyName":"method","mapping":{"linkedin":"#/oneOf/0","external":"#/oneOf/1"}},"description":"How candidates apply: {method:'linkedin', notification_email, resume_required?} or {method:'external', website_url}."},"skills":{"type":"array","items":{"type":"string"},"description":"Up to 10 resolved skill parameter ids."},"include_poster_info":{"type":"boolean","description":"Whether to show the posting recruiter's info. Defaults to true."},"tracking_pixel_url":{"type":"string"},"company_job_id":{"type":"string","description":"Your own external job-requisition id, for reference."},"screening_questions":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","description":"Content, forwarded verbatim, never persisted."},"answer_type":{"type":"string","description":"The substrate's own screening-question answer-type discriminator."},"qualification_required":{"type":"boolean"}},"required":["question","answer_type"]}},"salary":{"type":"object","properties":{"currency":{"type":"string","description":"ISO-4217 currency code."},"pay_frequency":{"type":"string","enum":["YEARLY","MONTHLY","HOURLY"]},"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0}},"required":["currency","pay_frequency","min","max"]},"additional_compensation":{"type":"object","properties":{"currency":{"type":"string","description":"ISO-4217 currency code."},"pay_frequency":{"type":"string","enum":["YEARLY","MONTHLY","HOURLY"]},"min":{"type":"number","minimum":0},"max":{"type":"number","minimum":0}},"required":["currency","pay_frequency","min","max"]},"rejection_settings":{"type":"object","properties":{"send_rejection_notification":{"type":"boolean"},"rejection_template":{"type":"string"},"reject_unqualified_applicants":{"type":"boolean"},"reject_out_of_country_applicants":{"type":"boolean"}},"required":["send_rejection_notification"]}}},"examples":{"titleOnly":{"summary":"Edit only the job title","value":{"job_title":{"id":"title_002","name":"Staff Backend Engineer"}}}}}}},"x-order":17}},"/v1/{account_id}/recruiter/projects/{project_id}/jobs/{job_id}/publish":{"post":{"operationId":"postV1AccountIdRecruiterProjectsProjectIdJobsJobIdPublish","tags":["Recruiter: Jobs"],"summary":"Publish a job posting","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat publishes the posting."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The job posting ID. Obtain it from GET …/recruiter/projects/{project_id}/jobs."}],"responses":{"200":{"description":"The job posting was published. REAL MONEY: PROMOTED and PROMOTED_PLUS spend on the connected account's LinkedIn payment method — providing budget IS the explicit opt-in to spend, there is no separate confirm flag. Returns a SINGLE object with the posting's current state — never a checkpoint (bypass_email_verification replaces the retired publish-verification step; there is no separate checkpoint-solve endpoint). Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_job_posting_published"],"description":"Response type discriminator."},"job_state":{"type":"string","enum":["DRAFT","CLOSED","LISTED","REVIEW","SUSPENDED"],"description":"Current state of the published job posting."}},"required":["object","job_state"]},"examples":{"published":{"summary":"Posting published (live)","value":{"object":"recruiter_job_posting_published","job_state":"LISTED"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"INVALID_REQUEST — a schema violation (e.g. missing budget on PROMOTED/PROMOTED_PLUS), or a mode/budget combination this draft is not eligible for.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missingBudget":{"summary":"budget missing on a paid mode","value":{"code":"INVALID_REQUEST","message":"Required","user_fixable":true,"retry_likely_to_succeed":false}},"ineligible":{"summary":"Draft ineligible for the requested mode","value":{"code":"INVALID_REQUEST","message":"The request was rejected as invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"REAL MONEY: PROMOTED and PROMOTED_PLUS spend on the connected account's LinkedIn payment method. Providing budget IS the explicit opt-in to spend — there is no separate confirm flag. FREE requires free-posting eligibility (check GET …/budget's free.eligible first). bypass_email_verification skips the on-behalf-of-company posting eligibility check (replaces the retired publish-verification checkpoint — there is no separate checkpoint-solve step). Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"mode":{"type":"string","const":"FREE","description":"Publish for free. Requires free-posting eligibility; check GET .../budget's free.eligible first."},"bypass_email_verification":{"type":"boolean","description":"Skip the on-behalf-of-company posting eligibility check."}},"required":["mode"],"title":"FREE"},{"type":"object","properties":{"mode":{"type":"string","const":"PROMOTED","description":"Paid promoted posting. REAL MONEY; spends on the connected account's LinkedIn payment method."},"budget":{"type":"object","properties":{"currency":{"type":"string","description":"ISO-4217 currency code, e.g. EUR."},"amount":{"type":"number","minimum":0,"description":"Budget amount, in the given currency."},"scope":{"type":"string","enum":["DAILY","TOTAL"],"description":"Whether the amount is a daily or a total budget."}},"required":["currency","amount","scope"],"description":"Required. Providing it is the explicit opt-in to spend real money."},"bypass_email_verification":{"type":"boolean","description":"Skip the on-behalf-of-company posting eligibility check."}},"required":["mode","budget"],"title":"PROMOTED"},{"type":"object","properties":{"mode":{"type":"string","const":"PROMOTED_PLUS","description":"Premium promoted posting. REAL MONEY; spends on the connected account's LinkedIn payment method."},"budget":{"type":"object","properties":{"currency":{"type":"string","description":"ISO-4217 currency code, e.g. EUR."},"amount":{"type":"number","minimum":0,"description":"Budget amount, in the given currency."},"scope":{"type":"string","enum":["DAILY","TOTAL"],"description":"Whether the amount is a daily or a total budget."}},"required":["currency","amount","scope"],"description":"Required. Providing it is the explicit opt-in to spend real money."},"bypass_email_verification":{"type":"boolean","description":"Skip the on-behalf-of-company posting eligibility check."}},"required":["mode","budget"],"title":"PROMOTED PLUS"}],"discriminator":{"propertyName":"mode","mapping":{"FREE":"#/oneOf/0","PROMOTED":"#/oneOf/1","PROMOTED_PLUS":"#/oneOf/2"}}},"examples":{"free":{"summary":"Publish for FREE","value":{"mode":"FREE"}},"promotedDaily":{"summary":"Publish PROMOTED with a daily budget (REAL MONEY)","value":{"mode":"PROMOTED","budget":{"currency":"EUR","amount":25,"scope":"DAILY"}}}}}}},"x-order":18}},"/v1/{account_id}/recruiter/projects/{project_id}/jobs/{job_id}/close":{"post":{"operationId":"postV1AccountIdRecruiterProjectsProjectIdJobsJobIdClose","tags":["Recruiter: Jobs"],"summary":"Close a job posting","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat closes the posting."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string"},"description":"The job posting ID. Obtain it from GET …/recruiter/projects/{project_id}/jobs."}],"responses":{"200":{"description":"The job posting was closed — stops further applications. IMPACT WARNING: this is effectively irreversible for a live (published) posting — there is no re-open operation. Thin acknowledgement only. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_job_posting_closed"],"description":"Response type discriminator."}},"required":["object"]},"examples":{"closed":{"summary":"Job posting closed","value":{"object":"recruiter_job_posting_closed"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — an over-cap limit, an unknown status/sort_by value, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalidLimit":{"summary":"limit over cap","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidSortBy":{"summary":"Unknown sort_by","value":{"code":"INVALID_REQUEST","message":"Invalid enum value for sort_by.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — A temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"IMPACT WARNING: closing stops further applications and is effectively irreversible for a live (published) posting — there is no re-open operation. No request body. Requires a Recruiter seat.","x-order":19}},"/v1/{account_id}/recruiter/projects/{project_id}/pipeline/candidate/save":{"post":{"operationId":"postV1AccountIdRecruiterProjectsProjectIdPipelineCandidateSave","tags":["Recruiter: Jobs"],"summary":"Save a candidate to a project's pipeline","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat saves the candidate."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."}],"responses":{"200":{"description":"Candidate saved to the pipeline. Thin acknowledgement only — no echoed candidate. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_candidate_saved"],"description":"Response type discriminator."}},"required":["object"]},"examples":{"saved":{"summary":"Candidate saved","value":{"object":"recruiter_candidate_saved"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"INVALID_REQUEST — missing stage_id or candidate_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missingCandidateId":{"summary":"Missing candidate_id","value":{"code":"INVALID_REQUEST","message":"candidate_id is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — the LinkedIn account is disconnected or credentials are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE (no Recruiter seat) or LINKEDIN_FEATURE_NOT_SUBSCRIBED (no active LinkedIn Recruiter subscription). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id, stage_id, or candidate_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the connected LinkedIn account cannot perform the requested Recruiter action.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account restricted","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — a temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Save a candidate (or user profile) to a Recruiter project's pipeline at the given stage. The sole surviving pipeline write — the legacy add-applicant and reject actions have no equivalent on this surface. Requires a Recruiter seat. Contact-safety: fake-lane only.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"stage_id":{"type":"string","description":"The pipeline stage id to save the candidate into."},"candidate_id":{"type":"string","description":"The candidate id or user-profile id to save to the pipeline."}},"required":["stage_id","candidate_id"]},"examples":{"basic":{"summary":"Save a candidate into a pipeline stage","value":{"stage_id":"stage_uncontacted","candidate_id":"cand_001"}}}}}},"x-order":20}},"/v1/{account_id}/recruiter/projects/{project_id}/talent-pool/applicants":{"post":{"operationId":"postV1AccountIdRecruiterProjectsProjectIdTalentPoolApplicants","tags":["Recruiter: Jobs"],"summary":"List applicants in a project's talent pool","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat lists the applicants."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response. Omit for the first page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"description":"Number of applicants to return (1–100). Defaults to 25."}],"responses":{"200":{"description":"List of talent-pool applicants matching the filters. Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["recruiter_job_applicant_list"],"description":"Response type discriminator."},"data":{"type":"array","description":"Applicant items — the full recruiter_job_applicant shape.","items":{"type":"object","description":"A Recruiter talent-pool applicant. No rating or messaging_token (the v2 recruiter applicant shape is NOT classic-jobs parity). PII (emails/phone_numbers, via the nested full profile) is content — never stored.","properties":{"object":{"type":"string","enum":["recruiter_job_applicant"],"description":"Response type discriminator."},"id":{"type":"string","description":"The applicant's identifier."},"applied_at":{"type":"string","description":"ISO-8601 timestamp when the application was submitted."},"has_resume":{"type":"boolean","description":"Whether the applicant has a downloadable résumé. Gates GET …/resume."},"screening_questions":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","description":"The screening question text. Content — not stored."},"has_succedeed":{"type":"boolean","description":"Whether the applicant successfully answered the question (sic — verbatim wire key typo, NOT 'has_succeeded')."},"is_eliminatory":{"type":"boolean","description":"Whether an unexpected answer disqualifies the applicant."},"answers":{"type":"array","items":{"type":"string"},"description":"The applicant's answers. Content — not stored."}},"required":["question","has_succedeed","is_eliminatory","answers"]},"description":"Screening-question responses."},"profile":{"type":"object","properties":{"visibility":{"type":"string","enum":["partial","full"],"description":"Profile detail level."},"id":{"type":"string","description":"Provider identifier."},"network_distance":{"type":"string","description":"SCREAMING_CASE network-distance enum."},"headline":{"type":"string","description":"Content — not stored."},"location":{"type":"string"},"can_send_inmail":{"type":"boolean"},"candidate_id":{"type":"string"},"is_hidden_candidate":{"type":"boolean"},"hiring_project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pipeline_stage":{"type":"string"}}},"work_experience":{"type":"array","items":{"type":"object","properties":{"company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"job_title":{"type":"string"},"started_on":{"type":"string"},"ended_on":{"type":"string"},"employment_type":{"type":"string"},"workplace_type":{"type":"string"}}}},"display_name":{"type":"string","description":"Content — not stored."},"public_identifier":{"type":"string"},"profile_url":{"type":"string"},"public_picture_url":{"type":"string"},"public_picture_url_large":{"type":"string"},"member_id":{"type":"string"},"industry":{"type":"string"},"relations_count":{"type":"number"},"followers_count":{"type":"number"},"summary":{"type":"string","description":"Content — not stored."},"emails":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"phone_numbers":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"endorsement_count":{"type":"number"}}}}},"required":["visibility","id","network_distance","candidate_id","is_hidden_candidate","work_experience"]}},"required":["object","id","applied_at","profile"]}},"cursor":{"type":"string","description":"Opaque cursor for the next page. Absent when there are no more results."},"total_count":{"type":"number","description":"Total number of matching applicants, when the platform returns it."}},"required":["object","data"]},"examples":{"withApplicants":{"summary":"Applicants list","value":{"object":"recruiter_job_applicant_list","data":[{"object":"recruiter_job_applicant","id":"app_fake_001","applied_at":"2026-06-01T09:00:00.000Z","has_resume":true,"screening_questions":[{"question":"Do you have 5+ years of Go experience?","has_succedeed":true,"is_eliminatory":true,"answers":["Yes"]}],"profile":{"visibility":"full","id":"ACoAA_fake_full_001","network_distance":"SECOND_DEGREE","headline":"Senior Backend Engineer at Acme","candidate_id":"cand_fake_full_001","is_hidden_candidate":false,"work_experience":[],"display_name":"Alice Backend","emails":["alice.backend@example.com"],"phone_numbers":["+49 30 1234567"]}}],"total_count":1}},"empty":{"summary":"No applicants","value":{"object":"recruiter_job_applicant_list","data":[]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — a missing channel_id (list only), an over-cap limit, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missingChannelId":{"summary":"Missing channel_id (list only)","value":{"code":"INVALID_REQUEST","message":"channel_id is required.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidLimit":{"summary":"limit over cap (list only)","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id or applicant_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Applicant or project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — a temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"List applicants in a Recruiter project's talent pool (POST-as-list; the body carries filters, no state mutates). The channel_id (a JOB_POSTING talent-pool channel) is REQUIRED — read it off talent_pool.channels[] of GET …/recruiter/projects/{project_id}. Requires a Recruiter seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the JOB_POSTING channel from the Talent Pool. SDK-confirmed REQUIRED."},"keywords":{"type":"string","description":"Free-text keyword search. Content, forwarded verbatim, never persisted."},"sort_by":{"type":"string","enum":["SCREENING_REQUIREMENTS","RELEVANCE","NEWEST_FIRST","ALPHABETICAL"],"description":"Sort order for the applicant list."},"spotlights":{"type":"array","items":{"type":"string","const":"ACTIVE_TALENT"},"description":"Filter by candidate spotlight."},"location":{"type":"array","items":{"type":"string"},"description":"Resolved LOCATION parameter ids."},"company":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to include."},"exclude":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to exclude."}},"description":"Resolved COMPANY parameter ids to include/exclude."},"skills":{"type":"array","items":{"type":"string"},"description":"Resolved SKILL parameter ids."},"school":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to include."},"exclude":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to exclude."}},"description":"Resolved SCHOOL parameter ids to include/exclude."},"industry":{"type":"array","items":{"type":"string"},"description":"Resolved INDUSTRY parameter ids."},"job_title":{"type":"array","items":{"type":"string"},"description":"Resolved JOB_TITLE parameter ids."},"spoken_language":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A resolved SPOKEN_LANGUAGE parameter id."},"priority":{"type":"string","enum":["CAN_HAVE","MUST_HAVE","DOESNT_HAVE"],"description":"Whether the applicant can, must, or shouldn't have this language."}},"required":["id"]},"description":"Spoken-language filters."},"spoken_language_proficiency":{"type":"string","enum":["ELEMENTARY","LIMITED_WORKING","PROFESSIONAL_WORKING","FULL_PROFESSIONAL","NATIVE_OR_BILINGUAL"],"description":"Required proficiency level for the spoken languages."},"network_distance":{"type":"array","items":{"oneOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"string","const":"GROUP"}]},"description":"Connection degrees: 1 (first), 2 (second), 3 (third+), or 'GROUP' (common group members)."},"years_of_experience":{"type":"object","properties":{"min":{"type":"integer","minimum":0,"maximum":30},"max":{"type":"integer","minimum":0,"maximum":30}},"required":["min","max"],"description":"Years-of-experience range (0–30, both min and max required together)."},"years_in_current_position":{"type":"object","properties":{"min":{"type":"integer","minimum":0},"max":{"type":"integer","minimum":0}},"required":["min","max"],"description":"Years-in-current-position range."},"years_in_current_company":{"type":"object","properties":{"min":{"type":"integer","minimum":0},"max":{"type":"integer","minimum":0}},"required":["min","max"],"description":"Years-in-current-company range."},"degree":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to include."},"exclude":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to exclude."}},"description":"Resolved DEGREE parameter ids to include/exclude."},"field_of_study":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to include."},"exclude":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to exclude."}},"description":"Resolved FIELD_OF_STUDY parameter ids to include/exclude."},"seniority":{"type":"array","items":{"type":"string","enum":["UNPAID","TRAINING","ENTRY","SENIOR","MANAGER","DIRECTOR","VP","CXO","PARTNER","OWNER"]},"description":"Filter by seniority level."},"job_function":{"type":"array","items":{"type":"string"},"description":"Resolved JOB_FUNCTION parameter ids."},"current_company":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to include."},"exclude":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to exclude."}},"description":"Resolved CURRENT_COMPANY parameter ids to include/exclude."},"company_size":{"type":"array","items":{"type":"object","properties":{"min":{"type":"number","enum":[1,51,201,501,1001,5001,10001]},"max":{"type":"number","enum":[0,10,200,500,1000,5000,10000]}}},"description":"Company-size bucket ranges."},"tags":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to include."},"exclude":{"type":"array","items":{"type":"string"},"description":"Resolved parameter ids to exclude."}},"description":"Resolved TAG parameter ids to include/exclude."}},"required":["channel_id"]},"examples":{"channelOnly":{"summary":"List every applicant in the channel (channel_id is the only required field)","value":{"channel_id":"chan_1"}},"filtered":{"summary":"Filter by keyword and sort by newest","value":{"channel_id":"chan_1","keywords":"rust","sort_by":"NEWEST_FIRST"}}}}}},"x-order":21}},"/v1/{account_id}/recruiter/projects/{project_id}/talent-pool/applicants/{applicant_id}":{"get":{"operationId":"getV1AccountIdRecruiterProjectsProjectIdTalentPoolApplicantsApplicantId","tags":["Recruiter: Jobs"],"summary":"Get one talent-pool applicant","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat resolves the applicant."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."},{"name":"applicant_id","in":"path","required":true,"schema":{"type":"string"},"description":"The applicant ID, obtained from the list applicants endpoint's data[].id."}],"responses":{"200":{"description":"A single talent-pool applicant — profile GUARANTEED full (PII emails/phone_numbers included). Requires a Recruiter seat.","content":{"application/json":{"schema":{"type":"object","description":"A Recruiter talent-pool applicant. No rating or messaging_token (the v2 recruiter applicant shape is NOT classic-jobs parity). PII (emails/phone_numbers, via the nested full profile) is content — never stored.","properties":{"object":{"type":"string","enum":["recruiter_job_applicant"],"description":"Response type discriminator."},"id":{"type":"string","description":"The applicant's identifier."},"applied_at":{"type":"string","description":"ISO-8601 timestamp when the application was submitted."},"has_resume":{"type":"boolean","description":"Whether the applicant has a downloadable résumé. Gates GET …/resume."},"screening_questions":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string","description":"The screening question text. Content — not stored."},"has_succedeed":{"type":"boolean","description":"Whether the applicant successfully answered the question (sic — verbatim wire key typo, NOT 'has_succeeded')."},"is_eliminatory":{"type":"boolean","description":"Whether an unexpected answer disqualifies the applicant."},"answers":{"type":"array","items":{"type":"string"},"description":"The applicant's answers. Content — not stored."}},"required":["question","has_succedeed","is_eliminatory","answers"]},"description":"Screening-question responses."},"profile":{"type":"object","properties":{"visibility":{"type":"string","enum":["partial","full"],"description":"Profile detail level."},"id":{"type":"string","description":"Provider identifier."},"network_distance":{"type":"string","description":"SCREAMING_CASE network-distance enum."},"headline":{"type":"string","description":"Content — not stored."},"location":{"type":"string"},"can_send_inmail":{"type":"boolean"},"candidate_id":{"type":"string"},"is_hidden_candidate":{"type":"boolean"},"hiring_project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pipeline_stage":{"type":"string"}}},"work_experience":{"type":"array","items":{"type":"object","properties":{"company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}},"job_title":{"type":"string"},"started_on":{"type":"string"},"ended_on":{"type":"string"},"employment_type":{"type":"string"},"workplace_type":{"type":"string"}}}},"display_name":{"type":"string","description":"Content — not stored."},"public_identifier":{"type":"string"},"profile_url":{"type":"string"},"public_picture_url":{"type":"string"},"public_picture_url_large":{"type":"string"},"member_id":{"type":"string"},"industry":{"type":"string"},"relations_count":{"type":"number"},"followers_count":{"type":"number"},"summary":{"type":"string","description":"Content — not stored."},"emails":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"phone_numbers":{"type":"array","items":{"type":"string"},"description":"PII — full variant only, never persisted/logged."},"skills":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"endorsement_count":{"type":"number"}}}}},"required":["visibility","id","network_distance","candidate_id","is_hidden_candidate","work_experience"]}},"required":["object","id","applied_at","profile"]},"examples":{"applicant":{"summary":"Applicant detail","value":{"object":"recruiter_job_applicant","id":"app_fake_001","applied_at":"2026-06-01T09:00:00.000Z","has_resume":true,"screening_questions":[{"question":"Do you have 5+ years of Go experience?","has_succedeed":true,"is_eliminatory":true,"answers":["Yes"]}],"profile":{"visibility":"full","id":"ACoAA_fake_full_001","network_distance":"SECOND_DEGREE","headline":"Senior Backend Engineer at Acme","candidate_id":"cand_fake_full_001","is_hidden_candidate":false,"work_experience":[],"display_name":"Alice Backend","emails":["alice.backend@example.com"],"phone_numbers":["+49 30 1234567"]}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — a missing channel_id (list only), an over-cap limit, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missingChannelId":{"summary":"Missing channel_id (list only)","value":{"code":"INVALID_REQUEST","message":"channel_id is required.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidLimit":{"summary":"limit over cap (list only)","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Not found. RESOURCE_NOT_FOUND — the project_id or applicant_id does not exist or is not visible to this account. ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"resourceNotFound":{"summary":"Applicant or project not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The requested recruiter resource was not found.","user_fixable":true,"retry_likely_to_succeed":false}},"accountNotFound":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — a temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable — the platform service is temporarily down.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Service unavailable","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Retrieve full detail for a single talent-pool applicant — the profile is GUARANTEED full (includes PII emails/phone_numbers). Unknown applicant_id or project_id → 404 RESOURCE_NOT_FOUND. Requires a Recruiter seat.","x-order":22}},"/v1/{account_id}/recruiter/projects/{project_id}/talent-pool/applicants/{applicant_id}/resume":{"get":{"operationId":"getV1AccountIdRecruiterProjectsProjectIdTalentPoolApplicantsApplicantIdResume","tags":["Recruiter: Jobs"],"summary":"Download an applicant's résumé","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Recruiter seat downloads the résumé."},{"name":"project_id","in":"path","required":true,"schema":{"type":"string"},"description":"The project ID. Obtain it from data[].id of GET …/recruiter/projects."},{"name":"applicant_id","in":"path","required":true,"schema":{"type":"string"},"description":"The applicant ID, obtained from the list applicants endpoint's data[].id."}],"responses":{"200":{"description":"The raw résumé bytes, served on demand with the original content type. No résumé bytes are stored by Curviate. A transient 409 (still generating) is bounded-retried internally before this response.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary","description":"Raw résumé file bytes. The Content-Type and Content-Disposition headers are set by the server."},"examples":{"binary":{"summary":"Raw résumé file bytes","value":"<binary résumé bytes — served with the original Content-Type and a Content-Disposition filename>"}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — a missing channel_id (list only), an over-cap limit, or another validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"missingChannelId":{"summary":"Missing channel_id (list only)","value":{"code":"INVALID_REQUEST","message":"channel_id is required.","user_fixable":true,"retry_likely_to_succeed":false}},"invalidLimit":{"summary":"limit over cap (list only)","value":{"code":"INVALID_REQUEST","message":"limit must be between 1 and 100.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LINKEDIN_AUTH_FAILED — missing or invalid API key, or the LinkedIn account is disconnected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unauthenticated","value":{"code":"LINKEDIN_AUTH_FAILED","message":"The LinkedIn account is disconnected or credentials are invalid.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. TIER_NOT_ACTIVE — the Curviate seat lacks the Recruiter add-on — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the LinkedIn account does not have an active Recruiter subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"tierNotActive":{"summary":"No Recruiter seat","value":{"code":"TIER_NOT_ACTIVE","message":"This endpoint requires a Recruiter seat. Upgrade your Curviate plan.","required_tier":"recruiter","user_fixable":true,"retry_likely_to_succeed":false}},"featureNotSubscribed":{"summary":"LinkedIn account not subscribed to Recruiter","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"The connected LinkedIn account does not have an active Recruiter subscription.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"RESOURCE_NOT_FOUND — the applicant has no résumé on file, or the project/applicant does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"noResume":{"summary":"No résumé on file","value":{"code":"RESOURCE_NOT_FOUND","message":"No résumé is available for this applicant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"Unprocessable entity — the account or project state is invalid for this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unprocessable","value":{"code":"ACCOUNT_RESTRICTED","message":"This account cannot perform the requested Recruiter action.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — too many requests. Retry with exponential backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Rate limited","value":{"code":"RATE_LIMIT_ACCOUNT","message":"Too many requests. Please retry after a short delay.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Unexpected error","value":{"code":"UNEXPECTED_ERROR","message":"An unexpected error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"PLATFORM_ERROR — a temporary error occurred. Typically temporary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Platform error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"LINKEDIN_SERVICE_UNAVAILABLE — the résumé is still being generated upstream; the async-prep retry budget was exhausted. Retry shortly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"stillGenerating":{"summary":"Résumé still generating","value":{"code":"LINKEDIN_SERVICE_UNAVAILABLE","message":"The résumé is still being generated. Try again shortly.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout — the request timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Timeout","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please retry.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"recruiter","x-badges":[{"name":"+R","position":"after","color":"#F59E0B"}],"description":"Stream the résumé file for a talent-pool applicant as raw bytes. Curviate never caches, stores, or logs the résumé body. Gated by has_resume on the applicant detail. An applicant with no résumé on file → 404 RESOURCE_NOT_FOUND; a résumé still generating upstream → 503 (retry shortly). Requires a Recruiter seat.","x-order":23}},"/v1/{account_id}/sales-navigator/chats":{"post":{"operationId":"postV1AccountIdSalesNavigatorChats","tags":["Sales Navigator: Messaging"],"summary":"Start a chat (Sales Navigator)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat starts the chat."}],"responses":{"201":{"description":"Chat started. Returns the new Sales Navigator chat_id and opening message_id.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["chat_started"],"description":"Response type discriminator."},"chat_id":{"type":["string","null"],"description":"The newly created Sales Navigator chat identifier."},"message_id":{"description":"The opening message identifier. May be an array when attachments are delivered as separate messages.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"null"}]}},"required":["object","chat_id","message_id"]},"examples":{"created":{"summary":"Chat started","value":{"object":"chat_started","chat_id":"chat_sn_fake_001","message_id":"msg_sn_fake_001"}},"arrayMessageId":{"summary":"Chat started with multiple attachments (array message_id)","value":{"object":"chat_started","chat_id":"chat_sn_fake_002","message_id":["msg_sn_fake_002","msg_sn_fake_003"]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — missing text/subject/attendees_ids, or a rejected api/linkedin/specifics selector field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"413":{"description":"PAYLOAD_TOO_LARGE — an attachment exceeds 5 MiB, or the total body exceeds 8 MiB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"413 error","value":{"code":"PAYLOAD_TOO_LARGE","message":"An uploaded part or the request body exceeds the size limit.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"415":{"description":"Unsupported media type — request must use application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"415 error","value":{"code":"UNSUPPORTED_MEDIA_TYPE","message":"The request content type or attachment format is not accepted.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"RECIPIENT_UNREACHABLE or ACCOUNT_RESTRICTED — the recipient cannot be messaged or the account is restricted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"Send an opening InMail-style message to one or more Sales Navigator members (ACw… IDs). subject is REQUIRED for Sales Navigator (InMail-based messaging). Accepts optional base64-encoded file / voice / video attachments (application/json only; multipart is not supported). Requires a Sales Navigator seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"attendees_ids":{"type":"array","items":{"type":"string"},"description":"Sales Navigator member IDs for the chat recipients (≥ 1, e.g. ACw…)."},"text":{"type":"string","description":"Opening message text (1–8000 chars). Not stored or logged."},"subject":{"type":"string","description":"Subject line; REQUIRED for Sales Navigator (InMail-based messaging), unlike the classic surface where it is optional (≤ 200 chars). Maps into the SN-only specifics branch."},"attachments":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string","description":"Base64-encoded file bytes."},"content_type":{"type":"string","description":"Attachment MIME type (e.g. image/png, audio/mp4)."},"filename":{"type":"string","description":"File name for the attachment."},"send_mode":{"type":"string","enum":["file","native"],"description":"'file' = a normal file attachment; 'native' = a platform-native voice/video bubble.","default":"file"},"metadata":{"type":"object","properties":{"duration":{"type":"integer","minimum":0,"description":"Duration in milliseconds; required for native voice/video."}},"description":"Extra attachment metadata (duration for native voice/video)."}},"required":["content","content_type","filename"]},"description":"Optional file / voice / video attachments (base64-encoded)."}},"required":["attendees_ids","text","subject"]},"examples":{"basic":{"summary":"Open a Sales Navigator chat (subject required)","value":{"attendees_ids":["ACw_sn_lead_001"],"text":"Hi Alice, I noticed your work on AI infra. Would love to connect.","subject":"Intro from Curviate"}},"withAttachment":{"summary":"Start a chat with a base64 file attachment","value":{"attendees_ids":["ACw_sn_lead_001"],"text":"Sharing a one-pager with you.","subject":"Follow-up","attachments":[{"content":"aGVsbG8gd29ybGQ=","content_type":"text/plain","filename":"note.txt","send_mode":"file"}]}}}}}},"x-order":5}},"/v1/{account_id}/sales-navigator/profiles/{identifier}":{"get":{"operationId":"getV1AccountIdSalesNavigatorProfilesIdentifier","tags":["Sales Navigator: User Profile"],"summary":"Get a profile (Sales Navigator)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat resolves the profile view."},{"name":"identifier","in":"path","required":true,"schema":{"type":"string"},"description":"The target profile's public LinkedIn identifier, 'me', or member ID."},{"name":"with_sections","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["linkedin_*","linkedin_experience","linkedin_education","linkedin_languages","linkedin_skills","linkedin_certifications","linkedin_volunteer_experience","linkedin_projects","linkedin_recommendations","linkedin_interests","linkedin_recruiting_activity","linkedin_*_preview","linkedin_experience_preview","linkedin_education_preview","linkedin_languages_preview","linkedin_skills_preview","linkedin_certifications_preview","linkedin_volunteer_experience_preview","linkedin_projects_preview","linkedin_recommendations_preview","linkedin_interests_preview","linkedin_recruiting_activity_preview"]}},"description":"Which Sales Navigator profile sections to fetch (repeatable, flat). Allowed values: linkedin_*, linkedin_experience, linkedin_education, linkedin_languages, linkedin_skills, linkedin_certifications, linkedin_volunteer_experience, linkedin_projects, linkedin_recommendations, linkedin_interests, linkedin_recruiting_activity, and the _preview variant of each. Omit for base fields only."}],"responses":{"200":{"description":"Sales Navigator-enriched LinkedIn profile.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["profile"],"description":"Response type discriminator."},"id":{"type":"string","description":"Opaque Sales Navigator identifier (ACw… format)."},"type":{"type":"string","enum":["individual","organization","other"],"description":"Entity kind."},"display_name":{"type":"string","description":"Full display name."},"provider":{"type":"string","enum":["linkedin"],"description":"Source platform."},"first_name":{"type":"string","description":"Present when available."},"last_name":{"type":"string","description":"Present when available."},"public_identifier":{"type":"string","description":"LinkedIn public identifier. Present when available."},"profile_url":{"type":"string","description":"Sales Navigator profile URL. Present when available."},"public_picture_url":{"type":"string","description":"Profile picture URL. Present when available."},"public_picture_url_large":{"type":"string","description":"Large variant of the profile picture URL. Present when available."},"description":{"type":"string","description":"About/summary text. Present when populated."},"location":{"type":"string","description":"Location as set on the profile. Present when available."},"created_at":{"type":"string","description":"ISO-8601 UTC timestamp. Present when available."},"followers_count":{"type":"number","description":"Present when available."},"relations_count":{"type":"number","description":"Present when available."},"is_blocked":{"type":"boolean","description":"Present when available."},"specifics":{"type":"object","description":"Sales Navigator-specific fields.","properties":{"network_distance":{"type":"string","enum":["SELF","FIRST_DEGREE","SECOND_DEGREE","THIRD_DEGREE","OUT_OF_NETWORK"],"description":"Connection distance as a string enum."},"member_id":{"type":"string","description":"Present when available."},"can_send_inmail":{"type":"boolean","description":"Present when available."},"is_open_profile":{"type":"boolean","description":"Present when available."},"is_premium":{"type":"boolean","description":"true if this is a LinkedIn Premium account."},"is_influencer":{"type":"boolean","description":"Present when available."},"is_creator":{"type":"boolean","description":"Present when available."},"is_hiring":{"type":"boolean","description":"Present when available."},"is_open_to_work":{"type":"boolean","description":"Present when available."},"is_saved_lead":{"type":"boolean","description":"true if this member is saved as a lead in SN. SN enrichment."},"is_crm_imported":{"type":"boolean","description":"true if this member was imported from CRM. SN enrichment."},"skills":{"type":"array","description":"Present when requested via with_sections.","items":{"type":"object","additionalProperties":true}},"experience":{"type":"array","description":"Present when requested via with_sections.","items":{"type":"object","additionalProperties":true}},"education":{"type":"array","description":"Present when requested via with_sections.","items":{"type":"object","additionalProperties":true}},"throttled_sections":{"type":"array","description":"Present when available.","items":{"type":"string"}}},"required":["network_distance"]}},"required":["object","id","type","display_name","provider","specifics"]},"examples":{"basic":{"summary":"Sales Navigator-enriched profile","value":{"object":"profile","id":"ACw_sn_profile_001","type":"individual","display_name":"SN Profile User","provider":"linkedin","first_name":"SN","last_name":"Profile User","public_identifier":"sn-profile-001","profile_url":"https://www.linkedin.com/in/sn-profile-001","public_picture_url":"https://media.licdn.com/dms/image/example/profile002","location":"Frankfurt, Germany","specifics":{"network_distance":"SECOND_DEGREE","is_open_profile":true,"is_premium":true,"is_saved_lead":true,"is_crm_imported":false}}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed identifier or with_sections value.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"RESOURCE_NOT_FOUND — the profile does not exist — or ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Profile or account not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"Retrieve a LinkedIn profile with Sales Navigator enrichment (is_saved_lead, is_crm_imported, under specifics). The {identifier} is the target profile's public LinkedIn identifier, 'me', or member ID. Requires a Sales Navigator seat.","x-order":6}},"/v1/{account_id}/sales-navigator/account-lists":{"get":{"operationId":"getV1AccountIdSalesNavigatorAccountLists","tags":["Sales Navigator: Lists"],"summary":"List account lists (Sales Navigator)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat owns the lists."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Maximum number of items to return (1–100). Default 10."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response. Omit for the first page."}],"responses":{"200":{"description":"The account (company) lists on the operator's Sales Navigator seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["sn_account_list_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"The lists on the operator's Sales Navigator seat.","items":{"type":"object","properties":{"object":{"type":"string","enum":["sn_account_list"],"description":"Item type discriminator."},"id":{"type":"string","description":"List id."},"name":{"type":"string","description":"List display name."},"description":{"type":["string","null"],"description":"List description. May be null."},"items_count":{"type":"number","description":"Number of items in the list."},"last_modified_at":{"type":"string","description":"ISO-8601 last-modified timestamp."},"last_viewed_at":{"type":["string","null"],"description":"ISO-8601 last-viewed timestamp. May be null."}},"required":["object","id","name","items_count","last_modified_at"]}},"paging":{"type":"object","description":"Pagination metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total number of lists. May be null."}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["object","items","paging","cursor"]},"examples":{"basic":{"summary":"Account lists","value":{"object":"sn_account_list_result","items":[{"object":"sn_account_list","id":"sn_acct_list_001","name":"Target Accounts Q3","description":"Prioritised outbound accounts.","items_count":12,"last_modified_at":"2026-06-30T10:00:00.000Z","last_viewed_at":"2026-07-01T08:30:00.000Z"}],"paging":{"total_count":2},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed or missing account_id, limit, cursor, or body field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"RESOURCE_NOT_FOUND — the account_id or list does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account or list not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the account cannot perform this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"List the saved-account (company) lists on the operator's Sales Navigator seat. limit and cursor go in query params. Requires a Sales Navigator seat.","x-order":8}},"/v1/{account_id}/sales-navigator/lead-lists":{"get":{"operationId":"getV1AccountIdSalesNavigatorLeadLists","tags":["Sales Navigator: Lists"],"summary":"List lead lists (Sales Navigator)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat owns the lists."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Maximum number of items to return (1–100). Default 10."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response. Omit for the first page."}],"responses":{"200":{"description":"The lead (member) lists on the operator's Sales Navigator seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["sn_lead_list_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"The lists on the operator's Sales Navigator seat.","items":{"type":"object","properties":{"object":{"type":"string","enum":["sn_lead_list"],"description":"Item type discriminator."},"id":{"type":"string","description":"List id."},"name":{"type":"string","description":"List display name."},"description":{"type":["string","null"],"description":"List description. May be null."},"items_count":{"type":"number","description":"Number of items in the list."},"last_modified_at":{"type":"string","description":"ISO-8601 last-modified timestamp."},"last_viewed_at":{"type":["string","null"],"description":"ISO-8601 last-viewed timestamp. May be null."}},"required":["object","id","name","items_count","last_modified_at"]}},"paging":{"type":"object","description":"Pagination metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total number of lists. May be null."}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["object","items","paging","cursor"]},"examples":{"basic":{"summary":"Lead lists","value":{"object":"sn_lead_list_result","items":[{"object":"sn_lead_list","id":"sn_lead_list_001","name":"Champions","description":"Warm decision-makers.","items_count":27,"last_modified_at":"2026-07-02T09:00:00.000Z","last_viewed_at":"2026-07-03T07:45:00.000Z"}],"paging":{"total_count":2},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed or missing account_id, limit, cursor, or body field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"RESOURCE_NOT_FOUND — the account_id or list does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account or list not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the account cannot perform this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"List the saved-lead (member) lists on the operator's Sales Navigator seat. limit and cursor go in query params. Requires a Sales Navigator seat.","x-order":9}},"/v1/{account_id}/sales-navigator/account-lists/{list_id}":{"post":{"operationId":"postV1AccountIdSalesNavigatorAccountListsListId","tags":["Sales Navigator: Lists"],"summary":"Browse an account list (Sales Navigator)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat owns the list."},{"name":"list_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account-list id (from GET .../sales-navigator/account-lists)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Maximum number of items to return (1–100). Default 10."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response. Omit for the first page."}],"responses":{"200":{"description":"The saved accounts (companies) in one account list.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["sn_saved_account_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"The saved accounts in the list.","items":{"type":"object","properties":{"object":{"type":"string","enum":["sn_saved_account"],"description":"Item type discriminator."},"id":{"type":"string","description":"Item id."},"display_name":{"type":"string","description":"Display name."}},"required":["object","id","display_name"]}},"paging":{"type":"object","properties":{"total_count":{"type":["number","null"],"description":"Total number of items. May be null."}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["object","items","paging","cursor"]},"examples":{"basic":{"summary":"Saved accounts","value":{"object":"sn_saved_account_result","items":[{"object":"sn_saved_account","id":"sn_saved_acct_001","display_name":"Northwind Analytics","industry":"Software Development","is_starred":true,"lists_count":2,"notes_count":1}],"paging":{"total_count":2},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed or missing account_id, limit, cursor, or body field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"RESOURCE_NOT_FOUND — the account_id or list does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account or list not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the account cannot perform this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"Return the saved accounts (companies) in one account list. Pass optional filters (persona, filter, sort_by, sort_order) in the body; limit and cursor go in query params. Requires a Sales Navigator seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"persona":{"type":"string","description":"Persona filter identifier to scope the saved accounts."},"filter":{"type":"string","enum":["STARRED","GROWTH_ALERTS","RISK_ALERTS"],"description":"Restrict to a saved-account subset: STARRED, GROWTH_ALERTS, or RISK_ALERTS."},"sort_by":{"type":"string","enum":["DATE_ADDED","NAME"],"description":"Sort field: DATE_ADDED or NAME. Defaults to NAME.","default":"NAME"},"sort_order":{"type":"string","enum":["ASCENDING","DESCENDING"],"description":"Sort direction: ASCENDING or DESCENDING. Defaults to ASCENDING.","default":"ASCENDING"}}},"examples":{"basic":{"summary":"Browse starred saved accounts, sorted by name","value":{"filter":"STARRED","sort_by":"NAME","sort_order":"ASCENDING"}}}}}},"x-order":10}},"/v1/{account_id}/sales-navigator/lead-lists/{list_id}":{"post":{"operationId":"postV1AccountIdSalesNavigatorLeadListsListId","tags":["Sales Navigator: Lists"],"summary":"Browse a lead list (Sales Navigator)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat owns the list."},{"name":"list_id","in":"path","required":true,"schema":{"type":"string"},"description":"The lead-list id (from GET .../sales-navigator/lead-lists)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Maximum number of items to return (1–100). Default 10."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response. Omit for the first page."}],"responses":{"200":{"description":"The saved leads (members) in one lead list.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["sn_saved_lead_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"The saved leads in the list.","items":{"type":"object","properties":{"object":{"type":"string","enum":["sn_saved_lead"],"description":"Item type discriminator."},"id":{"type":"string","description":"Item id."},"display_name":{"type":"string","description":"Display name."}},"required":["object","id","display_name"]}},"paging":{"type":"object","properties":{"total_count":{"type":["number","null"],"description":"Total number of items. May be null."}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["object","items","paging","cursor"]},"examples":{"basic":{"summary":"Saved leads","value":{"object":"sn_saved_lead_result","items":[{"object":"sn_saved_lead","id":"sn_saved_lead_001","display_name":"Alice Growth","network_distance":"SECOND_DEGREE","is_premium":true,"lists_count":1,"notes_count":2,"saved_at":"2026-07-01T12:00:00.000Z"}],"paging":{"total_count":2},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed or missing account_id, limit, cursor, or body field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"RESOURCE_NOT_FOUND — the account_id or list does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account or list not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the account cannot perform this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"Return the saved leads (members) in one lead list. Pass optional filters (spotlight, sort_by, sort_order) in the body; limit and cursor go in query params. Requires a Sales Navigator seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"spotlight":{"type":"string","enum":["RECENT_POSITION_CHANGE","RECENTLY_POSTED_ON_LINKEDIN","FOLLOW_YOUR_COMPANY","SHARE_EXPERIENCE"],"description":"Restrict to a spotlighted lead subset: RECENT_POSITION_CHANGE, RECENTLY_POSTED_ON_LINKEDIN, FOLLOW_YOUR_COMPANY, or SHARE_EXPERIENCE."},"sort_by":{"type":"string","enum":["DATE_ADDED","ACCOUNT","NAME","OUTREACH_ACTIVITY"],"description":"Sort field: DATE_ADDED, ACCOUNT, NAME, or OUTREACH_ACTIVITY. Defaults to DATE_ADDED.","default":"DATE_ADDED"},"sort_order":{"type":"string","enum":["ASCENDING","DESCENDING"],"description":"Sort direction: ASCENDING or DESCENDING. Defaults to DESCENDING.","default":"DESCENDING"}}},"examples":{"basic":{"summary":"Browse leads with a recent position change","value":{"spotlight":"RECENT_POSITION_CHANGE","sort_by":"DATE_ADDED","sort_order":"DESCENDING"}}}}}},"x-order":11}},"/v1/{account_id}/sales-navigator/account-lists/{list_id}/save":{"post":{"operationId":"postV1AccountIdSalesNavigatorAccountListsListIdSave","tags":["Sales Navigator: Lists"],"summary":"Save an account to a list (Sales Navigator)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat saves the account."},{"name":"list_id","in":"path","required":true,"schema":{"type":"string"},"description":"The target account-list id to save the company into."}],"responses":{"200":{"description":"Account saved into the list.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["sn_account_saved"],"description":"Response type discriminator."},"list_id":{"type":"string","description":"The account list the company was saved into."},"company_id":{"type":"string","description":"The LinkedIn company id that was saved."}},"required":["object","list_id","company_id"]},"examples":{"basic":{"summary":"Account saved","value":{"object":"sn_account_saved","list_id":"sn_acct_list_001","company_id":"123456"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed or missing account_id, limit, cursor, or body field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"RESOURCE_NOT_FOUND — the account_id or list does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account or list not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the account cannot perform this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"Save a LinkedIn company into an account list. company_id goes in the body. Requires a Sales Navigator seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_id":{"type":"string","description":"The LinkedIn company id to save into the account list."}},"required":["company_id"]},"examples":{"basic":{"summary":"Save a company into an account list","value":{"company_id":"123456"}}}}}},"x-order":12}},"/v1/{account_id}/sales-navigator/lead-lists/{list_id}/save":{"post":{"operationId":"postV1AccountIdSalesNavigatorLeadListsListIdSave","tags":["Sales Navigator: Lists"],"summary":"Save a lead","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat saves the lead."},{"name":"list_id","in":"path","required":true,"schema":{"type":"string"},"description":"The target lead-list id to save the member into."}],"responses":{"200":{"description":"Lead saved into the list.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["sn_lead_saved"],"description":"Response type discriminator."},"list_id":{"type":"string","description":"The lead list the member was saved into."},"user_id":{"type":"string","description":"The LinkedIn member id that was saved."}},"required":["object","list_id","user_id"]},"examples":{"basic":{"summary":"Lead saved","value":{"object":"sn_lead_saved","list_id":"sn_lead_list_001","user_id":"ACwAABxyz"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed or missing account_id, limit, cursor, or body field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"RESOURCE_NOT_FOUND — the account_id or list does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account or list not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the account cannot perform this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"Save a LinkedIn member into a lead list. user_id goes in the body. Requires a Sales Navigator seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"user_id":{"type":"string","description":"The LinkedIn member id to save into the lead list."}},"required":["user_id"]},"examples":{"basic":{"summary":"Save a member into a lead list","value":{"user_id":"ACwAABxyz"}}}}}},"x-order":13}},"/v1/{account_id}/sales-navigator/search/parameters":{"get":{"operationId":"getV1AccountIdSalesNavigatorSearchParameters","tags":["Sales Navigator: Search"],"summary":"Resolve search-filter IDs (Sales Navigator)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat resolves the parameters."},{"name":"type","in":"query","required":true,"schema":{"type":"string","enum":["COMPANY","ACCOUNT_LIST","LEAD_LIST","LOCATION","POSTAL_CODE","JOB_FUNCTION","JOB_TITLE","INDUSTRY","GROUP","SCHOOL","RELATION","PERSONA","SAVED_PEOPLE_SEARCH","SAVED_COMPANY_SEARCH","RECENT_SEARCH","PROFILE_LANGUAGE"]},"description":"The Sales Navigator filter parameter family to resolve. Exactly one of: COMPANY, ACCOUNT_LIST, LEAD_LIST, LOCATION, POSTAL_CODE, JOB_FUNCTION, JOB_TITLE, INDUSTRY, GROUP, SCHOOL, RELATION, PERSONA, SAVED_PEOPLE_SEARCH, SAVED_COMPANY_SEARCH, RECENT_SEARCH, PROFILE_LANGUAGE. Any other value is rejected with 400."},{"name":"keywords","in":"query","required":false,"schema":{"type":"string"},"description":"Human-readable term to search within the parameter family."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"description":"Maximum number of parameter items to return (1–100)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior response. Omit for the first page."}],"responses":{"200":{"description":"Resolved Sales Navigator filter parameter IDs. Pass the returned id values in structured filter include/exclude arrays.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["sn_search_parameter_list"],"description":"Response type discriminator."},"items":{"type":"array","description":"Resolved filter items.","items":{"type":"object","description":"A single Sales Navigator search filter parameter item. Maps an opaque ID to a human-readable name.","properties":{"id":{"type":"string","description":"Opaque filter ID to pass in structured filter include/exclude arrays."},"name":{"type":"string","description":"Human-readable filter name (e.g. 'Software Development')."},"metadata":{"type":"object","description":"Additional metadata. Present only for the saved-search types (SAVED_PEOPLE_SEARCH, SAVED_COMPANY_SEARCH). Pass-through; not stored.","additionalProperties":true}},"required":["id","name"]}},"paging":{"type":"object","description":"Pagination metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total number of items. May be null."}}},"cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["object","items","paging","cursor"]},"examples":{"basic":{"summary":"Sales Navigator parameter resolution result","value":{"object":"sn_search_parameter_list","items":[{"id":"8542","name":"Software Development"},{"id":"4","name":"Internet"}],"paging":{"total_count":2},"cursor":null}},"savedSearch":{"summary":"A saved-search type carries metadata","value":{"object":"sn_search_parameter_list","items":[{"id":"ss_001","name":"My Saved Search","metadata":{"product":"sales_navigator","last_viewed_at":"2026-07-01T00:00:00.000Z","new_results_count":3}}],"paging":{"total_count":1},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed or missing account_id, limit, cursor, or body field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"RESOURCE_NOT_FOUND — the account_id or list does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account or list not found","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the account cannot perform this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"Resolve human-readable terms to opaque Sales Navigator filter IDs for use in people or company search requests. The type parameter selects the filter family; type must be one of the 16 Sales Navigator values. Any other value is rejected with 400 at schema validation, before any external call. Requires a Sales Navigator seat.","x-order":14}},"/v1/{account_id}/sales-navigator/search/people":{"post":{"operationId":"postV1AccountIdSalesNavigatorSearchPeople","tags":["Sales Navigator: Search"],"summary":"Search people (Sales Navigator)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat performs the search."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"description":"Number of results to return (1–100). Default 25."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response."}],"responses":{"200":{"description":"Sales Navigator people search results.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["sn_people_search_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"Sales Navigator people search result items.","items":{"type":"object","description":"A single Sales Navigator people search result item.","properties":{"object":{"type":"string","enum":["sn_people_search_result"],"description":"Item type discriminator."},"id":{"type":"string","description":"Opaque Sales Navigator member ID (ACw… format)."},"member_id":{"type":"string","description":"Numeric member ID, distinct from id. Present when available."},"display_name":{"type":"string","description":"Full display name. Present when available."},"public_identifier":{"type":"string","description":"LinkedIn public identifier (the slug after linkedin.com/in/). Present when available."},"profile_url":{"type":"string","description":"Sales Navigator profile URL. Present when available."},"public_picture_url":{"type":"string","description":"Profile picture URL. Present when available."},"public_picture_url_large":{"type":"string","description":"Large variant of the profile picture URL. Present when available."},"relations_count":{"type":"number","description":"Connection count. Present when available."},"location":{"type":"string","description":"Member location. Present when available."},"headline":{"type":"string","description":"LinkedIn headline. Present when available."},"summary":{"type":"string","description":"About section text. Present when populated."},"network_distance":{"type":"string","description":"Connection distance to the operator account. Present when available."},"can_send_inmail":{"type":"boolean","description":"Whether an InMail can be sent to this member."},"shared_relations_count":{"type":"number","description":"Shared connections count. Present when available."},"has_been_viewed":{"type":"boolean"},"has_been_saved":{"type":"boolean"},"has_posted_recently":{"type":"boolean"},"has_viewed_your_profile":{"type":"boolean"},"was_hired_recently":{"type":"boolean"},"was_promoted_recently":{"type":"boolean"},"follows_your_company":{"type":"boolean"},"is_premium":{"type":"boolean"},"is_past_colleague":{"type":"boolean"},"is_open_profile":{"type":"boolean"},"websites":{"type":"array","description":"Present when available.","items":{"type":"object","additionalProperties":true}},"addresses":{"type":"array","description":"Present when available.","items":{"type":"object","additionalProperties":true}},"contact_info":{"type":"object","description":"Contact info. Present when available.","properties":{"phones":{"type":"array","items":{"type":"object","additionalProperties":true}},"emails":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"latest_contact":{"type":"object","description":"Present when available.","properties":{"type":{"type":"string"},"performed_at":{"type":"string","description":"ISO-8601 UTC timestamp."},"resource_id":{"type":"string"}}},"lists_count":{"type":"number"},"notes_count":{"type":"number"},"social_handles":{"type":"object","properties":{"twitter":{"type":"string"}}},"education":{"type":"array","description":"Present when available.","items":{"type":"object","additionalProperties":true}},"skills":{"type":"array","description":"Present when available.","items":{"type":"object","properties":{"name":{"type":"string"},"endorsement_count":{"type":"number"}}}},"work_experience":{"type":"array","description":"Present when available.","items":{"type":"object","additionalProperties":true}},"languages":{"type":"array","description":"Present when available.","items":{"type":"object","properties":{"language":{"type":"string"},"proficiency":{"type":"string"}}}},"volunteering":{"type":"array","description":"Present when available.","items":{"type":"object","additionalProperties":true}}},"required":["object","id"]}},"paging":{"type":"object","description":"Pagination metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total number of matching results. May be null."}}},"cursor":{"type":["string","null"],"description":"Opaque pagination cursor. Null when exhausted."}},"required":["object","items","paging","cursor"]},"examples":{"basic":{"summary":"People search result envelope","value":{"object":"sn_people_search_result","items":[{"object":"sn_people_search_result","id":"ACw_sn_lead_001","member_id":"111001","display_name":"Alice Growth","public_identifier":"alice-growth","profile_url":"https://www.linkedin.com/sales/lead/ACw_sn_lead_001","public_picture_url":"https://media.licdn.com/dms/image/example/profile001","location":"Berlin, Germany","headline":"Head of AI Infrastructure","network_distance":"SECOND_DEGREE","is_premium":true,"is_open_profile":true}],"paging":{"total_count":48},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed filter body, or invalid limit/cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the account cannot perform this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded. Retry after the period indicated in the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"Search for LinkedIn members using the full Sales Navigator people filter set. Pass structured filters in the body — resolve filter IDs first via GET .../search/parameters. limit and cursor go in query params. To search from a pasted URL instead, use POST .../sales-navigator/search. Requires a Sales Navigator seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"string","description":"Free-text keyword filter."},"current_company":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"Current-employer COMPANY parameter IDs to include or exclude."},"past_company":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"Past-employer COMPANY parameter IDs to include or exclude."},"company_location":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"LOCATION parameter IDs for the current company's HQ to include or exclude."},"account_list":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"ACCOUNT_LIST parameter IDs to include or exclude."},"function":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"JOB_FUNCTION parameter IDs to include or exclude."},"current_job_title":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"Current-role JOB_TITLE parameter IDs to include or exclude."},"past_job_title":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"Past-role JOB_TITLE parameter IDs to include or exclude."},"persona":{"type":"array","items":{"type":"string"},"description":"PERSONA parameter IDs to filter by."},"location":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"LOCATION parameter IDs to include or exclude."},"postal_code":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}},"radius":{"type":"number","enum":[1,5,10,25,35,50,75,100],"description":"Search radius in miles around the postal code location: 1, 5, 10, 25, 35, 50, 75, or 100."}},"description":"POSTAL_CODE parameter IDs to include or exclude, plus an optional radius in miles."},"industry":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"INDUSTRY parameter IDs to include or exclude."},"group":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"GROUP parameter IDs to include or exclude."},"school":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"SCHOOL parameter IDs to include or exclude."},"profile_language":{"type":"array","items":{"type":"string"},"description":"PROFILE_LANGUAGE parameter IDs to filter by."},"lead_list":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"LEAD_LIST parameter IDs to include or exclude."},"seniority":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string","enum":["OWNER/PARTNER","CXO","VICE_PRESIDENT","DIRECTOR","EXPERIENCED_MANAGER","ENTRY_LEVEL_MANAGER","STRATEGIC","SENIOR","ENTRY_LEVEL","IN_TRAINING"]}},"exclude":{"type":"array","items":{"type":"string","enum":["OWNER/PARTNER","CXO","VICE_PRESIDENT","DIRECTOR","EXPERIENCED_MANAGER","ENTRY_LEVEL_MANAGER","STRATEGIC","SENIOR","ENTRY_LEVEL","IN_TRAINING"]}}},"description":"Seniority levels to include or exclude."},"company_headcount":{"type":"array","items":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"]},"description":"Company headcount ranges."},"years_in_company":{"type":"array","items":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"]},"description":"Years-in-current-company ranges."},"years_in_position":{"type":"array","items":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"]},"description":"Years-in-current-position ranges."},"years_of_experience":{"type":"array","items":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"]},"description":"Total years-of-experience ranges."},"company_type":{"type":"array","items":{"type":"string","enum":["PUBLIC_COMPANY","PRIVATELY_HELD","NON_PROFIT","EDUCATIONAL_INSTITUTION","PARTNERSHIP","SELF_EMPLOYED","SELF_OWNED","GOVERNMENT_AGENCY"]},"description":"Company type filter."},"network_distance":{"type":"array","items":{"oneOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"string","const":"GROUP"}]},"description":"Connection distance: 1 (1st), 2 (2nd), 3 (3rd+), 'GROUP' (group members)."},"connections_of":{"type":"array","items":{"type":"string"},"description":"PEOPLE parameter IDs used to filter to connections of these members."},"first_name":{"type":"array","items":{"type":"string"},"description":"First names to filter by."},"last_name":{"type":"array","items":{"type":"string"},"description":"Last names to filter by."},"recent_interaction":{"type":"object","properties":{"viewed_profile":{"type":"boolean"},"messaged":{"type":"boolean"}},"description":"Filter by recent interaction with the operator account."},"saved_resources":{"type":"object","properties":{"saved_leads":{"type":"boolean"},"saved_accounts":{"type":"boolean"}},"description":"Include results from the operator's saved leads/accounts."},"save_search":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"],"description":"Save this search with the given name for later retrieval."},"load_saved_search":{"type":"object","properties":{"id":{"type":"string"},"last_viewed_at":{"type":"integer"}},"required":["id"],"description":"Load and run a previously saved search by ID."},"load_recent_search":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"description":"Load and run a recent search by ID."},"following_your_company":{"type":"boolean","description":"Filter to members following your company."},"viewed_your_profile_recently":{"type":"boolean","description":"Filter to members who viewed your profile recently."},"past_colleague":{"type":"boolean","description":"Filter to past colleagues."},"shared_experiences":{"type":"boolean","description":"Filter to members with shared experiences."},"changed_jobs":{"type":"boolean","description":"Filter to members who recently changed jobs."},"posted_on_linkedin":{"type":"boolean","description":"Filter to members who recently posted on LinkedIn."}}},"examples":{"structured":{"summary":"Search by keyword with SN-specific filters","value":{"keywords":"ai infrastructure","location":{"include":["101282230"]},"seniority":{"include":["DIRECTOR","VICE_PRESIDENT"]},"company_headcount":[{"min":51,"max":200}]}},"groupFilter":{"summary":"Filter to members of a specific Sales Navigator group","value":{"keywords":"machine learning","group":{"include":["12345"]},"network_distance":[2,3]}},"savedResources":{"summary":"Restrict to saved leads/accounts and recent-interaction signals","value":{"saved_resources":{"saved_leads":true},"recent_interaction":{"viewed_profile":true}}}}}}},"x-order":15}},"/v1/{account_id}/sales-navigator/search/companies":{"post":{"operationId":"postV1AccountIdSalesNavigatorSearchCompanies","tags":["Sales Navigator: Search"],"summary":"Search companies (Sales Navigator)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat performs the search."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"description":"Number of results to return (1–100). Default 25."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response."}],"responses":{"200":{"description":"Sales Navigator company search results.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["sn_company_search_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"Sales Navigator company search result items.","items":{"type":"object","description":"A single Sales Navigator company search result item.","properties":{"object":{"type":"string","enum":["sn_company_search_result"],"description":"Item type discriminator."},"id":{"type":"string","description":"Sales Navigator company ID."},"display_name":{"type":"string","description":"Company display name. Present when available."},"lists_count":{"type":"number"},"notes_count":{"type":"number"},"has_been_saved":{"type":"boolean"},"is_starred":{"type":"boolean"},"public_identifier":{"type":"string"},"profile_url":{"type":"string","description":"Company LinkedIn profile URL. Present when available."},"public_picture_url":{"type":"string"},"public_picture_url_large":{"type":"string"},"location":{"type":"string","description":"Company headquarters location. Present when available."},"industry":{"type":"string","description":"Industry the company operates in. Present when available."},"summary":{"type":"string","description":"Company summary text. Present when populated."},"relations_count":{"type":"number"},"type":{"type":"string","description":"Vendor-reported company type (e.g. 'Public Company'). Genuine content field."},"headcount":{"type":"number","description":"Employee count. Present when available."},"specialties":{"description":"Present when available."},"is_hiring_on_linkedin":{"type":"boolean"},"website":{"type":"string","description":"Company website URL. Present when available."},"founded_on":{"description":"Year or date the company was founded. Present when available."}},"required":["object","id"]}},"paging":{"type":"object","description":"Pagination metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total number of matching results. May be null."}}},"cursor":{"type":["string","null"],"description":"Opaque pagination cursor. Null when exhausted."}},"required":["object","items","paging","cursor"]},"examples":{"basic":{"summary":"Companies search result envelope","value":{"object":"sn_company_search_result","items":[{"object":"sn_company_search_result","id":"co_sn_001","display_name":"GrowthCo","location":"Berlin, Germany","profile_url":"https://www.linkedin.com/company/growthco","industry":"Software Development","type":"Public Company","headcount":150,"is_hiring_on_linkedin":true}],"paging":{"total_count":28},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed filter body, or invalid limit/cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the account cannot perform this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded. Retry after the period indicated in the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"Search for LinkedIn companies using the full Sales Navigator company filter set. Pass structured filters in the body — resolve filter IDs first via GET .../search/parameters. limit and cursor go in query params. To search from a pasted URL instead, use POST .../sales-navigator/search. Requires a Sales Navigator seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"string","description":"Free-text keyword filter."},"annual_revenue":{"type":"object","properties":{"min":{"type":"number","description":"Minimum annual revenue (millions)."},"max":{"type":"number","description":"Maximum annual revenue (millions)."},"currency":{"type":"string","description":"ISO 4217 three-character currency code (e.g. 'USD')."}},"required":["currency"],"description":"Annual revenue range."},"headcount":{"type":"array","items":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"]},"description":"Company headcount ranges."},"followers":{"type":"array","items":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"]},"description":"Follower count ranges."},"fortune":{"type":"array","items":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"]},"description":"Fortune ranking ranges."},"headcount_growth":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"description":"Headcount growth percentage range."},"department_headcount":{"type":"object","properties":{"department":{"type":"string","description":"A single JOB_FUNCTION parameter ID (required, singular)."},"min":{"type":"number"},"max":{"type":"number"}},"required":["department","min","max"],"description":"Filter by department headcount. department, min, and max are all required when this filter is present."},"department_headcount_growth":{"type":"object","properties":{"department":{"type":"string","description":"A single JOB_FUNCTION parameter ID (required, singular)."},"min":{"type":"number"},"max":{"type":"number"}},"required":["department","min","max"],"description":"Filter by department headcount growth. department, min, and max are all required when this filter is present."},"location":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"LOCATION parameter IDs to include or exclude."},"postal_code":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"POSTAL_CODE parameter IDs to include or exclude (no radius for companies)."},"industry":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"INDUSTRY parameter IDs to include or exclude."},"account_list":{"type":"object","properties":{"include":{"type":"array","items":{"type":"string"}},"exclude":{"type":"array","items":{"type":"string"}}},"description":"ACCOUNT_LIST parameter IDs to include or exclude."},"spotlights":{"type":"array","items":{"type":"string","enum":["HIRING_ON_LINKEDIN","RECENT_LEADERSHIP_CHANGE","RECENT_FUNDING_EVENTS","FIRST_DEGREE_CONNECTIONS"]},"description":"Company activity spotlights to filter by."},"saved_accounts":{"type":"boolean","description":"Filter to the operator's saved accounts."},"save_search":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"],"description":"Save this search with the given name for later retrieval."},"load_saved_search":{"type":"object","properties":{"id":{"type":"string"},"last_viewed_at":{"type":"integer"}},"required":["id"],"description":"Load and run a previously saved search by ID."},"load_recent_search":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"description":"Load and run a recent search by ID."}}},"examples":{"structured":{"summary":"Search SN companies with headcount and revenue filters","value":{"keywords":"ai tooling","headcount":[{"min":51,"max":200}],"annual_revenue":{"currency":"USD","min":5,"max":50},"industry":{"include":["4"]}}},"spotlights":{"summary":"Filter to companies hiring on LinkedIn","value":{"keywords":"fintech","spotlights":["HIRING_ON_LINKEDIN"]}}}}}},"x-order":16}},"/v1/{account_id}/sales-navigator/search":{"post":{"operationId":"postV1AccountIdSalesNavigatorSearch","tags":["Sales Navigator: Search"],"summary":"Search from a pasted URL (Sales Navigator)","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) whose Sales Navigator seat performs the search."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"description":"Number of results to return (1–50). Default 10."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response."}],"responses":{"200":{"description":"Sales Navigator search results from a pasted URL. Items are polymorphic — discriminated individually by object.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["sn_search_result"],"description":"Response type discriminator."},"items":{"type":"array","description":"A mix of people, company, saved-lead, and saved-account items, each discriminated by its own object value.","items":{"oneOf":[{"type":"object","description":"A single Sales Navigator people search result item.","properties":{"object":{"type":"string","enum":["sn_people_search_result"],"description":"Item type discriminator."},"id":{"type":"string","description":"Opaque Sales Navigator member ID (ACw… format)."},"member_id":{"type":"string","description":"Numeric member ID, distinct from id. Present when available."},"display_name":{"type":"string","description":"Full display name. Present when available."},"public_identifier":{"type":"string","description":"LinkedIn public identifier (the slug after linkedin.com/in/). Present when available."},"profile_url":{"type":"string","description":"Sales Navigator profile URL. Present when available."},"public_picture_url":{"type":"string","description":"Profile picture URL. Present when available."},"public_picture_url_large":{"type":"string","description":"Large variant of the profile picture URL. Present when available."},"relations_count":{"type":"number","description":"Connection count. Present when available."},"location":{"type":"string","description":"Member location. Present when available."},"headline":{"type":"string","description":"LinkedIn headline. Present when available."},"summary":{"type":"string","description":"About section text. Present when populated."},"network_distance":{"type":"string","description":"Connection distance to the operator account. Present when available."},"can_send_inmail":{"type":"boolean","description":"Whether an InMail can be sent to this member."},"shared_relations_count":{"type":"number","description":"Shared connections count. Present when available."},"has_been_viewed":{"type":"boolean"},"has_been_saved":{"type":"boolean"},"has_posted_recently":{"type":"boolean"},"has_viewed_your_profile":{"type":"boolean"},"was_hired_recently":{"type":"boolean"},"was_promoted_recently":{"type":"boolean"},"follows_your_company":{"type":"boolean"},"is_premium":{"type":"boolean"},"is_past_colleague":{"type":"boolean"},"is_open_profile":{"type":"boolean"},"websites":{"type":"array","description":"Present when available.","items":{"type":"object","additionalProperties":true}},"addresses":{"type":"array","description":"Present when available.","items":{"type":"object","additionalProperties":true}},"contact_info":{"type":"object","description":"Contact info. Present when available.","properties":{"phones":{"type":"array","items":{"type":"object","additionalProperties":true}},"emails":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"latest_contact":{"type":"object","description":"Present when available.","properties":{"type":{"type":"string"},"performed_at":{"type":"string","description":"ISO-8601 UTC timestamp."},"resource_id":{"type":"string"}}},"lists_count":{"type":"number"},"notes_count":{"type":"number"},"social_handles":{"type":"object","properties":{"twitter":{"type":"string"}}},"education":{"type":"array","description":"Present when available.","items":{"type":"object","additionalProperties":true}},"skills":{"type":"array","description":"Present when available.","items":{"type":"object","properties":{"name":{"type":"string"},"endorsement_count":{"type":"number"}}}},"work_experience":{"type":"array","description":"Present when available.","items":{"type":"object","additionalProperties":true}},"languages":{"type":"array","description":"Present when available.","items":{"type":"object","properties":{"language":{"type":"string"},"proficiency":{"type":"string"}}}},"volunteering":{"type":"array","description":"Present when available.","items":{"type":"object","additionalProperties":true}}},"required":["object","id"]},{"type":"object","description":"A single Sales Navigator company search result item.","properties":{"object":{"type":"string","enum":["sn_company_search_result"],"description":"Item type discriminator."},"id":{"type":"string","description":"Sales Navigator company ID."},"display_name":{"type":"string","description":"Company display name. Present when available."},"lists_count":{"type":"number"},"notes_count":{"type":"number"},"has_been_saved":{"type":"boolean"},"is_starred":{"type":"boolean"},"public_identifier":{"type":"string"},"profile_url":{"type":"string","description":"Company LinkedIn profile URL. Present when available."},"public_picture_url":{"type":"string"},"public_picture_url_large":{"type":"string"},"location":{"type":"string","description":"Company headquarters location. Present when available."},"industry":{"type":"string","description":"Industry the company operates in. Present when available."},"summary":{"type":"string","description":"Company summary text. Present when populated."},"relations_count":{"type":"number"},"type":{"type":"string","description":"Vendor-reported company type (e.g. 'Public Company'). Genuine content field."},"headcount":{"type":"number","description":"Employee count. Present when available."},"specialties":{"description":"Present when available."},"is_hiring_on_linkedin":{"type":"boolean"},"website":{"type":"string","description":"Company website URL. Present when available."},"founded_on":{"description":"Year or date the company was founded. Present when available."}},"required":["object","id"]},{"type":"object","description":"A saved-lead item (see the Lists subgroup for the full shape).","properties":{"object":{"type":"string","enum":["sn_saved_lead"],"description":"Item type discriminator."},"id":{"type":"string"},"display_name":{"type":"string"},"saved_at":{"type":"string","description":"ISO-8601 timestamp. Present when available."}},"required":["object","id","display_name"]},{"type":"object","description":"A saved-account item (see the Lists subgroup for the full shape).","properties":{"object":{"type":"string","enum":["sn_saved_account"],"description":"Item type discriminator."},"id":{"type":"string"},"display_name":{"type":"string"}},"required":["object","id","display_name"]}]}},"paging":{"type":"object","description":"Pagination metadata.","properties":{"total_count":{"type":["number","null"],"description":"Total number of matching results. May be null."}}},"cursor":{"type":["string","null"],"description":"Opaque pagination cursor. Null when exhausted."}},"required":["object","items","paging","cursor"]},"examples":{"mixed":{"summary":"Mixed people + saved-lead result (per-item discrimination)","value":{"object":"sn_search_result","items":[{"object":"sn_people_search_result","id":"ACw_sn_lead_001","member_id":"111001","display_name":"Alice Growth","public_identifier":"alice-growth","profile_url":"https://www.linkedin.com/sales/lead/ACw_sn_lead_001","public_picture_url":"https://media.licdn.com/dms/image/example/profile001","location":"Berlin, Germany","headline":"Head of AI Infrastructure","network_distance":"SECOND_DEGREE","is_premium":true,"is_open_profile":true},{"object":"sn_saved_lead","id":"ACw_sn_saved_lead_003","display_name":"Carol Saved","saved_at":"2026-07-01T12:00:00.000Z"}],"paging":{"total_count":2},"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed filter body, or invalid limit/cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Unauthenticated — missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"403":{"description":"Forbidden. Either TIER_NOT_ACTIVE — the Curviate seat lacks the Sales Navigator add-on (carries required_tier:'sales_nav'; upgrade the Curviate subscription) — or LINKEDIN_FEATURE_NOT_SUBSCRIBED — the connected LinkedIn account lacks the Sales Navigator subscription (activate it on LinkedIn; reconnecting will not help). The code field distinguishes the two.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"feature_not_subscribed":{"summary":"LinkedIn account lacks Sales Navigator subscription","value":{"code":"LINKEDIN_FEATURE_NOT_SUBSCRIBED","message":"This LinkedIn account does not have the feature or subscription required for this operation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"ACCOUNT_NOT_FOUND — the account_id does not exist or does not belong to this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"Account not found","value":{"code":"ACCOUNT_NOT_FOUND","message":"The account_id does not exist or does not belong to this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"ACCOUNT_RESTRICTED — the account cannot perform this operation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"RATE_LIMIT_ACCOUNT — request rate exceeded. Retry after the period indicated in the Retry-After header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"sn","x-badges":[{"name":"+SN","position":"after","color":"#E8352F"}],"description":"Run a pasted Sales Navigator search, saved-search, or lead-list URL directly. url is the only accepted body field — this is the sole home of URL-mode; the structured search/people and search/companies endpoints no longer accept url. The response is polymorphic: each item is discriminated individually by its own kind (a person, a company, a saved lead, or a saved account). limit (1-50) and cursor go in query params. Requires a Sales Navigator seat.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"A pasted Sales Navigator search, saved-search, or lead-list URL. The only accepted field on this endpoint."}},"required":["url"]},"examples":{"pastedSearchUrl":{"summary":"Run a pasted Sales Navigator people-search URL","value":{"url":"https://www.linkedin.com/sales/search/people?query=(keywords%3Aai%20infrastructure)"}}}}}},"x-order":17}},"/v1/accounts":{"get":{"operationId":"getV1Accounts","tags":["Accounts"],"summary":"List connected LinkedIn accounts","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":250},"description":"Number of accounts to return per page (1–250, default 50)."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a prior page's `cursor` field. Omit for the first page."}],"responses":{"200":{"description":"A page of connected accounts plus the next-page cursor (null when exhausted).","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["account_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","properties":{"account_id":{"type":"string","description":"Curviate account id (acc_…)."},"status":{"type":"string","enum":["active","reconnect_needed","restricted","connecting","disconnected"],"description":"Stable status whitelist."},"auth_method":{"type":"string","enum":["credentials","cookie","hosted"]},"full_name":{"type":["string","null"]},"headline":{"type":["string","null"]},"seat_id":{"type":["string","null"],"description":"The seat this account occupies."},"connected_at":{"type":["string","null"],"description":"ISO-8601 UTC connection timestamp."},"requested_products":{"type":["array","null"],"items":{"type":"string","enum":["classic","company","sales_navigator","recruiter"]},"description":"The seat-derived connection scope this account was last connected with (e.g. [\"classic\",\"company\",\"sales_navigator\"]). Scope is derived from the account's seat — there is no products input. Null for accounts connected before this was recorded; not attachment truth for Company Pages."},"substrate_created_at":{"type":["string","null"],"description":"ISO-8601 UTC creation timestamp of the underlying LinkedIn account — distinct from connected_at. Null until the first background enrichment lands."}}}},"cursor":{"type":["string","null"],"description":"Next-page cursor; null on the last page."}}},"examples":{"page":{"summary":"First page of two accounts","value":{"object":"account_list","items":[{"account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","status":"active","auth_method":"cookie","full_name":"Ada Lovelace","headline":"Engineer","seat_id":"seat_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","connected_at":"2026-06-01T09:00:00.000Z","substrate_created_at":"2025-01-15T09:30:00.000Z"}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"limit out of range (1-250) or malformed cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"description":"List the tenant's connected (non-archived) LinkedIn accounts, cursor-paginated. Use `limit` (1–250, default 50) and `cursor` (from a prior page's `cursor` field) to page; `cursor` is null on the last page.","x-order":1}},"/v1/accounts/{account_id}":{"get":{"operationId":"getV1AccountsAccountId","tags":["Accounts"],"summary":"Get a linked LinkedIn account","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) of the account to retrieve."}],"responses":{"200":{"description":"The account's metadata and current state, including the central quotas[] view — one entry per tracked quota family for this account.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["account"],"description":"Response type discriminator."},"account_id":{"type":"string"},"status":{"type":"string","enum":["active","reconnect_needed","restricted","connecting","disconnected"]},"auth_method":{"type":"string"},"full_name":{"type":["string","null"]},"headline":{"type":["string","null"]},"connected_at":{"type":["string","null"],"description":"ISO-8601 UTC connection timestamp."},"last_checked_at":{"type":"string","description":"ISO-8601 UTC time the account state was last checked."},"seat_id":{"type":["string","null"],"description":"The seat this account occupies (null for an admin seatless account)."},"requested_products":{"type":["array","null"],"items":{"type":"string","enum":["classic","company","sales_navigator","recruiter"]},"description":"The seat-derived connection scope this account was last connected with (e.g. [\"classic\",\"company\",\"sales_navigator\"]). Scope is derived from the account's seat — there is no products input. Null for accounts connected before this was recorded; not attachment truth for Company Pages."},"substrate_created_at":{"type":["string","null"],"description":"ISO-8601 UTC creation timestamp of the underlying LinkedIn account — distinct from connected_at. Null until the first background enrichment lands."},"quotas":{"type":"array","description":"Usage-safety recommendations for this account — one entry per tracked family (messages.daily, connection_requests.daily, profile_views.daily, inmail.daily, profile.endorse, account.per_minute). These are advisory only: Curviate never rejects a request because a daily recommendation is exceeded; only account.per_minute is a binding limit enforced with HTTP 429.","items":{"type":"object","properties":{"quota_name":{"type":"string","description":"Quota family (e.g. messages.daily, account.per_minute)."},"remaining":{"type":"number","description":"Remaining units in the current window."},"total":{"type":"number","description":"Window capacity for this family."},"reset_time":{"type":"string","description":"ISO-8601 UTC time the current window resets."},"recommended_throttle_hint":{"type":"string","enum":["none","slow_down","backoff","stop"],"description":"Pacing recommendation for this family, advisory only. `none` (under 80% consumed), `slow_down` (80-99% consumed), and `backoff` (100%+ consumed) never block a request. `stop` is reserved exclusively for `account.per_minute` — the sole binding limit, whose breach is enforced with HTTP 429."}}}}}},"examples":{"account":{"summary":"An active account with its quota view","value":{"object":"account","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","status":"active","auth_method":"cookie","full_name":"Ada Lovelace","headline":"Engineer","connected_at":"2026-06-01T09:00:00.000Z","last_checked_at":"2026-06-08T09:00:00.000Z","seat_id":"seat_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","substrate_created_at":"2025-01-15T09:30:00.000Z","requested_products":["classic","company","sales_navigator"],"quotas":[{"quota_name":"messages.daily","remaining":99,"total":100,"reset_time":"2026-06-11T00:00:00Z","recommended_throttle_hint":"none"},{"quota_name":"connection_requests.daily","remaining":120,"total":120,"reset_time":"2026-06-11T00:00:00Z","recommended_throttle_hint":"none"},{"quota_name":"profile_views.daily","remaining":100,"total":100,"reset_time":"2026-06-11T00:00:00Z","recommended_throttle_hint":"none"},{"quota_name":"inmail.daily","remaining":60,"total":60,"reset_time":"2026-06-11T00:00:00Z","recommended_throttle_hint":"none"},{"quota_name":"profile.endorse","remaining":40,"total":40,"reset_time":"2026-06-11T00:00:00Z","recommended_throttle_hint":"none"},{"quota_name":"account.per_minute","remaining":3000,"total":3000,"reset_time":"2026-06-10T10:01:00Z","recommended_throttle_hint":"none"}]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"No such account for this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Return the metadata and current state for one connected account. Status is mapped to the stable whitelist: active | reconnect_needed | restricted | connecting.","x-order":2},"patch":{"operationId":"patchV1AccountsAccountId","tags":["Accounts"],"summary":"Update account metadata / proxy configuration","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) of the account to update."}],"responses":{"200":{"description":"The account metadata / proxy configuration was updated.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["account"],"description":"Response type discriminator."},"account_id":{"type":"string"}}},"examples":{"patched":{"summary":"Updated","value":{"object":"account","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — a malformed proxy object or an unsupported field (country/ip are no longer accepted).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"No such account for this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"501":{"description":"This proxy configuration is not supported for this account (e.g. the requested proxy mode is unavailable on the account's current plan). Not retryable as-is — change the request rather than resubmitting.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"501 error","value":{"code":"PLATFORM_NOT_IMPLEMENTED","message":"This operation is not yet supported.","user_fixable":false,"retry_likely_to_succeed":false}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"x-curviate-tier":"core","x-badges":[{"name":"CORE","position":"after","color":"#A1A1AA"}],"description":"Update an account's custom metadata (a flat string map that replaces the store wholesale) and/or its custom proxy egress — supply a proxy object to set one, or null to clear it (revert to automatic proxy protection). Credentials and seat binding are untouched. The proxy password is encrypted at rest and never returned.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"metadata":{"description":"Flat string→string map that replaces this account's custom-data store wholesale (unprovided keys are removed)."},"proxy":{"type":"object","properties":{"protocol":{"type":"string","enum":["http","https","socks5"],"description":"Proxy protocol. One of http, https, socks5."},"host":{"type":"string","description":"Proxy host or IP."},"port":{"type":"integer","minimum":1,"maximum":65535,"description":"Proxy port (1–65535)."},"username":{"type":"string","description":"Proxy auth username (optional)."},"password":{"type":"string","description":"Proxy auth password (optional). Encrypted at rest, never logged or returned."}},"required":["protocol","host","port"],"description":"Custom-proxy egress config, or null to clear it (revert to automatic proxy protection). Omit to leave it unchanged.","nullable":true}}},"examples":{"metadata":{"summary":"Replace the account's custom metadata","value":{"metadata":{"team":"growth","region":"eu"}}},"proxy":{"summary":"Set a custom proxy","value":{"proxy":{"protocol":"http","host":"proxy.example.com","port":8080}}},"clearProxy":{"summary":"Clear the custom proxy (revert to automatic protection)","value":{"proxy":null}}}}}},"x-order":3},"delete":{"operationId":"deleteV1AccountsAccountId","tags":["Accounts"],"summary":"Disconnect a LinkedIn account","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string"},"description":"The account ID (`acc_…`) of the account to disconnect."}],"responses":{"200":{"description":"The account was disconnected and hard-deleted; its seat is released.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["account"],"description":"Response type discriminator."},"account_id":{"type":"string"},"status":{"type":"string","enum":["archived"]}}},"examples":{"archived":{"summary":"Disconnected","value":{"object":"account","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","status":"archived"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"No such account for this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"description":"Disconnect a LinkedIn account and hard-delete it, releasing its seat. No request body.","x-order":4}},"/v1/auth/intent":{"post":{"operationId":"postV1AuthIntent","tags":["Auth"],"summary":"Start a credential/cookie authentication","security":[{"apiKeyAuth":[]}],"parameters":[],"responses":{"200":{"description":"The account was re-authorized in place (same account_id, same seat).","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["account"],"description":"Response type discriminator."},"account_id":{"type":"string"},"status":{"type":"string","enum":["active"]}}},"examples":{"reconnected":{"summary":"Reconnected","value":{"object":"account","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","status":"active"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"201":{"description":"Account connected and bound to the seat.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["account"],"description":"Response type discriminator."},"account_id":{"type":"string"},"status":{"type":"string","enum":["active","reconnect_needed","restricted","disconnected"]},"auth_method":{"type":"string","enum":["credentials","cookie"]},"full_name":{"type":["string","null"]},"headline":{"type":["string","null"]},"seat_id":{"type":["string","null"],"description":"The seat this account occupies (canonical — supersedes the deprecated attached_seat_id)."},"attached_seat_id":{"type":["string","null"],"deprecated":true,"description":"Deprecated — use seat_id (same value). Removed at the GA /v1 cutover."},"recovered":{"type":"boolean","description":"Present and true only when this connect recovered an existing LinkedIn identity already present on the workspace (claiming it into your account) instead of connecting a brand-new one. Absent on a normal connect. The account's status reflects its real observed state, which may need a reconnect."}}},"examples":{"connected":{"summary":"Account connected","value":{"object":"account","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","status":"active","auth_method":"credentials","full_name":"Ada Lovelace","headline":"Engineer","seat_id":"seat_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","attached_seat_id":"seat_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"}},"recovered":{"summary":"Recovered an existing connection (already present on the workspace)","value":{"object":"account","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","status":"active","recovered":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"202":{"description":"A verification challenge is required. Resolve it via the checkpoint sub-resource (POST /v1/auth/checkpoint/solve) using the returned account_id.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["checkpoint"],"description":"Response type discriminator."},"status":{"type":"string","enum":["checkpoint_required"]},"account_id":{"type":"string","description":"The (provisional) account_id to pass to the checkpoint sub-resource (POST /v1/auth/checkpoint/solve)."},"challenge_type":{"type":"string","enum":["otp","two_factor_sms","two_factor_app","two_factor_whatsapp","mobile_app_approval","otp_or_mobile_app_approval","contract_selection"],"description":"The verification challenge LinkedIn issued."},"contracts":{"type":"array","description":"Contract picker options (contract_selection only). Solve with the chosen id as the code.","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}}},"expires_at":{"type":"string","description":"ISO-8601 expiry of the challenge."}}},"examples":{"twoFa":{"summary":"2FA challenge","value":{"object":"checkpoint","status":"checkpoint_required","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","challenge_type":"two_factor_app","expires_at":"2026-06-08T10:10:00Z"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — missing seat_id, a malformed auth block, or a cookie connect without user_agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"LinkedIn rejected the supplied credentials or cookie.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"402":{"description":"Payment required — an active subscription / seat is needed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"402 error","value":{"code":"PAYMENT_REQUIRED","message":"An active subscription or seat is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"409":{"description":"This LinkedIn account is already linked (names your own account_id when your tenant owns it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"409 error","value":{"code":"CONFLICT","message":"The request conflicts with the current state of the resource.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The verification challenge cannot be resolved automatically (a dead-end challenge such as a CAPTCHA or a phone-number registration). For those two dead-ends the error body carries a machine-readable challenge_type (captcha | phone_register) so a client can render the right guidance; other unsupported challenges carry no challenge_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — LinkedIn or the per-account ceiling is throttling connection attempts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"description":"Authenticate a LinkedIn account directly with credentials or a session cookie. Omit `account_id` to connect a NEW account (into the given empty `seat_id`); include `account_id` (in the body) to re-authenticate an EXISTING account in place. Returns the account on success (201 new / 200 reconnect), or a checkpoint challenge (202) carrying the account_id when LinkedIn requires verification. Complete the challenge with POST /v1/auth/checkpoint/solve (codes) or POST /v1/auth/checkpoint/poll (mobile-app approval). Connection scope (which LinkedIn products are enabled) is derived from the account's seat — there is no products input; the recorded scope is readable as `requested_products` on the account. A reconnect that changes scope must use credentials (a saved cookie cannot change scope). Pin a managed proxy with the optional `country`/`ip` or supply a `proxy` to override it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"seat_id":{"type":"string","description":"Target empty seat to bind a NEW account to (required for non-admin tenants on the new-account branch; ignored when account_id is present)."},"auth_method":{"type":"string","enum":["credentials","cookie"],"description":"How to authenticate: 'credentials' (email+password) or 'cookie' (li_at)."},"credentials":{"type":"object","properties":{"email":{"type":"string","description":"LinkedIn account email."},"password":{"type":"string","description":"LinkedIn account password. Encrypted at rest, never logged."}},"required":["email","password"],"description":"Email + password authentication. Provide when auth_method=credentials."},"cookie":{"type":"object","properties":{"li_at":{"type":"string","description":"LinkedIn session cookie (li_at). Encrypted at rest, never logged."},"li_a":{"type":"string","description":"Optional premium-session cookie for Sales Navigator / Recruiter sessions. Encrypted at rest, never logged."}},"required":["li_at"],"description":"Cookie-based authentication. Provide when auth_method=cookie."},"account_id":{"type":"string","description":"Present = re-authenticate this existing account in place (reconnect); omit = connect a new account."},"trial_premium":{"type":"string","enum":["none","sales_navigator","recruiter"],"description":"Free-trial seats only: which premium to enable for the trial (at most one). Ignored for paid seats. Defaults to none."},"country":{"type":"string","description":"Managed proxy location hint as an ISO 3166-1 alpha-2 country code (e.g. US, DE)."},"ip":{"type":"string","description":"IPv4 address used to infer the managed proxy location."},"proxy":{"type":"object","properties":{"protocol":{"type":"string","enum":["http","https","socks5"],"description":"Proxy protocol. One of http, https, socks5."},"host":{"type":"string","description":"Proxy host or IP."},"port":{"type":"integer","minimum":1,"maximum":65535,"description":"Proxy port (1–65535)."},"username":{"type":"string","description":"Proxy auth username (optional)."},"password":{"type":"string","description":"Proxy auth password (optional). Encrypted at rest, never logged or returned."}},"required":["protocol","host","port"],"description":"Managed-proxy egress configuration for this account's outbound traffic."},"user_agent":{"type":"string","description":"Exact browser User-Agent to pin for this account, if it hits disconnection issues."},"sync_limit":{"type":"object","properties":{"chats":{"type":"integer","minimum":0,"description":"Maximum number of chats to sync."},"messages":{"type":"integer","minimum":0,"description":"Maximum number of messages to sync per chat."}},"description":"Optional caps on how much history is synced for this account."},"recruiter_contract_id":{"type":"string","description":"Which Recruiter contract to bind this account to (Recruiter tier only)."}},"required":["auth_method"]},"examples":{"credentials":{"summary":"Connect a new account by email + password","value":{"seat_id":"seat_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","auth_method":"credentials","credentials":{"email":"ada@example.com","password":"REPLACE_WITH_REAL_PASSWORD"}}},"cookie":{"summary":"Connect a new account by session cookie, pinned to a managed proxy location","value":{"seat_id":"seat_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","auth_method":"cookie","cookie":{"li_at":"REPLACE_WITH_LI_AT_COOKIE"},"user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36","country":"DE"}},"reconnect":{"summary":"Re-authenticate an existing account in place (account_id in the body)","value":{"account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","auth_method":"credentials","credentials":{"email":"ada@example.com","password":"REPLACE_WITH_REAL_PASSWORD"}}}}}}},"x-order":1}},"/v1/auth/checkpoint/solve":{"post":{"operationId":"postV1AuthCheckpointSolve","tags":["Auth"],"summary":"Solve a checkpoint verification challenge","security":[{"apiKeyAuth":[]}],"parameters":[],"responses":{"201":{"description":"The challenge was resolved; the account is now connected.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["account"],"description":"Response type discriminator."},"account_id":{"type":"string"},"status":{"type":"string","enum":["active","reconnect_needed","restricted","disconnected"]},"seat_id":{"type":["string","null"],"description":"The seat this account occupies (canonical — supersedes the deprecated attached_seat_id)."},"attached_seat_id":{"type":["string","null"],"deprecated":true,"description":"Deprecated — use seat_id (same value). Removed at the GA /v1 cutover."},"recovered":{"type":"boolean","description":"Present and true only when this connect recovered an existing LinkedIn identity already present on the workspace (claiming it into your account) instead of connecting a brand-new one. Absent on a normal connect. The account's status reflects its real observed state, which may need a reconnect."}}},"examples":{"resolved":{"summary":"Resolved","value":{"object":"account","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","status":"active","seat_id":"seat_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","attached_seat_id":"seat_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"}},"recovered":{"summary":"Recovered an existing connection (already present on the workspace)","value":{"object":"account","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","status":"active","recovered":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"202":{"description":"A chained challenge follows (e.g. OTP -> 2FA). Solve the next code at the same account's checkpoint/solve.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["checkpoint"],"description":"Response type discriminator."},"status":{"type":"string","enum":["checkpoint_required"]},"account_id":{"type":"string","description":"The (provisional) account_id to pass to the checkpoint sub-resource (POST /v1/auth/checkpoint/solve)."},"challenge_type":{"type":"string","enum":["otp","two_factor_sms","two_factor_app","two_factor_whatsapp","mobile_app_approval","otp_or_mobile_app_approval","contract_selection"],"description":"The verification challenge LinkedIn issued."},"contracts":{"type":"array","description":"Contract picker options (contract_selection only). Solve with the chosen id as the code.","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}}},"expires_at":{"type":"string","description":"ISO-8601 expiry of the challenge."}}},"examples":{"chained":{"summary":"Chained 2FA","value":{"object":"checkpoint","status":"checkpoint_required","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","challenge_type":"two_factor_app","expires_at":"2026-06-08T10:10:00Z"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"No pending checkpoint for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"409":{"description":"The checkpoint has expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"409 error","value":{"code":"CONFLICT","message":"The request conflicts with the current state of the resource.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The submitted code was incorrect, or the challenge type is unsupported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Too many failed attempts — restart the connection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"description":"Resolve the pending verification challenge for an account by submitting the code — an OTP / 2FA code, the chosen contract id (for a contract_selection challenge), or the special value TRY_ANOTHER_WAY to switch the challenge method. `account_id` (in the body) identifies the mid-flight connect. A chained challenge returns another 202.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"account_id":{"type":"string","description":"The account whose connect/reconnect is mid-flight (returned with the 202 checkpoint_required response)."},"code":{"type":"string","description":"The OTP / 2FA verification code. Special value TRY_ANOTHER_WAY switches the challenge type (e.g. in-app → 2FA)."}},"required":["account_id","code"]},"examples":{"code":{"summary":"Submit a one-time verification code","value":{"account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","code":"123456"}},"switchMethod":{"summary":"Switch the challenge method (e.g. in-app → 2FA)","value":{"account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","code":"TRY_ANOTHER_WAY"}}}}}},"x-order":2}},"/v1/auth/checkpoint/request":{"post":{"operationId":"postV1AuthCheckpointRequest","tags":["Auth"],"summary":"Re-request a checkpoint verification notification","security":[{"apiKeyAuth":[]}],"parameters":[],"responses":{"200":{"description":"The resend request was processed. resent:true means the substrate confirmed the notification was re-sent; resent:false means the substrate acknowledged the request but had nothing to re-send (e.g. a two_factor_app challenge, where the code is generated on the device) — the response never claims a resend that did not happen.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["checkpoint"],"description":"Response type discriminator."},"account_id":{"type":"string"},"resent":{"type":"boolean"}}},"examples":{"resent":{"summary":"Notification re-sent","value":{"object":"checkpoint","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","resent":true}},"notResent":{"summary":"Acknowledged, nothing to resend for this challenge type","value":{"object":"checkpoint","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","resent":false}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"No pending checkpoint for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"409":{"description":"The checkpoint has expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"409 error","value":{"code":"CONFLICT","message":"The request conflicts with the current state of the resource.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"501":{"description":"This challenge type does not support resend — there is nothing for the substrate to re-send. Not retryable as-is; resolve the checkpoint via submit, or by completing it directly (e.g. approving on the device), instead of resending.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"501 error","value":{"code":"PLATFORM_NOT_IMPLEMENTED","message":"This operation is not yet supported.","user_fixable":false,"retry_likely_to_succeed":false}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"description":"Re-issue the pending verification challenge notification for an account. Meaningful for code-delivery challenges (otp / two_factor_sms / mobile_app_approval); a two_factor_app challenge has nothing to re-request (the code is generated on the device) and returns resent:false rather than an error — the response never claims a re-send that did not happen. `account_id` (in the body) identifies the mid-flight connect. Does not reset the checkpoint's expiry.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"account_id":{"type":"string","description":"The account whose pending checkpoint notification should be re-sent (returned with the 202 checkpoint_required response, or from link/poll)."}},"required":["account_id"]},"examples":{"request":{"summary":"Re-request the pending checkpoint notification","value":{"account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"}}}}}},"x-order":3}},"/v1/auth/checkpoint/poll":{"post":{"operationId":"postV1AuthCheckpointPoll","tags":["Auth"],"summary":"Poll a mobile-app-approval checkpoint","security":[{"apiKeyAuth":[]}],"parameters":[],"responses":{"200":{"description":"The current state of the action-based (mobile-app-approval) challenge. object:\"account\" + status:\"active\" once approved (the account is now connected); object:\"checkpoint\" + status:\"pending\" while still waiting; status:\"checkpoint_required\" when the collect chained to a new challenge (e.g. approval → 2FA) — switch to submitting the new challenge_type; status:\"expired\"/\"failed\" on timeout/failure.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["account","checkpoint"],"description":"Response type discriminator: account on approval, checkpoint while pending/chained/terminal."},"status":{"type":"string","enum":["active","pending","checkpoint_required","expired","failed"]},"account_id":{"type":"string","description":"Present on status:\"active\" (the connected account) and status:\"checkpoint_required\" (the account whose next challenge is pending)."},"full_name":{"type":["string","null"],"description":"Present on status:\"active\"."},"headline":{"type":["string","null"],"description":"Present on status:\"active\"."},"seat_id":{"type":["string","null"],"description":"The seat this account occupies (canonical — supersedes the deprecated attached_seat_id). Present on status:\"active\"."},"attached_seat_id":{"type":["string","null"],"deprecated":true,"description":"Deprecated — use seat_id (same value). Removed at the GA /v1 cutover. Present on status:\"active\"."},"expires_at":{"type":"string","description":"ISO-8601 expiry. Present on status:\"pending\" and status:\"checkpoint_required\"."},"challenge_type":{"type":"string","enum":["mobile_app_approval","otp","two_factor_sms","two_factor_app","two_factor_whatsapp","contract_selection"],"description":"Machine-readable challenge discriminator. On status:\"checkpoint_required\" it is the NEW challenge to submit; on status:\"expired\" it renders the right recovery guidance."},"contracts":{"type":"array","description":"Contract picker options — present only on a chained status:\"checkpoint_required\" with challenge_type:\"contract_selection\".","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}}},"recovery_hint":{"type":"string","description":"Human-readable, actionable next step when the approval timed out. Present on status:\"expired\"."}}},"examples":{"pending":{"summary":"Still waiting for approval","value":{"object":"checkpoint","status":"pending","expires_at":"2026-06-09T10:10:00Z"}},"active":{"summary":"Approved — account active","value":{"object":"account","status":"active","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","full_name":"Ada Lovelace","headline":"Engineer","seat_id":"seat_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","attached_seat_id":"seat_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"}},"chained":{"summary":"Approval chained to a 2FA code challenge","value":{"object":"checkpoint","status":"checkpoint_required","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","challenge_type":"two_factor_app","expires_at":"2026-06-09T10:10:00Z"}},"expired":{"summary":"Timed out — approval not completed in time","value":{"object":"checkpoint","status":"expired","challenge_type":"mobile_app_approval","recovery_hint":"This sign-in wasn't completed in time. If you approved it in the LinkedIn app, this identity may already be connected — try Reconnect, sign in with the cookie method, or check your connected accounts."}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"No pending checkpoint for this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"422":{"description":"The pending checkpoint is code-based, not mobile_app_approval — use submit instead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"422 error","value":{"code":"UNPROCESSABLE","message":"The request was well-formed but cannot be completed as asked.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"502":{"description":"A temporary error occurred. Please try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"502 error","value":{"code":"PLATFORM_ERROR","message":"A temporary error occurred. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"description":"Poll the pending mobile-app-approval challenge for an account and advance it. This is the completion driver for mobile_app_approval (and the in-app arm of otp_or_mobile_app_approval): call it repeatedly until the account is active. Returns object:\"account\" + status:\"active\" once approved; object:\"checkpoint\" + status:\"pending\" while still waiting; status:\"checkpoint_required\" (with challenge_type) when the approval chained to a new challenge (e.g. approval → 2FA) — switch to POST /v1/auth/checkpoint/solve for the new type; status:\"expired\"/\"failed\" on timeout/failure. A code-based checkpoint polled here returns 422 directing you to POST /v1/auth/checkpoint/solve instead. `account_id` (in the body) identifies the mid-flight connect.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"account_id":{"type":"string","description":"The account whose mobile-app-approval connect is mid-flight (returned with the 202 checkpoint_required response)."}},"required":["account_id"]},"examples":{"poll":{"summary":"Poll a pending mobile-app-approval challenge","value":{"account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"}}}}}},"x-order":4}},"/v1/auth/sessions/{session_id}":{"get":{"operationId":"getV1AuthSessionsSessionId","tags":["Auth"],"summary":"Get a connect session's status","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string"},"description":"The credential account id (acc_…) returned by auth/intent or a checkpoint response — the handle for the in-progress connect."}],"responses":{"200":{"description":"The current status of a credential connect session (acc_… id from auth/intent or a checkpoint response). Poll until status leaves checkpoint_required. account_id is present only once status is done. checkpoint_required carries challenge_type — the challenge still pending. failed carries no reason payload.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["auth_session"],"description":"Response type discriminator."},"session_id":{"type":"string","description":"The account id polled (acc_…)."},"status":{"type":"string","enum":["checkpoint_required","done","expired","failed"],"description":"Lifecycle status. checkpoint_required (a challenge is pending — carries challenge_type) / done (connected) / expired (timed out) / failed (terminal failure)."},"account_id":{"type":["string","null"],"description":"The connected account (acc_…); null until status is done."},"challenge_type":{"type":"string","description":"The pending challenge type. Present in checkpoint_required."},"expires_at":{"type":["string","null"],"description":"ISO-8601 UTC challenge expiry, when known; null otherwise."}}},"examples":{"checkpointRequired":{"summary":"A verification challenge is pending","value":{"object":"auth_session","session_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","status":"checkpoint_required","account_id":null,"challenge_type":"otp","expires_at":"2026-06-08T10:10:00.000Z"}},"done":{"summary":"The account connected","value":{"object":"auth_session","session_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","status":"done","account_id":"acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","expires_at":"2026-06-08T10:15:00.000Z"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"No such session for this tenant (unknown id, or an id you do not own).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}},"500":{"description":"Internal error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"500 error","value":{"code":"INTERNAL_ERROR","message":"An unexpected internal error occurred.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"503 error","value":{"code":"SERVICE_UNAVAILABLE","message":"The service is temporarily unavailable. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}},"504":{"description":"Gateway timeout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"504 error","value":{"code":"GATEWAY_TIMEOUT","message":"The request timed out. Please try again.","user_fixable":false,"retry_likely_to_succeed":true}}}}}}},"description":"Return the current status of a credential connect session, keyed by its account id (acc_…, from auth/intent or a checkpoint response). status is one of checkpoint_required / done / expired / failed; checkpoint_required carries challenge_type. account_id is present once status is done. Poll until status leaves checkpoint_required.","x-order":5}},"/v1/webhooks":{"get":{"operationId":"getV1Webhooks","tags":["Webhooks"],"summary":"List registered webhooks","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque pagination cursor from a previous response"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":250},"description":"Max items per page (1–250, default 50)"}],"responses":{"200":{"description":"A page of registered webhooks. The plaintext secret is never present on list items.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["webhook_list"],"description":"Response type discriminator."},"items":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["webhook"],"description":"Response type discriminator."},"id":{"type":"string","description":"Webhook id (wh_-prefixed ULID)."},"source":{"type":"string","enum":["messaging","user","account_status"],"description":"The event source this webhook subscribes to."},"request_url":{"type":"string","description":"The URL that receives delivery POST requests."},"name":{"type":["string","null"]},"format":{"type":"string","enum":["json","form"]},"account_ids":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"headers":{"type":"array","items":{"type":"object"}},"events":{"type":"array","items":{"type":"string"}},"data":{"type":"array","items":{"type":"string"}},"secret_prefix":{"type":"string","description":"First 8 characters of the secret (never the full secret)."},"health":{"type":"string","enum":["ok","degraded"],"description":"Delivery health state. 'degraded' when recent deliveries have repeatedly failed."},"created_at":{"type":"string"},"last_delivery_at":{"type":["string","null"]},"delivery_success_rate_7d":{"type":["number","null"],"description":"Fraction of successful deliveries over the last 7 days (0–1). Null when no deliveries yet."}}},"description":"Page of registered webhooks."},"cursor":{"type":["string","null"],"description":"Opaque next-page cursor. Null on the last page."}}},"examples":{"page":{"summary":"First page of webhooks","value":{"object":"webhook_list","items":[{"object":"webhook","id":"wh_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","source":"messaging","request_url":"https://hooks.example.com/messages","name":"Message handler","format":"json","account_ids":["acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"],"enabled":true,"headers":[],"events":["message.received"],"data":[],"secret_prefix":"aBcDeFgH","health":"ok","created_at":"2026-06-17T10:00:00Z","last_delivery_at":"2026-06-17T10:05:00Z","delivery_success_rate_7d":1}],"cursor":null}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid pagination parameters — limit out of range or malformed cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}}},"description":"Returns the tenant's webhooks as a paginated list. Each item carries its source, events, and config. The plaintext secret is never present on list items."},"post":{"operationId":"postV1Webhooks","tags":["Webhooks"],"summary":"Create a webhook","security":[{"apiKeyAuth":[]}],"parameters":[],"responses":{"201":{"description":"Webhook registered. The HMAC signing secret is returned exactly once — store it immediately.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["webhook"],"description":"Response type discriminator."},"id":{"type":"string","description":"Webhook id (wh_-prefixed ULID)."},"source":{"type":"string","enum":["messaging","user","account_status"],"description":"The event source this webhook subscribes to."},"request_url":{"type":"string","description":"The URL that receives delivery POST requests."},"name":{"type":["string","null"],"description":"Human-readable label."},"format":{"type":"string","enum":["json","form"],"description":"Delivery body encoding."},"account_ids":{"type":"array","items":{"type":"string"},"description":"Accounts targeted by this webhook. Required and non-empty — each id must be owned by the tenant."},"enabled":{"type":"boolean","description":"A disabled webhook is created but delivers nothing."},"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}}},"description":"Custom headers added to each delivery POST."},"events":{"type":"array","items":{"type":"string"},"description":"Canonical event names this webhook subscribes to."},"data":{"type":"array","items":{"type":"string"},"description":"Field-remapping keys for the delivery payload (messaging and user sources only)."},"secret":{"type":"string","description":"HMAC signing secret — returned exactly once at creation. Store it securely."},"secret_prefix":{"type":"string","description":"First 8 characters of the secret, for identification without exposing it."},"created_at":{"type":"string","description":"ISO-8601 creation timestamp."}}},"examples":{"messagingWebhook":{"summary":"Messaging webhook created","value":{"object":"webhook","id":"wh_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","source":"messaging","request_url":"https://hooks.example.com/messages","name":"Message handler","format":"json","account_ids":["acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"],"enabled":true,"headers":[],"events":["message.received"],"data":[],"secret":"whsec_aBcDeFgHiJkLmNoPqRsTuVwXyZ01234567890","secret_prefix":"aBcDeFgH","created_at":"2026-06-17T10:00:00Z"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed URL, empty events array, or event-source mismatch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"402":{"description":"Payment required — an active subscription is needed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"402 error","value":{"code":"PAYMENT_REQUIRED","message":"An active subscription or seat is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"One or more account_ids not found for this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}}},"description":"Registers a new webhook endpoint to receive real-time events. Choose a source (messaging / user / account_status) and supply the target URL. The HMAC signing secret is returned exactly once in the 201 response — store it securely.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"messaging"},"request_url":{"type":"string","description":"HTTPS URL that receives webhook deliveries"},"name":{"type":"string","description":"Human-readable name for this webhook (1–100 chars)"},"format":{"type":"string","enum":["json","form"],"description":"Delivery body encoding (default: json)","default":"json"},"account_ids":{"type":"array","items":{"type":"string"},"description":"Per-account targeting. Required and non-empty; each id must be an acc_-prefixed id owned by the tenant."},"enabled":{"type":"boolean","description":"A disabled webhook is created but delivers nothing","default":true},"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"]},"description":"Custom headers added to each delivery POST","default":[]},"events":{"type":"array","items":{"type":"string","enum":["message.received","message.delivered","message.read","message.reaction","message.edited","message.deleted","chat.updated","chat.deleted"]},"description":"Messaging events to subscribe to (default: [message.received])"},"data":{"type":"array","items":{"type":"string"},"description":"Field-remapping keys for the messaging delivery payload","default":[]}},"required":["source","request_url","account_ids"],"title":"Messaging"},{"type":"object","properties":{"source":{"type":"string","const":"user"},"request_url":{"type":"string","description":"HTTPS URL that receives webhook deliveries"},"name":{"type":"string","description":"Human-readable name for this webhook (1–100 chars)"},"format":{"type":"string","enum":["json","form"],"description":"Delivery body encoding (default: json)","default":"json"},"account_ids":{"type":"array","items":{"type":"string"},"description":"Per-account targeting. Required and non-empty; each id must be an acc_-prefixed id owned by the tenant."},"enabled":{"type":"boolean","description":"A disabled webhook is created but delivers nothing","default":true},"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"]},"description":"Custom headers added to each delivery POST","default":[]},"events":{"type":"array","items":{"type":"string","enum":["connection.accepted","connection.new"]},"description":"User/relation events to subscribe to (default: [connection.accepted])"},"data":{"type":"array","items":{"type":"string","enum":["user_provider_id","user_full_name","user_public_identifier","user_profile_url","user_picture_url"]},"description":"Field-remapping keys for the user/relation delivery payload","default":[]}},"required":["source","request_url","account_ids"],"title":"User"},{"type":"object","properties":{"source":{"type":"string","const":"account_status"},"request_url":{"type":"string","description":"HTTPS URL that receives webhook deliveries"},"name":{"type":"string","description":"Human-readable name for this webhook (1–100 chars)"},"format":{"type":"string","enum":["json","form"],"description":"Delivery body encoding (default: json)","default":"json"},"account_ids":{"type":"array","items":{"type":"string"},"description":"Per-account targeting. Required and non-empty; each id must be an acc_-prefixed id owned by the tenant."},"enabled":{"type":"boolean","description":"A disabled webhook is created but delivers nothing","default":true},"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"]},"description":"Custom headers added to each delivery POST","default":[]},"events":{"type":"array","items":{"type":"string","enum":["account.created","account.connected","account.synced","account.reconnected","account.reconnect_needed","account.creation_failed","account.disconnected","account.error","account.paused","account.connecting","account.permission_revoked","account.initial_sync.running","account.initial_sync.completed","account.initial_sync.failed"]},"description":"Account-status events to subscribe to (default: all 11 lifecycle events)"}},"required":["source","request_url","account_ids"],"title":"Account Status"}],"discriminator":{"propertyName":"source","mapping":{"messaging":"#/oneOf/0","user":"#/oneOf/1","account_status":"#/oneOf/2"}}},"examples":{"messaging":{"summary":"Create a messaging webhook","value":{"source":"messaging","request_url":"https://hooks.example.com/curviate/messaging","name":"Inbox notifier","account_ids":["acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"],"events":["message.received"]}},"accountStatus":{"summary":"Create an account-status webhook (all lifecycle events)","value":{"source":"account_status","request_url":"https://hooks.example.com/curviate/account-status","account_ids":["acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"]}}}}}}}},"/v1/webhooks/events":{"get":{"operationId":"getV1WebhooksEvents","tags":["Webhooks"],"summary":"List webhook event types","security":[{"apiKeyAuth":[]}],"parameters":[],"responses":{"200":{"description":"The complete canonical event catalogue, grouped by source.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["webhook_event_catalogue"],"description":"Response type discriminator."},"sources":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","description":"Event source group (messaging, user, account_status, recruiter, sales_nav)."},"events":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Canonical event name."},"source":{"type":"string","description":"Event source group."},"description":{"type":"string"},"linkedin_only":{"type":"boolean","description":"Present and true when the event carries LinkedIn-specific content."},"tier":{"type":"string","enum":["recruiter","sales_nav"],"description":"Required add-on tier. Present only on tier-gated events."},"availability":{"type":"string","enum":["realtime","no_longer_realtime","not_realtime"],"description":"Delivery timing. Omitted (equivalent to 'realtime') on every live-pushed event. 'no_longer_realtime' means no push exists for this event; 'not_realtime' means the event is polled, not pushed, and may lag the underlying LinkedIn event."}}}}}},"description":"Event types grouped by source."}}},"examples":{"catalogue":{"summary":"Full event catalogue","value":{"object":"webhook_event_catalogue","sources":[{"source":"messaging","events":[{"type":"message.received","source":"messaging","description":"An inbound message arrived in any chat (classic / InMail).","linkedin_only":true},{"type":"message.delivered","source":"messaging","description":"An outbound message was delivered.","linkedin_only":true},{"type":"message.read","source":"messaging","description":"A message in a chat was read by the recipient.","linkedin_only":true},{"type":"message.reaction","source":"messaging","description":"A reaction was added to a message.","linkedin_only":true},{"type":"message.edited","source":"messaging","description":"A message was edited after send.","linkedin_only":true},{"type":"message.deleted","source":"messaging","description":"A message was deleted.","linkedin_only":true},{"type":"chat.updated","source":"messaging","description":"A chat's container state changed (e.g. archived, muted, read-state) — useful for inbox automation.","linkedin_only":true},{"type":"chat.deleted","source":"messaging","description":"A chat thread was deleted.","linkedin_only":true}]},{"source":"user","events":[{"type":"connection.accepted","source":"user","description":"A pending invitation was accepted by the recipient (new relation). Polled — up to ~8h latency.","linkedin_only":true,"availability":"not_realtime"},{"type":"connection.new","source":"user","description":"A new relation appeared on the account (any new LinkedIn connection, not just ones you invited). Polled, not real-time — up to ~4h delay; a freshly connected account may see a backfill burst of these on first connect.","linkedin_only":true,"availability":"not_realtime"}]},{"source":"account_status","events":[{"type":"account.created","source":"account_status","description":"A new account link completed successfully for the first time."},{"type":"account.connected","source":"account_status","description":"The account health check reported a healthy, connected state."},{"type":"account.synced","source":"account_status","description":"A synchronization cycle completed successfully. No longer pushed in real time — v2 has no equivalent event; no read-path alternative exists.","availability":"no_longer_realtime"},{"type":"account.reconnected","source":"account_status","description":"An existing account was re-authorized in place."},{"type":"account.reconnect_needed","source":"account_status","description":"Credentials expired — the account needs reconnection."},{"type":"account.creation_failed","source":"account_status","description":"The initial account-link attempt failed terminally. No longer pushed in real time — detect via an on-demand account read.","availability":"no_longer_realtime"},{"type":"account.disconnected","source":"account_status","description":"The account was removed from the platform (terminal)."},{"type":"account.error","source":"account_status","description":"Account synchronization encountered an error (not a credentials issue — needs investigation)."},{"type":"account.paused","source":"account_status","description":"Account synchronization was stopped or paused externally. Not an error — may resume automatically."},{"type":"account.connecting","source":"account_status","description":"An account link is in progress. Transient and high-frequency — opt in explicitly. No longer pushed in real time — v2 has no equivalent event.","availability":"no_longer_realtime"},{"type":"account.permission_revoked","source":"account_status","description":"A LinkedIn-side scope the account relies on was withdrawn. No longer pushed in real time — detect via an on-demand account read.","availability":"no_longer_realtime"},{"type":"account.initial_sync.running","source":"account_status","description":"The initial history backfill for a newly connected account has started (informational — bracket-open).","availability":"realtime"},{"type":"account.initial_sync.completed","source":"account_status","description":"The initial history backfill completed — full LinkedIn history is now queryable.","availability":"realtime"},{"type":"account.initial_sync.failed","source":"account_status","description":"The initial history backfill failed. The delivered payload carries a neutral `reason` — one of `internal`, `proxy`, or `provider`.","availability":"realtime"}]},{"source":"recruiter","events":[{"type":"recruiter.applicant.added","source":"recruiter","description":"A candidate was added to a hiring project pipeline.","tier":"recruiter"},{"type":"recruiter.project.candidate_status_changed","source":"recruiter","description":"A candidate pipeline status changed.","tier":"recruiter"}]},{"source":"sales_nav","events":[{"type":"sales_nav.inmail.received","source":"sales_nav","description":"An InMail arrived on a Sales Navigator seat.","tier":"sales_nav"}]}]}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}}},"description":"Returns the complete canonical event catalogue (27 events) grouped by source: messaging (8), user (2), account_status (14), plus 3 tier-gated events. No quota consumed."}},"/v1/webhooks/{id}":{"get":{"operationId":"getV1WebhooksId","tags":["Webhooks"],"summary":"Get a webhook","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Webhook id (wh_-prefixed ULID)."}],"responses":{"200":{"description":"The webhook, if owned by the calling tenant. The signing secret is never returned on a read — only the prefix.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["webhook"],"description":"Response type discriminator."},"id":{"type":"string","description":"Webhook id (wh_-prefixed ULID)."},"source":{"type":"string","enum":["messaging","user","account_status"],"description":"The event source this webhook subscribes to (immutable)."},"request_url":{"type":"string","description":"The URL that receives delivery POST requests."},"name":{"type":["string","null"],"description":"Human-readable label."},"format":{"type":"string","enum":["json","form"],"description":"Delivery body encoding."},"account_ids":{"type":"array","items":{"type":"string"},"description":"Accounts targeted by this webhook. Non-empty — each id is owned by the tenant."},"enabled":{"type":"boolean","description":"A disabled webhook is kept but delivers nothing."},"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}}},"description":"Custom headers added to each delivery POST."},"events":{"type":"array","items":{"type":"string"},"description":"Canonical event names this webhook subscribes to."},"data":{"type":"array","items":{"type":"string"},"description":"Field-remapping keys for the delivery payload (messaging and user sources only)."},"secret_prefix":{"type":"string","description":"First 8 characters of the signing secret. The full secret is never returned on edit — it is preserved unchanged."},"created_at":{"type":"string","description":"ISO-8601 creation timestamp."}}},"examples":{"webhook":{"summary":"A registered messaging webhook","value":{"object":"webhook","id":"wh_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","source":"messaging","request_url":"https://hooks.example.com/messages","name":"Message handler","format":"json","account_ids":["acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"],"enabled":true,"headers":[],"events":["message.received"],"data":[],"secret_prefix":"aBcDeFgH","created_at":"2026-06-17T10:00:00Z"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Malformed or empty webhook id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Webhook not found or not owned by this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}}},"description":"Returns a single webhook owned by the calling tenant. The plaintext secret is never present on a read — only the prefix."},"delete":{"operationId":"deleteV1WebhooksId","tags":["Webhooks"],"summary":"Delete a webhook","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Webhook id (wh_-prefixed ULID)."}],"responses":{"200":{"description":"Webhook removed. Deliveries in flight are not affected. Idempotent — deleting an already-deleted webhook returns the same shape.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["webhook_deleted"],"description":"Response type discriminator."},"id":{"type":"string","description":"The id of the deleted webhook."}}},"examples":{"deleted":{"summary":"Webhook deleted","value":{"object":"webhook_deleted","id":"wh_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Malformed or empty webhook id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Webhook not found or not owned by this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}}},"description":"Permanently remove a webhook subscription. Deliveries in flight are not affected."},"patch":{"operationId":"patchV1WebhooksId","tags":["Webhooks"],"summary":"Edit a webhook","security":[{"apiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Webhook id (wh_-prefixed ULID)."}],"responses":{"200":{"description":"Webhook updated. The signing secret is preserved — only the prefix is shown, never the full secret.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["webhook"],"description":"Response type discriminator."},"id":{"type":"string","description":"Webhook id (wh_-prefixed ULID)."},"source":{"type":"string","enum":["messaging","user","account_status"],"description":"The event source this webhook subscribes to (immutable)."},"request_url":{"type":"string","description":"The URL that receives delivery POST requests."},"name":{"type":["string","null"],"description":"Human-readable label."},"format":{"type":"string","enum":["json","form"],"description":"Delivery body encoding."},"account_ids":{"type":"array","items":{"type":"string"},"description":"Accounts targeted by this webhook. Non-empty — each id is owned by the tenant."},"enabled":{"type":"boolean","description":"A disabled webhook is kept but delivers nothing."},"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}}},"description":"Custom headers added to each delivery POST."},"events":{"type":"array","items":{"type":"string"},"description":"Canonical event names this webhook subscribes to."},"data":{"type":"array","items":{"type":"string"},"description":"Field-remapping keys for the delivery payload (messaging and user sources only)."},"secret_prefix":{"type":"string","description":"First 8 characters of the signing secret. The full secret is never returned on edit — it is preserved unchanged."},"created_at":{"type":"string","description":"ISO-8601 creation timestamp."}}},"examples":{"eventsEdit":{"summary":"Subscribed events changed","value":{"object":"webhook","id":"wh_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","source":"messaging","request_url":"https://hooks.example.com/messages","name":"Message handler","format":"json","account_ids":["acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8"],"enabled":true,"headers":[],"events":["message.received","message.read"],"data":[],"secret_prefix":"aBcDeFgH","created_at":"2026-06-17T10:00:00Z"}},"accountIdsEdit":{"summary":"Targeted accounts changed","value":{"object":"webhook","id":"wh_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","source":"messaging","request_url":"https://hooks.example.com/messages","name":"Message handler","format":"json","account_ids":["acc_01J8Z3K9P0Q1R2S3T4V5W6X7Y8","acc_01J8Z3K9P0Q1R2S3T4V5W6X7Z9"],"enabled":true,"headers":[],"events":["message.received"],"data":[],"secret_prefix":"aBcDeFgH","created_at":"2026-06-17T10:00:00Z"}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid request — malformed URL, empty events array, event-source mismatch, a change to the immutable source, or a malformed id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"400 error","value":{"code":"INVALID_REQUEST","message":"A parameter failed validation.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"401 error","value":{"code":"UNAUTHORIZED","message":"Missing or invalid API key.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"402":{"description":"Payment required — an active subscription is needed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"402 error","value":{"code":"PAYMENT_REQUIRED","message":"An active subscription or seat is required.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"404":{"description":"Webhook not found, or one or more account_ids not found for this tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"404 error","value":{"code":"RESOURCE_NOT_FOUND","message":"The referenced resource does not exist for this tenant.","user_fixable":true,"retry_likely_to_succeed":false}}}}}},"429":{"description":"Rate limited — slow down and retry after the hinted delay.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"error":{"summary":"429 error","value":{"code":"RATE_LIMIT_ACCOUNT","message":"The per-account request rate limit was exceeded; retry after the delay in retry_hint. Per-workspace breaches carry RATE_LIMIT_TENANT; ingress-wide breaches (pre-auth, no per-client key) and upstream saturation both carry PLATFORM_RATE_LIMIT.","user_fixable":false,"retry_likely_to_succeed":true}}}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}}}},"description":"Update a webhook in place. Every field is optional — a provided field replaces its value, an omitted field is left unchanged. The source is immutable and the signing secret is preserved (never re-issued).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"string"},"description":"Replace the subscribed events (whole-array). Every event must be a canonical event whose source matches the webhook's source."},"request_url":{"type":"string","description":"Replace the delivery URL. Must be an HTTPS URL."},"name":{"type":"string","description":"Replace the human-readable name (1–100 chars), or null to clear it.","nullable":true},"enabled":{"type":"boolean","description":"Enable or disable the webhook. A disabled webhook delivers nothing."},"headers":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"]},"description":"Replace the custom headers added to each delivery POST (whole-array)."},"format":{"type":"string","enum":["json","form"],"description":"Replace the delivery body encoding."},"data":{"type":"array","items":{"type":"string"},"description":"Replace the field-remapping keys for the delivery payload (whole-array)."},"account_ids":{"type":"array","items":{"type":"string"},"description":"Replace the targeted accounts (whole-array). Must be non-empty; each id must be an acc_-prefixed id owned by the tenant."}}},"examples":{"disable":{"summary":"Disable a webhook (delivers nothing until re-enabled)","value":{"enabled":false}},"changeUrlAndEvents":{"summary":"Replace the delivery URL and the subscribed events","value":{"request_url":"https://hooks.example.com/curviate/messaging-v2","events":["message.received","message.reaction"]}}}}}}}}}}