@curviate/sdk 0.37.1 → 0.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -175,7 +175,7 @@ interface paths {
175
175
  put?: never;
176
176
  /**
177
177
  * Endorse a member's skill
178
- * @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.
178
+ * @description Endorses one skill on a target member's profile. Only skills of your 1st-degree connections can be endorsed, using the endorsement_id from their profile's skills section (GET users/{user_id}?linkedin_sections=linkedin_skills).
179
179
  */
180
180
  post: operations["postV1AccountIdUsersUserIdEndorseSkill"];
181
181
  delete?: never;
@@ -253,7 +253,7 @@ interface paths {
253
253
  };
254
254
  /**
255
255
  * List the account's profile viewers
256
- * @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.
256
+ * @description Returns a cursor-paginated list of the account's recent profile viewers, each classified by disclosure fidelity (identified, semi-anonymous, or aggregate). A free account is capped at semi-anonymous; Premium sees identified. Page until cursor is null.
257
257
  */
258
258
  get: operations["getV1AccountIdProfileVisitors"];
259
259
  put?: never;
@@ -313,7 +313,7 @@ interface paths {
313
313
  };
314
314
  /**
315
315
  * List who a user follows
316
- * @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.
316
+ * @description Lists accounts this user follows. LinkedIn allows only the connected account's own list: user_id must be "me". To list another user's followers, use the followers endpoint instead.
317
317
  */
318
318
  get: operations["getV1AccountIdUsersUserIdFollowing"];
319
319
  put?: never;
@@ -340,7 +340,7 @@ interface paths {
340
340
  post: operations["postV1AccountIdUsersUserIdFollow"];
341
341
  /**
342
342
  * Unfollow a user
343
- * @description Unfollows a LinkedIn user. Idempotent, unfollowing a user this account does not currently follow still returns 200.
343
+ * @description Unfollows a LinkedIn user. Unfollowing a user this account does not currently follow still returns 200, not an error.
344
344
  */
345
345
  delete: operations["deleteV1AccountIdUsersUserIdFollow"];
346
346
  options?: never;
@@ -439,7 +439,7 @@ interface paths {
439
439
  put?: never;
440
440
  /**
441
441
  * Invite connections to follow a company page
442
- * @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.
442
+ * @description Invites one or more of the connected account's 1st-degree connections to follow a company page it administers, using member ids from an invitable-followers read. All-or-nothing: one invalid invitee id rejects the whole request (404). Re-inviting an already-invited member is a safe no-op.
443
443
  */
444
444
  post: operations["postV1AccountIdCompaniesIdentifierFollowInvite"];
445
445
  delete?: never;
@@ -497,7 +497,7 @@ interface paths {
497
497
  };
498
498
  /**
499
499
  * List a company page's admin conversations
500
- * @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.
500
+ * @description Lists a company page's admin-inbox conversations, newest-activity-first. The connected account must administer the page. Content is never stored. Beta: single-page results are verified; deep pagination across many pages is still being validated at scale.
501
501
  */
502
502
  get: operations["getV1AccountIdCompaniesIdentifierChats"];
503
503
  put?: never;
@@ -517,7 +517,7 @@ interface paths {
517
517
  };
518
518
  /**
519
519
  * Retrieve one admin conversation
520
- * @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.
520
+ * @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.
521
521
  */
522
522
  get: operations["getV1AccountIdCompaniesIdentifierChatsChatId"];
523
523
  put?: never;
@@ -543,7 +543,7 @@ interface paths {
543
543
  put?: never;
544
544
  /**
545
545
  * Reply as the company page
546
- * @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, and 9 MiB for the whole request body; base64 makes a file about a third larger in the body than on disk), 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.
546
+ * @description Sends a message into an existing company-inbox conversation, as the page. Reply-only: a page can never start a new conversation, only answer one. Send text, base64 attachments (5 MiB per file, 9 MiB per request), or both. The connected account must administer the page.
547
547
  */
548
548
  post: operations["postV1AccountIdCompaniesIdentifierChatsChatIdMessages"];
549
549
  delete?: never;
@@ -581,7 +581,7 @@ interface paths {
581
581
  };
582
582
  /**
583
583
  * Search or filter a company page's admin inbox
584
- * @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.
584
+ * @description Free-text search (query) or one topic/unread filter over the admin inbox, exactly one mode per call. The connected account must administer the page. Beta: single-page results are verified; deep pagination across many pages is still being validated at scale.
585
585
  */
586
586
  get: operations["getV1AccountIdCompaniesIdentifierChatsSearch"];
587
587
  put?: never;
@@ -661,7 +661,7 @@ interface paths {
661
661
  };
662
662
  /**
663
663
  * Resolve search filter IDs
664
- * @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. Results paginate: send the cursor from the previous response to get the next page, and stop when it comes back null.
664
+ * @description Resolves human-readable terms (e.g. 'software development') to opaque filter IDs for structured search filters. type selects the category; keywords is required for every type. Paginate with cursor until it returns null.
665
665
  */
666
666
  get: operations["getV1AccountIdSearchParameters"];
667
667
  put?: never;
@@ -763,7 +763,7 @@ interface paths {
763
763
  put?: never;
764
764
  /**
765
765
  * Search from a pasted URL
766
- * @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).
766
+ * @description Runs a pasted LinkedIn search URL directly; url is the only accepted body field, the sole home of URL-mode. The response is polymorphic: each item is discriminated by its own kind (person, company, post, or job).
767
767
  */
768
768
  post: operations["postV1AccountIdSearch"];
769
769
  delete?: never;
@@ -847,7 +847,7 @@ interface paths {
847
847
  put?: never;
848
848
  /**
849
849
  * Start a chat
850
- * @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, and 9 MiB for the whole request body; base64 makes a file about a third larger in the body than on disk). This call keeps nothing and logs nothing. Once sent it is a message in the account's inbox, so reading that conversation back through Curviate stores its body in your tenant's inbox records, with no expiry. 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.
850
+ * @description Starts a chat with members. This call keeps nothing and logs nothing. Once sent it is a message in the account's inbox, so reading that conversation back through Curviate stores its body in your tenant's inbox records, with no expiry. Company pages are reply-only: a COMPANY_ id cannot start one.
851
851
  */
852
852
  post: operations["postV1AccountIdChats"];
853
853
  delete?: never;
@@ -895,7 +895,7 @@ interface paths {
895
895
  put?: never;
896
896
  /**
897
897
  * Send a message
898
- * @description Sends a message into an existing chat. Send application/json with text, base64 attachments (max 5 MiB per file, and 9 MiB for the whole request body; base64 makes a file about a third larger in the body than on disk), or both; at least one of text or attachments is required. This call keeps nothing and logs nothing. Once sent it is a message in the account's inbox, so reading that conversation back through Curviate stores its body in your tenant's inbox records, with no expiry. 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.
898
+ * @description Sends a message into a chat: text, attachments, or both. This call keeps nothing and logs nothing. Once sent it is a message in the account's inbox, so reading that conversation back through Curviate stores its body in your tenant's inbox records, with no expiry. COMPANY_ chat ids send as the page.
899
899
  */
900
900
  post: operations["postV1AccountIdChatsChatIdMessages"];
901
901
  delete?: never;
@@ -981,9 +981,7 @@ interface paths {
981
981
  };
982
982
  /**
983
983
  * Search chats
984
- * @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.
985
- *
986
- * Served from the chats and messages already retrieved for this account, so it costs no platform call and draws down no budget. A chat that has never been retrieved cannot match. The `coverage` block on the response says how complete the searched corpus is.
984
+ * @description Free-text search of the connected account's own inbox, matching participant names and message content. Served from chats and messages already retrieved, so it costs no platform call. A chat never retrieved cannot match; the response's coverage block says how complete that is.
987
985
  */
988
986
  get: operations["getV1AccountIdChatsSearch"];
989
987
  put?: never;
@@ -1023,7 +1021,7 @@ interface paths {
1023
1021
  };
1024
1022
  /**
1025
1023
  * List inboxes
1026
- * @description Returns the account's personal inbox plus, when the company product is attached, one entry per company page x 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.
1024
+ * @description Lists the account's personal inbox plus, when the company product is attached, one entry per company page and folder. Company inboxes are reply-only. company_id is null when the page can't be correlated to a managed page.
1027
1025
  */
1028
1026
  get: operations["getV1AccountIdInboxes"];
1029
1027
  put?: never;
@@ -1043,7 +1041,7 @@ interface paths {
1043
1041
  };
1044
1042
  /**
1045
1043
  * List an inbox's conversations
1046
- * @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.
1044
+ * @description Lists an inbox's conversations, newest first. Each chat id is send-ready: pass it to the send-message endpoint to reply; a company id replies as that page. Company inboxes are reply-only. A mailbox this account doesn't administer returns 403, never 404.
1047
1045
  */
1048
1046
  get: operations["getV1AccountIdInboxesInboxIdChats"];
1049
1047
  put?: never;
@@ -1063,7 +1061,7 @@ interface paths {
1063
1061
  };
1064
1062
  /**
1065
1063
  * Get the account's home feed
1066
- * @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.
1064
+ * @description Returns the account's LinkedIn home feed as agent-actionable posts. sort=recent (default) is always available; sort=relevant can rate-limit. Each post carries the activity id for the Posts group. Page until cursor is null.
1067
1065
  */
1068
1066
  get: operations["getV1AccountIdFeedHome"];
1069
1067
  put?: never;
@@ -1083,7 +1081,7 @@ interface paths {
1083
1081
  };
1084
1082
  /**
1085
1083
  * List the account's notifications
1086
- * @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.
1084
+ * @description Returns the account's notification cards, cursor-paginated, plus unread_count and a latest_published_at watermark for cheap polling. Each post-related card carries the activity id for the Posts group. Page until cursor is null.
1087
1085
  */
1088
1086
  get: operations["getV1AccountIdNotifications"];
1089
1087
  put?: never;
@@ -1125,7 +1123,7 @@ interface paths {
1125
1123
  put?: never;
1126
1124
  /**
1127
1125
  * Show less like a notification
1128
- * @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.
1126
+ * @description Applies 'show less like this' to the source of one of the account's own notification cards. For network-activity cards this removes the card, the same as deleting it. Self-action, cannot be undone. No request body.
1129
1127
  */
1130
1128
  post: operations["postV1AccountIdNotificationsCardUrnShowLess"];
1131
1129
  delete?: never;
@@ -1407,7 +1405,7 @@ interface paths {
1407
1405
  };
1408
1406
  /**
1409
1407
  * Get job posting
1410
- * @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.
1408
+ * @description Returns one classic job posting at full detail. Any posting reachable by its numeric id can be retrieved, including one not owned by the connected account. Pass `with_sections` for extra sections.
1411
1409
  */
1412
1410
  get: operations["getV1AccountIdJobsJobId"];
1413
1411
  put?: never;
@@ -1417,7 +1415,7 @@ interface paths {
1417
1415
  head?: never;
1418
1416
  /**
1419
1417
  * Edit job posting
1420
- * @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.
1418
+ * @description Applies a partial update to a job posting the connected account owns; only included fields change. Editing an already-published (LISTED) posting affects a live, money-spending listing.
1421
1419
  */
1422
1420
  patch: operations["patchV1AccountIdJobsJobId"];
1423
1421
  trace?: never;
@@ -1453,7 +1451,7 @@ interface paths {
1453
1451
  put?: never;
1454
1452
  /**
1455
1453
  * Publish job posting
1456
- * @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.
1454
+ * @description Publishes a job posting draft. PROMOTED or PROMOTED_PLUS with a budget charges the account's LinkedIn payment method; providing budget is the opt-in to spend. FREE publishing needs free-posting eligibility (check the budget endpoint first). May return a checkpoint to resolve first.
1457
1455
  */
1458
1456
  post: operations["postV1AccountIdJobsJobIdPublish"];
1459
1457
  delete?: never;
@@ -1729,7 +1727,7 @@ interface paths {
1729
1727
  put?: never;
1730
1728
  /**
1731
1729
  * Start a chat (Recruiter)
1732
- * @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.
1730
+ * @description Sends an opening InMail-style message to one or more Recruiter member IDs. subject and signature are required. Accepts optional base64 attachments (JSON only, no multipart). Requires a Recruiter seat.
1733
1731
  */
1734
1732
  post: operations["postV1AccountIdRecruiterChats"];
1735
1733
  delete?: never;
@@ -1769,7 +1767,7 @@ interface paths {
1769
1767
  put?: never;
1770
1768
  /**
1771
1769
  * Resolve search-filter IDs (Recruiter)
1772
- * @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.
1770
+ * @description Resolves human-readable terms to opaque Recruiter filter ids for pipeline, search, and applicant requests. Body is discriminated by source: APPLICANTS/PIPELINE require project_id, others do not. Requires a Recruiter seat.
1773
1771
  */
1774
1772
  post: operations["postV1AccountIdRecruiterSearchParameters"];
1775
1773
  delete?: never;
@@ -1853,7 +1851,7 @@ interface paths {
1853
1851
  put?: never;
1854
1852
  /**
1855
1853
  * Search a project's talent pool
1856
- * @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.
1854
+ * @description Searches a Recruiter project's talent pool. Requires channel_id (the project's RECRUITER_SEARCH talent-pool channel, from talent_pool.channels[]) plus optional filters. Requires a Recruiter seat.
1857
1855
  */
1858
1856
  post: operations["postV1AccountIdRecruiterProjectsProjectIdTalentPoolSearch"];
1859
1857
  delete?: never;
@@ -1985,7 +1983,7 @@ interface paths {
1985
1983
  head?: never;
1986
1984
  /**
1987
1985
  * Edit a job posting
1988
- * @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.
1986
+ * @description MONEY WARNING: editing an already-published (LISTED/REVIEW/SUSPENDED) posting mutates a live, money-spending listing. Partial update: omitted fields are unchanged. Requires a Recruiter seat.
1989
1987
  */
1990
1988
  patch: operations["patchV1AccountIdRecruiterProjectsProjectIdJobsJobId"];
1991
1989
  trace?: never;
@@ -2001,7 +1999,7 @@ interface paths {
2001
1999
  put?: never;
2002
2000
  /**
2003
2001
  * Publish a job posting
2004
- * @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.
2002
+ * @description REAL MONEY: PROMOTED/PROMOTED_PLUS spend on the account's LinkedIn payment method; providing budget is the opt-in to spend. FREE requires free-posting eligibility (check the budget endpoint first). Requires a Recruiter seat.
2005
2003
  */
2006
2004
  post: operations["postV1AccountIdRecruiterProjectsProjectIdJobsJobIdPublish"];
2007
2005
  delete?: never;
@@ -2099,7 +2097,7 @@ interface paths {
2099
2097
  };
2100
2098
  /**
2101
2099
  * Download an applicant's résumé
2102
- * @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.
2100
+ * @description Streams the résumé file as raw bytes; Curviate never caches, stores, or logs it. Gated by has_resume. No résumé on file returns 404; still generating returns 503 (retry). Requires a Recruiter seat.
2103
2101
  */
2104
2102
  get: operations["getV1AccountIdRecruiterProjectsProjectIdTalentPoolApplicantsApplicantIdResume"];
2105
2103
  put?: never;
@@ -2121,7 +2119,7 @@ interface paths {
2121
2119
  put?: never;
2122
2120
  /**
2123
2121
  * Start a chat (Sales Navigator)
2124
- * @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.
2122
+ * @description Sends an opening InMail-style message to one or more Sales Navigator members. subject is required. Accepts optional base64 attachments (JSON only, no multipart). Requires a Sales Navigator seat.
2125
2123
  */
2126
2124
  post: operations["postV1AccountIdSalesNavigatorChats"];
2127
2125
  delete?: never;
@@ -2279,7 +2277,7 @@ interface paths {
2279
2277
  };
2280
2278
  /**
2281
2279
  * Resolve search-filter IDs (Sales Navigator)
2282
- * @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.
2280
+ * @description Resolves human-readable terms to opaque Sales Navigator filter IDs for people or company search. type selects the filter family; an unrecognized value is rejected with 400. Requires a Sales Navigator seat.
2283
2281
  */
2284
2282
  get: operations["getV1AccountIdSalesNavigatorSearchParameters"];
2285
2283
  put?: never;
@@ -2301,7 +2299,7 @@ interface paths {
2301
2299
  put?: never;
2302
2300
  /**
2303
2301
  * Search people (Sales Navigator)
2304
- * @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.
2302
+ * @description Search for LinkedIn members using the full Sales Navigator filter set. Resolve filter IDs first via search/parameters. limit and cursor are query params. For a pasted URL instead, use POST .../search. Requires a Sales Navigator seat.
2305
2303
  */
2306
2304
  post: operations["postV1AccountIdSalesNavigatorSearchPeople"];
2307
2305
  delete?: never;
@@ -2321,7 +2319,7 @@ interface paths {
2321
2319
  put?: never;
2322
2320
  /**
2323
2321
  * Search companies (Sales Navigator)
2324
- * @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.
2322
+ * @description Search for LinkedIn companies using the full Sales Navigator filter set. Resolve filter IDs first via search/parameters. limit and cursor are query params. For a pasted URL instead, use POST .../search. Requires a Sales Navigator seat.
2325
2323
  */
2326
2324
  post: operations["postV1AccountIdSalesNavigatorSearchCompanies"];
2327
2325
  delete?: never;
@@ -2341,7 +2339,7 @@ interface paths {
2341
2339
  put?: never;
2342
2340
  /**
2343
2341
  * Search from a pasted URL (Sales Navigator)
2344
- * @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.
2342
+ * @description Runs a pasted Sales Navigator search, saved-search, or lead-list URL directly; url is the only accepted body field, the sole home of URL-mode. Response is polymorphic by kind (person, company, saved lead, saved account). Requires a Sales Navigator seat.
2345
2343
  */
2346
2344
  post: operations["postV1AccountIdSalesNavigatorSearch"];
2347
2345
  delete?: never;
@@ -2359,7 +2357,7 @@ interface paths {
2359
2357
  };
2360
2358
  /**
2361
2359
  * List connected LinkedIn accounts
2362
- * @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.
2360
+ * @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. Filter by `external_id` for one end user's accounts.
2363
2361
  */
2364
2362
  get: operations["getV1Accounts"];
2365
2363
  put?: never;
@@ -2393,7 +2391,7 @@ interface paths {
2393
2391
  head?: never;
2394
2392
  /**
2395
2393
  * Update account metadata / proxy configuration
2396
- * @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.
2394
+ * @description Updates an account's metadata (a flat string map, replaced wholesale) and/or its custom proxy egress; pass a proxy object to set one, or null to clear it. Credentials and seat are untouched.
2397
2395
  */
2398
2396
  patch: operations["patchV1AccountsAccountId"];
2399
2397
  trace?: never;
@@ -2429,7 +2427,7 @@ interface paths {
2429
2427
  put?: never;
2430
2428
  /**
2431
2429
  * Start a credential/cookie authentication
2432
- * @description Authenticate a LinkedIn account directly with credentials or a session cookie. The credential fields are NESTED, not top level: `auth_method: "credentials"` reads `credentials: { email, password }`, and `auth_method: "cookie"` reads `cookie: { li_at }` plus a top-level `user_agent`. Omit `account_id` to connect a NEW account into an empty `seat_id` (list your seats with GET /v1/accounts/seats, or copy a seat id from the seat table on your dashboard); 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 not something you list: the connection asks for every product and LinkedIn activates the ones the account actually has. The recorded scope is readable as `requested_products` on the account. One LinkedIn account can hold only one of the two premium surfaces, and when both are asked for Sales Navigator takes precedence, so pass the optional `linkedin_premium` (`sales_navigator` or `recruiter`) if the account holds both and you want the other one. Omit it and nothing is narrowed. It applies per connection and is not remembered, so state it on every connect and reconnect where Recruiter must win. A reconnect that changes scope must use credentials (a saved cookie cannot change scope), which includes any reconnect of an account connected before the full product set became the default. Pin a managed proxy with the optional `country`/`ip` or supply a `proxy` to override it.
2430
+ * @description Authenticates a LinkedIn account with credentials or a cookie, nested: auth_method credentials reads credentials: { email, password }; auth_method cookie reads cookie: { li_at }. Omit account_id for a new account; include it to reconnect. Returns the account or a 202 checkpoint.
2433
2431
  */
2434
2432
  post: operations["postV1AuthIntent"];
2435
2433
  delete?: never;
@@ -2449,7 +2447,7 @@ interface paths {
2449
2447
  put?: never;
2450
2448
  /**
2451
2449
  * Solve a checkpoint verification challenge
2452
- * @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.
2450
+ * @description Resolves the pending verification challenge for account_id: a code, OTP/2FA, a contract_selection id, or TRY_ANOTHER_WAY to switch method. A chained challenge returns another 202.
2453
2451
  */
2454
2452
  post: operations["postV1AuthCheckpointSolve"];
2455
2453
  delete?: never;
@@ -2468,8 +2466,8 @@ interface paths {
2468
2466
  get?: never;
2469
2467
  put?: never;
2470
2468
  /**
2471
- * Re-request a checkpoint verification notification
2472
- * @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.
2469
+ * Re-send a checkpoint code, or switch its method
2470
+ * @description Without challenge: re-sends the pending code or notification for account_id (a two_factor_app challenge has nothing to resend: resent:false). With challenge (an id from challenge_selection): switches to that method and returns the next 202 checkpoint.
2473
2471
  */
2474
2472
  post: operations["postV1AuthCheckpointRequest"];
2475
2473
  delete?: never;
@@ -2489,7 +2487,7 @@ interface paths {
2489
2487
  put?: never;
2490
2488
  /**
2491
2489
  * Poll a mobile-app-approval checkpoint
2492
- * @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.
2490
+ * @description Polls the pending mobile-app-approval challenge for account_id and advances it; call repeatedly until active. Returns active once approved, pending while waiting, or checkpoint_required if it chains. A code-based checkpoint here returns 422; use checkpoint/solve.
2493
2491
  */
2494
2492
  post: operations["postV1AuthCheckpointPoll"];
2495
2493
  delete?: never;
@@ -2507,7 +2505,7 @@ interface paths {
2507
2505
  };
2508
2506
  /**
2509
2507
  * Get a connect session's status
2510
- * @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.
2508
+ * @description Returns a credential connect session's status by account id (from auth/intent or a checkpoint). status is checkpoint_required, done, expired, or failed; checkpoint_required carries challenge_type. Poll until status leaves checkpoint_required.
2511
2509
  */
2512
2510
  get: operations["getV1AuthSessionsSessionId"];
2513
2511
  put?: never;
@@ -2527,7 +2525,7 @@ interface paths {
2527
2525
  };
2528
2526
  /**
2529
2527
  * List the events received for an account
2530
- * @description Returns the events Curviate received for this account in the last 24 hours, newest received first, with the exact payload a registered webhook would have been delivered. Events are retained whether or not any webhook is subscribed to them, so this works with no listener running. Retention is 24 hours from received_at and is absolute, and a live claim does not extend it. Disconnecting an account removes its events from this response immediately; the rows are not otherwise deleted early. Events can arrive out of order, so treat the ordering as arrival order, not causal order. Each item carries its queue state, and `state` filters on it: `done` is what your agents have already handled, `unread` is what is still waiting, `claimed` is what someone holds right now. This read claims nothing and is safe to poll. Page until cursor is null.
2528
+ * @description Returns events received for this account in the last 24 hours, newest first, same payload a webhook would get. Retention is 24h from received_at, absolute; claiming doesn't extend it. Order is arrival, not causal. Claims nothing; safe to poll. Page until cursor is null.
2531
2529
  */
2532
2530
  get: operations["getV1AccountIdEvents"];
2533
2531
  put?: never;
@@ -2549,7 +2547,7 @@ interface paths {
2549
2547
  put?: never;
2550
2548
  /**
2551
2549
  * Claim events to work on
2552
- * @description Leases up to `limit` unread events for this account and returns them, oldest `occurred_at` first, in one atomic step. Two agents claiming at the same instant never receive the same event, which a plain read plus a read flag cannot promise. Claiming when nothing is available returns an empty list and a 200. `consumer` is free text that identifies your worker. It is recorded on each event and never verified, so the lease is cooperative: it keeps your own agents from duplicating work, and it is not access control. Finish an event with the done call, or hand it back with release. If you do neither, the lease expires after `lease_seconds` (default 300, max 3600) and the event becomes claimable again. `limit` defaults to 10 and caps at 100. Ordering is arrival order, not causal order: events can arrive out of sequence, so establish causality from the payload if you need it. Retention is still 24 hours from `received_at` and a lease does not extend it, so an event can disappear while you hold it.
2550
+ * @description Leases up to limit unread events atomically; two agents never get the same one. consumer is free text, not checked, cooperative rather than access control. Finish with done or release, or it expires after lease_seconds. Retention is still 24h; an event can vanish while held.
2553
2551
  */
2554
2552
  post: operations["postV1AccountIdEventsClaim"];
2555
2553
  delete?: never;
@@ -2569,7 +2567,7 @@ interface paths {
2569
2567
  put?: never;
2570
2568
  /**
2571
2569
  * Release a claimed event
2572
- * @description Hands a leased event back so it can be claimed again immediately, by you or by anyone else. Use it when your handler fails: returning the work is better than holding it for the rest of the lease. No request body. The caller is not checked against whoever claimed it, because the lease is cooperative rather than access control. Releasing an event that is already done changes nothing and returns state `done`.
2570
+ * @description Hands a leased event back so it can be claimed again immediately. Use when your handler fails. Not checked against the original claimer: cooperative, not access control. Releasing an already-done event changes nothing.
2573
2571
  */
2574
2572
  post: operations["postV1AccountIdEventsEventIdRelease"];
2575
2573
  delete?: never;
@@ -2589,7 +2587,7 @@ interface paths {
2589
2587
  put?: never;
2590
2588
  /**
2591
2589
  * Mark an event done
2592
- * @description Marks an event handled. This is the only terminal state there is, and it is shared across every consumer under this tenant: a done event leaves the unread set for all of them, so it is the signal that the work is finished rather than a per-agent bookmark. There is no failed state. An event nothing can handle needs no special marking, it expires with the rest at 24 hours. No request body, safe to call twice, and it keeps the first completion time.
2590
+ * @description Marks an event handled, the only terminal state, shared across every consumer under the tenant. No failed state; an unhandled event just expires at 24 hours. Safe to call twice; keeps the first completion time.
2593
2591
  */
2594
2592
  post: operations["postV1AccountIdEventsEventIdDone"];
2595
2593
  delete?: never;
@@ -2653,7 +2651,7 @@ interface paths {
2653
2651
  put?: never;
2654
2652
  /**
2655
2653
  * Send a test delivery
2656
- * @description Queues a synthetic delivery to this webhook so you can confirm your endpoint really receives and verifies deliveries, without waiting for a real event. It travels the normal path: the same signature construction, the same custom headers, the same delivery record, the same retry schedule. The event name is always webhook.test, which is not in the event catalogue and cannot be subscribed to, so it can never be mistaken for a real event. The payload carries no LinkedIn content. Match data.test_id in what arrives against the test_id in this response.
2654
+ * @description Queues a synthetic delivery to this webhook to confirm your endpoint receives and verifies deliveries. Travels the normal path: signature, headers, retry schedule. Event name is always webhook.test, never a real event. Match data.test_id against this response's test_id.
2657
2655
  */
2658
2656
  post: operations["postV1WebhooksIdTest"];
2659
2657
  delete?: never;
@@ -2699,7 +2697,7 @@ interface paths {
2699
2697
  };
2700
2698
  /**
2701
2699
  * Read an account's safety policy
2702
- * @description Returns every configurable safety field for every budget row of one account, in a single response: the ceiling, the green and amber bands, the counting window, the enforcement posture and where it was inherited from, the activity window, warm-up state, the per-row character caps and search per-query cap, and how well calibrated each row's number is. Every value is seeded configuration and every one of them is settable. Each value is this account's own where it set one, otherwise the tenant default for its `limit_profile` (`GET /v1/safety-policy`), otherwise the Curviate default. Where a configured value is above the Curviate default, the row carries an `over_default` entry naming the value, the default and the source class of that default. The response also carries `tenant_default_posture`, the workspace-wide default every account inherits, separately from this account's own effective `posture`, and `limit_profile`, which says which of the four Curviate default sets (`basic`, `premium`, `sales_navigator`, `recruiter`) every row below was resolved from, detected from the platform when the account connected.
2700
+ * @description Returns every configurable safety field for every budget row of this account: ceiling, bands, window, posture, warm-up, and where each value was inherited from. Fields, posture and precedence: /reference/safety.
2703
2701
  */
2704
2702
  get: operations["getV1AccountIdSafetyPolicy"];
2705
2703
  put?: never;
@@ -2709,7 +2707,7 @@ interface paths {
2709
2707
  head?: never;
2710
2708
  /**
2711
2709
  * Update an account's safety policy
2712
- * @description The account-level safety-policy write (tenant-wide defaults are set on `PATCH /v1/safety-policy`). Send only the fields you are changing: everything you omit is left byte-identical, and sending `null` for a field clears your override and restores the tenant default where one is set, the Curviate default otherwise. Any limit may be set to any value: Curviate does not clamp, cap or refuse a change on the grounds that the number is unsafe. A value above the Curviate default is reported back in the response, and on every later read, with the default and its source class attached; there is no way to acknowledge it away, and setting the value back to the default removes it. A value that is not a value, such as a negative ceiling or an unknown row name, is a 400. Every field whose value CHANGES is appended to the account's action ledger with the previous value, the new value, the Curviate default, the actor and the time; a field you send whose value already equals its current effective value is not ledgered and is not stored as an override, so reading the policy and sending the document back changes nothing. Six fields on the read are derived rather than configured: `effective_ceiling`, `interface_ceiling`, `effective_interface_ceiling`, `posture_source`, `over_default` and each row's `warm_up_state`. Send them and they are accepted and ignored, never stored and never ledgered, so the document you read can go straight back. To pin a row's ramp, set `warm_up_factor`. `activity_window` is not accepted: send its settable subfields instead, the top-level `timezone` for the zone, and per row `activity_window_start`, `activity_window_end`, `activity_window_timezone` and `activity_window_applies_to`. The 400 this produces names those subfields, not just the refused object. And read `changes nothing` as `changes no limit`: the `posture` fields are OVERRIDES at every scope, so writing back a posture a scope merely inherits PINS it there and appends one ledger entry per pinned scope. That is what stops a later account- or tenant-wide change from moving it. A pin already in place is a no-op. An agent-authenticated write is accepted on exactly the same footing as an operator's. There is no bulk import, file upload or policy template: configuring many rows or many accounts is a loop over this operation. One field is not account-scoped: `tenant_default_posture` sets the default for EVERY account in the tenant, not just the one in the path, which is what makes it a one-call change for a whole workspace of personas. It is reported back at the top of every policy response, so a change to it is visible even on an account that overrides it. One other field is not row-scoped: `limit_profile` selects which of the four Curviate default sets this account's rows resolve from, so it moves the default under every row at once while leaving every value you have configured explicitly exactly as you set it. It is the platform product active on the account, not your Curviate seat entitlement, and the two can disagree: a lapsed subscription leaves the seat untouched. Curviate detects it when the account connects and re-detects it on every reconnect; setting it here pins it, and the pin wins from then on: no connect, reconnect or account read moves it again until you release it with `limit_profile_source: "default"`, which is sent on its own: changing `limit_profile` and releasing it in the same request is refused. One field on this operation does not configure anything: `clear_halts` lifts the platform pause on the action types you name. When the platform refuses a call on an account, Curviate pauses that action type for the platform's own retry-after or a seeded cooldown, and every later call on it is refused locally without reaching the platform; the account resource reports the live pauses as `quotas[].halt`. Naming an action type here lifts its pause immediately, so the next call goes out. An action type with no active pause is accepted and does nothing, which makes it safe to send for a set you have not checked, and only the ones actually lifted are ledgered, each with the expiry it cut short, the actor and the time, readable afterwards on `GET /v1/{account_id}/safety-events` with `reason: "halt_cleared"`. Clearing disarms nothing: if the platform refuses the account again the pause returns, and a 429 or a refused write returns it for the full cooldown. Clear one when you have reason to believe the refusal was a transient upstream fault rather than the platform pushing back on this account.
2710
+ * @description Updates this account's safety policy. Send only the fields you're changing; null clears an override back to the tenant or Curviate default. Any value is accepted, none are clamped. Fields, posture and precedence: /reference/safety.
2713
2711
  */
2714
2712
  patch: operations["patchV1AccountIdSafetyPolicy"];
2715
2713
  trace?: never;
@@ -2722,8 +2720,8 @@ interface paths {
2722
2720
  cookie?: never;
2723
2721
  };
2724
2722
  /**
2725
- * List what Curviate refused or warned about
2726
- * @description Returns this account's safety events, newest first: every action Curviate refused, and every action it let through while flagging that a limit had been crossed. Under the default posture nothing is refused, so everything here is a warning and `blocked` is how you tell the two apart. Each event names the budget row that breached, why, the operation that hit it and when. Filter by `budget_row` for one action type and by `since` / `until` for a period, and page until `cursor` is null. This is a read of what already happened, so it never changes a limit or a count: to change what is refused, update the safety policy. The account resource is the other half of the picture, reporting where each row stands right now rather than what has already been flagged. One entry here is not a refusal: `reason: "halt_cleared"` with `blocked: false` records somebody lifting a platform pause early through `clear_halts` on the safety policy, and it sits beside the `rate_limited` entry it lifted so the pause and its end read as one thread.
2723
+ * List limit hits
2724
+ * @description Each entry is an action Curviate refused (enforce) or warned about (warn) at a safety limit or pause, or a halt_cleared record of a pause lifted early. Read blocked and reason; filter by budget_row, since and until, and page until cursor is null.
2727
2725
  */
2728
2726
  get: operations["getV1AccountIdSafetyEvents"];
2729
2727
  put?: never;
@@ -2743,7 +2741,7 @@ interface paths {
2743
2741
  };
2744
2742
  /**
2745
2743
  * Read the tenant safety defaults
2746
- * @description Returns the tenant-wide safety defaults, per limit profile and per budget row: the values every account on that profile resolves from unless it sets its own. A value nobody has set here is the Curviate default, and a value set above the Curviate default carries an `over_default` entry naming the value, the default and its source class. Also carries `tenant_default_posture`. Works with no accounts connected, so defaults can be in place before the first one is.
2744
+ * @description Returns the tenant-wide safety defaults per limit profile and budget row, that accounts resolve from unless they override. Works with no accounts connected. Fields, posture and precedence: /reference/safety.
2747
2745
  */
2748
2746
  get: operations["getV1SafetyPolicy"];
2749
2747
  put?: never;
@@ -2753,11 +2751,71 @@ interface paths {
2753
2751
  head?: never;
2754
2752
  /**
2755
2753
  * Update the tenant safety defaults
2756
- * @description The tenant-level safety-policy write. Sets defaults per limit profile and per budget row; every account on that profile resolves from them unless it overrides the same field itself, including accounts connected later. THIS CHANGES EVERY ACCOUNT IN THE TENANT THAT HAS NOT OVERRIDDEN THE FIELD, and it applies immediately: under `enforce` posture, lowering a default can start refusing actions across the tenant in one request. The response carries `impact`: how many accounts had a ceiling change, and how many moved into `over`, measured on those accounts before and after the write. Send only what you are changing; `null` clears a default back to the Curviate default. A value equal to the one already in force is not stored and not recorded. Any limit may be set to any value, and a value above the Curviate default is reported rather than refused. Every change is appended to the ledger with the previous value, the new value, the Curviate default, the actor and the time. Per-row posture is not a tenant default: use `tenant_default_posture` here, or `posture` on an account's own policy. Per-account values are set on `PATCH /v1/{account_id}/safety-policy`.
2754
+ * @description Updates tenant-wide safety defaults per limit profile and budget row; affects every account that hasn't overridden the field, immediately. Fields, posture and precedence: /reference/safety.
2757
2755
  */
2758
2756
  patch: operations["patchV1SafetyPolicy"];
2759
2757
  trace?: never;
2760
2758
  };
2759
+ "/v1/billing/seats/add": {
2760
+ parameters: {
2761
+ query?: never;
2762
+ header?: never;
2763
+ path?: never;
2764
+ cookie?: never;
2765
+ };
2766
+ get?: never;
2767
+ put?: never;
2768
+ /**
2769
+ * Add seats
2770
+ * @description Adds seats to the workspace's active subscription. A trialing workspace gets 409 TRIAL_ACTIVE_SEAT_LIMIT (buy to convert first). Every call buys the seats it asks for.
2771
+ */
2772
+ post: operations["postV1BillingSeatsAdd"];
2773
+ delete?: never;
2774
+ options?: never;
2775
+ head?: never;
2776
+ patch?: never;
2777
+ trace?: never;
2778
+ };
2779
+ "/v1/billing/seats/{seat_id}/cancel": {
2780
+ parameters: {
2781
+ query?: never;
2782
+ header?: never;
2783
+ path?: never;
2784
+ cookie?: never;
2785
+ };
2786
+ get?: never;
2787
+ put?: never;
2788
+ /**
2789
+ * Cancel a seat
2790
+ * @description Schedules a seat for cancellation at the end of the current period. Already scheduled: returns the existing effective date. Already effective: 400 ALREADY_CANCELLED.
2791
+ */
2792
+ post: operations["postV1BillingSeatsSeatIdCancel"];
2793
+ delete?: never;
2794
+ options?: never;
2795
+ head?: never;
2796
+ patch?: never;
2797
+ trace?: never;
2798
+ };
2799
+ "/v1/billing/seats/{seat_id}/cancel/revert": {
2800
+ parameters: {
2801
+ query?: never;
2802
+ header?: never;
2803
+ path?: never;
2804
+ cookie?: never;
2805
+ };
2806
+ get?: never;
2807
+ put?: never;
2808
+ /**
2809
+ * Revert a scheduled seat cancellation
2810
+ * @description Reverts a seat's pending end-of-period cancellation. 400 CANCELLATION_ALREADY_EFFECTIVE when nothing is scheduled or it already took effect; 400 INVALID_CANCELLATION_SOURCE when the whole subscription, not this seat, was scheduled to cancel.
2811
+ */
2812
+ post: operations["postV1BillingSeatsSeatIdCancelRevert"];
2813
+ delete?: never;
2814
+ options?: never;
2815
+ head?: never;
2816
+ patch?: never;
2817
+ trace?: never;
2818
+ };
2761
2819
  }
2762
2820
  interface components {
2763
2821
  schemas: {
@@ -2960,18 +3018,18 @@ interface operations {
2960
3018
  getV1AccountIdUsersUserId: {
2961
3019
  parameters: {
2962
3020
  query?: {
2963
- /** @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. */
3021
+ /** @description Profile sections to fetch, repeatable: linkedin_experience, linkedin_skills, and others (each has a _preview variant). Omit for base fields only. */
2964
3022
  linkedin_sections?: string[];
2965
- /** @description How willing this read is to reach LinkedIn. `auto` (default) serves a stored copy while it is within the resource's freshness threshold; `live` always fetches; `refill` serves a stored copy at any age and fetches once when this read has no stored copy yet; `cache_only` never fetches and returns NOT_STORED when nothing is stored. `cache_only` cannot be combined with max_age. A 502 under `cache_only` means the store could not be read, not that nothing is stored: no request was made to LinkedIn, and the same read is worth retrying. */
3023
+ /** @description How willing this read is to reach LinkedIn: auto (default), live, refill, or cache_only. Details: /reference/getting-started/cache. */
2966
3024
  mode?: "live" | "auto" | "refill" | "cache_only";
2967
- /** @description Maximum age, in seconds, of a stored copy this read will accept. Overrides the `auto`, `live` and `refill` presets in both directions; `0` is the same as `mode=live`. Not accepted with `mode=cache_only`, whose guarantee is not a freshness threshold. */
3025
+ /** @description Maximum age in seconds of a stored copy this read accepts; overrides mode in both directions. Not with cache_only. Details: /reference/getting-started/cache. */
2968
3026
  max_age?: number;
2969
3027
  };
2970
3028
  header?: never;
2971
3029
  path: {
2972
3030
  /** @description The account ID (`acc_...`) to use for the request. */
2973
3031
  account_id: string;
2974
- /** @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. */
3032
+ /** @description "me" for the caller, or a public identifier, member ID, or profile URL. endorsement_id appears only for connections eligible to endorse. */
2975
3033
  user_id: string;
2976
3034
  };
2977
3035
  cookie?: never;
@@ -3624,7 +3682,7 @@ interface operations {
3624
3682
  /** @description New last name. */
3625
3683
  last_name?: string;
3626
3684
  /** @description New text for your profile's About section. */
3627
- bio?: string;
3685
+ bio?: "" | string;
3628
3686
  /** @description Your profile headline (the short line shown under your name). */
3629
3687
  headline?: string;
3630
3688
  /** @description Skills to add to your profile. Add-only, this does not remove or reorder existing skills. */
@@ -4672,9 +4730,9 @@ interface operations {
4672
4730
  getV1AccountIdProfileVisitors: {
4673
4731
  parameters: {
4674
4732
  query?: {
4675
- /** @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. */
4733
+ /** @description Maximum viewers per page (1-100, default 20). The returned count can exceed this; the response includes a cursor to continue. */
4676
4734
  limit?: number;
4677
- /** @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. */
4735
+ /** @description Opaque cursor from a prior response's cursor; omit for the first page. Page until cursor is null, even on a page with zero people. */
4678
4736
  cursor?: string;
4679
4737
  };
4680
4738
  header?: never;
@@ -5541,7 +5599,7 @@ interface operations {
5541
5599
  path: {
5542
5600
  /** @description The connected LinkedIn account to read with. */
5543
5601
  account_id: string;
5544
- /** @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. */
5602
+ /** @description The company to retrieve: its public handle (the `linkedin.com/company/<handle>` slug) or numeric id. Both come back on a search/companies result. */
5545
5603
  identifier: string;
5546
5604
  };
5547
5605
  cookie?: never;
@@ -5765,7 +5823,7 @@ interface operations {
5765
5823
  path: {
5766
5824
  /** @description The connected LinkedIn account to read with. */
5767
5825
  account_id: string;
5768
- /** @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. */
5826
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
5769
5827
  identifier: string;
5770
5828
  };
5771
5829
  cookie?: never;
@@ -5952,7 +6010,7 @@ interface operations {
5952
6010
  path: {
5953
6011
  /** @description The connected LinkedIn account to read with. */
5954
6012
  account_id: string;
5955
- /** @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. */
6013
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
5956
6014
  identifier: string;
5957
6015
  };
5958
6016
  cookie?: never;
@@ -6148,7 +6206,7 @@ interface operations {
6148
6206
  path: {
6149
6207
  /** @description The connected LinkedIn account to read with. */
6150
6208
  account_id: string;
6151
- /** @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. */
6209
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
6152
6210
  identifier: string;
6153
6211
  };
6154
6212
  cookie?: never;
@@ -6321,7 +6379,7 @@ interface operations {
6321
6379
  path: {
6322
6380
  /** @description The connected LinkedIn account, which must administer the page with invite rights. */
6323
6381
  account_id: string;
6324
- /** @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. */
6382
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
6325
6383
  identifier: string;
6326
6384
  };
6327
6385
  cookie?: never;
@@ -6335,7 +6393,7 @@ interface operations {
6335
6393
  };
6336
6394
  };
6337
6395
  responses: {
6338
- /** @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. */
6396
+ /** @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"; calling again never creates a duplicate. Only identifiers transit; nothing is stored. */
6339
6397
  200: {
6340
6398
  headers: {
6341
6399
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -6359,7 +6417,7 @@ interface operations {
6359
6417
  /** @description The member id from the request, echoed back. */
6360
6418
  invitee_id: string;
6361
6419
  /**
6362
- * @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.
6420
+ * @description Per-invitee outcome. "invited": a new follow-invitation was created. "already_invited": a pending invitation already existed; calling again returns the same invitation_id, never a duplicate. "ineligible": the member is not an invitable 1st-degree connection. "not_found": the member id did not resolve.
6363
6421
  * @enum {string}
6364
6422
  */
6365
6423
  status: "invited" | "already_invited" | "ineligible" | "not_found";
@@ -6493,7 +6551,7 @@ interface operations {
6493
6551
  path: {
6494
6552
  /** @description The connected LinkedIn account, which must administer the page. */
6495
6553
  account_id: string;
6496
- /** @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. */
6554
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
6497
6555
  identifier: string;
6498
6556
  };
6499
6557
  cookie?: never;
@@ -6651,7 +6709,7 @@ interface operations {
6651
6709
  path: {
6652
6710
  /** @description The connected LinkedIn account, which must administer the page with invite rights. */
6653
6711
  account_id: string;
6654
- /** @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. */
6712
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
6655
6713
  identifier: string;
6656
6714
  };
6657
6715
  cookie?: never;
@@ -6794,14 +6852,14 @@ interface operations {
6794
6852
  limit?: number;
6795
6853
  /** @description Opaque pagination cursor from a prior response's cursor. Omit for the first page. */
6796
6854
  cursor?: string;
6797
- /** @description Additional response fields to resolve, comma-separated in a single value (for example expand=public_identifier). Accepted values: public_identifier. When requested, the field is present on every user object in the response, carrying either a value or null. Omit for the base fields only. Pass the parameter once; repeating it drops values. At most 25 people per request need an extra lookup to resolve; anyone beyond that carries null, so ask for a smaller page to resolve them all. */
6855
+ /** @description Extra fields to resolve, comma-separated in one value (expand=public_identifier). Present on every result as a value or null; repeating the key drops values. */
6798
6856
  expand?: string;
6799
6857
  };
6800
6858
  header?: never;
6801
6859
  path: {
6802
6860
  /** @description The connected LinkedIn account, which must administer the page. */
6803
6861
  account_id: string;
6804
- /** @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. */
6862
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
6805
6863
  identifier: string;
6806
6864
  };
6807
6865
  cookie?: never;
@@ -6985,14 +7043,14 @@ interface operations {
6985
7043
  getV1AccountIdCompaniesIdentifierChatsChatId: {
6986
7044
  parameters: {
6987
7045
  query?: {
6988
- /** @description Additional response fields to resolve, comma-separated in a single value (for example expand=public_identifier). Accepted values: public_identifier. When requested, the field is present on every user object in the response, carrying either a value or null. Omit for the base fields only. Pass the parameter once; repeating it drops values. At most 25 people per request need an extra lookup to resolve; anyone beyond that carries null, so ask for a smaller page to resolve them all. */
7046
+ /** @description Extra fields to resolve, comma-separated in one value (expand=public_identifier). Present on every result as a value or null; repeating the key drops values. */
6989
7047
  expand?: string;
6990
7048
  };
6991
7049
  header?: never;
6992
7050
  path: {
6993
7051
  /** @description The connected LinkedIn account, which must administer the page. */
6994
7052
  account_id: string;
6995
- /** @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. */
7053
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
6996
7054
  identifier: string;
6997
7055
  /** @description The conversation id in the "2-..." form, the id field of a chats list or search result. Pass it verbatim. */
6998
7056
  chat_id: string;
@@ -7172,14 +7230,14 @@ interface operations {
7172
7230
  limit?: number;
7173
7231
  /** @description Opaque pagination cursor from a prior response's cursor. Omit for the first page. */
7174
7232
  cursor?: string;
7175
- /** @description Additional response fields to resolve, comma-separated in a single value (for example expand=public_identifier). Accepted values: public_identifier. When requested, the field is present on every user object in the response, carrying either a value or null. Omit for the base fields only. Pass the parameter once; repeating it drops values. At most 25 people per request need an extra lookup to resolve; anyone beyond that carries null, so ask for a smaller page to resolve them all. */
7233
+ /** @description Extra fields to resolve, comma-separated in one value (expand=public_identifier). Present on every result as a value or null; repeating the key drops values. */
7176
7234
  expand?: string;
7177
7235
  };
7178
7236
  header?: never;
7179
7237
  path: {
7180
7238
  /** @description The connected LinkedIn account, which must administer the page. */
7181
7239
  account_id: string;
7182
- /** @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. */
7240
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
7183
7241
  identifier: string;
7184
7242
  /** @description The conversation id in the "2-..." form, the id field of a chats list or search result. Pass it verbatim. */
7185
7243
  chat_id: string;
@@ -7348,7 +7406,7 @@ interface operations {
7348
7406
  path: {
7349
7407
  /** @description The connected LinkedIn account, which must administer the page. */
7350
7408
  account_id: string;
7351
- /** @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. */
7409
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
7352
7410
  identifier: string;
7353
7411
  /** @description The conversation id in the "2-..." form, the id field of a chats list or search result. Pass it verbatim. */
7354
7412
  chat_id: string;
@@ -7362,7 +7420,7 @@ interface operations {
7362
7420
  text?: string;
7363
7421
  /** @description Optional message ID to quote or reply to. */
7364
7422
  quote_id?: string;
7365
- /** @description Optional file attachments (base64-encoded). */
7423
+ /** @description Optional file attachments, base64-encoded: at most 5 MiB per file and 9 MiB for the whole request body (base64 adds about a third). */
7366
7424
  attachments?: {
7367
7425
  /** @description Base64-encoded file bytes. */
7368
7426
  content: string;
@@ -7523,14 +7581,14 @@ interface operations {
7523
7581
  getV1AccountIdCompaniesIdentifierChatsChatIdMessagesMessageId: {
7524
7582
  parameters: {
7525
7583
  query?: {
7526
- /** @description Additional response fields to resolve, comma-separated in a single value (for example expand=public_identifier). Accepted values: public_identifier. When requested, the field is present on every user object in the response, carrying either a value or null. Omit for the base fields only. Pass the parameter once; repeating it drops values. At most 25 people per request need an extra lookup to resolve; anyone beyond that carries null, so ask for a smaller page to resolve them all. */
7584
+ /** @description Extra fields to resolve, comma-separated in one value (expand=public_identifier). Present on every result as a value or null; repeating the key drops values. */
7527
7585
  expand?: string;
7528
7586
  };
7529
7587
  header?: never;
7530
7588
  path: {
7531
7589
  /** @description The connected LinkedIn account, which must administer the page. */
7532
7590
  account_id: string;
7533
- /** @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. */
7591
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
7534
7592
  identifier: string;
7535
7593
  /** @description The conversation id in the "2-..." form, the id field of a chats list or search result. Pass it verbatim. */
7536
7594
  chat_id: string;
@@ -7697,14 +7755,14 @@ interface operations {
7697
7755
  limit?: number;
7698
7756
  /** @description Opaque pagination cursor from a prior response's cursor. Omit for the first page. */
7699
7757
  cursor?: string;
7700
- /** @description Additional response fields to resolve, comma-separated in a single value (for example expand=public_identifier). Accepted values: public_identifier. When requested, the field is present on every user object in the response, carrying either a value or null. Omit for the base fields only. Pass the parameter once; repeating it drops values. At most 25 people per request need an extra lookup to resolve; anyone beyond that carries null, so ask for a smaller page to resolve them all. */
7758
+ /** @description Extra fields to resolve, comma-separated in one value (expand=public_identifier). Present on every result as a value or null; repeating the key drops values. */
7701
7759
  expand?: string;
7702
7760
  };
7703
7761
  header?: never;
7704
7762
  path: {
7705
7763
  /** @description The connected LinkedIn account, which must administer the page. */
7706
7764
  account_id: string;
7707
- /** @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. */
7765
+ /** @description The company's numeric id (e.g. 112013061), the id field from GET .../companies/{identifier} or a search/companies result. A handle or URN is not accepted here. */
7708
7766
  identifier: string;
7709
7767
  };
7710
7768
  cookie?: never;
@@ -7893,9 +7951,9 @@ interface operations {
7893
7951
  getV1AccountIdProfileGroups: {
7894
7952
  parameters: {
7895
7953
  query?: {
7896
- /** @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). */
7954
+ /** @description Target another LinkedIn user's groups instead of your own (vanity slug or /in/{vanity} URL). Partial read: interests-groups section only. */
7897
7955
  profile?: string;
7898
- /** @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. */
7956
+ /** @description Maximum items per page (1-100, default 20). The returned count can exceed this; the response includes a cursor to continue. */
7899
7957
  limit?: number;
7900
7958
  /** @description Opaque pagination cursor from a prior response's cursor. Omit for the first page. */
7901
7959
  cursor?: string;
@@ -8081,7 +8139,7 @@ interface operations {
8081
8139
  path: {
8082
8140
  /** @description The connected LinkedIn account performing the read. */
8083
8141
  account_id: string;
8084
- /** @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. */
8142
+ /** @description The group to look up: a numeric group id (e.g. 9123014) or its full group URL; the id is extracted from either form. */
8085
8143
  group: string;
8086
8144
  };
8087
8145
  cookie?: never;
@@ -8253,18 +8311,18 @@ interface operations {
8253
8311
  getV1AccountIdGroupsGroupMembers: {
8254
8312
  parameters: {
8255
8313
  query?: {
8256
- /** @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. */
8314
+ /** @description Filter members by name, prefix/substring, case-insensitive. Folds in member search as this endpoint, not a separate one. */
8257
8315
  name?: string;
8258
- /** @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. */
8316
+ /** @description Maximum items per page (1-100, default 20). The returned count can exceed this; the response includes a cursor to continue. */
8259
8317
  limit?: number;
8260
- /** @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. */
8318
+ /** @description Opaque cursor from a prior response's cursor. Omit for the first page. Scoped to the name value it was minted under. */
8261
8319
  cursor?: string;
8262
8320
  };
8263
8321
  header?: never;
8264
8322
  path: {
8265
8323
  /** @description The connected LinkedIn account performing the read. */
8266
8324
  account_id: string;
8267
- /** @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. */
8325
+ /** @description The group to look up: a numeric group id (e.g. 9123014) or its full group URL; the id is extracted from either form. */
8268
8326
  group: string;
8269
8327
  };
8270
8328
  cookie?: never;
@@ -8416,7 +8474,7 @@ interface operations {
8416
8474
  getV1AccountIdSearchParameters: {
8417
8475
  parameters: {
8418
8476
  query: {
8419
- /** @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. */
8477
+ /** @description Parameter type to resolve. Non-classic types (e.g. GROUPS, SALES_INDUSTRY) are rejected. */
8420
8478
  type: "LOCATION" | "PEOPLE" | "RELATION" | "COMPANY" | "SCHOOL" | "INDUSTRY" | "SERVICE" | "JOB_FUNCTION" | "JOB_TITLE" | "EMPLOYMENT_TYPE" | "SKILL";
8421
8479
  /** @description Human term to resolve to opaque filter IDs (e.g. 'software development'). Required for every type, including EMPLOYMENT_TYPE. */
8422
8480
  keywords: string;
@@ -10279,7 +10337,7 @@ interface operations {
10279
10337
  limit?: number;
10280
10338
  /** @description An opaque cursor for pagination. Pass the `cursor` from the preceding response to fetch the next page. */
10281
10339
  cursor?: string;
10282
- /** @description Additional response fields to resolve, comma-separated in a single value (for example expand=public_identifier). Accepted values: public_identifier. When requested, the field is present on every user object in the response, carrying either a value or null. Omit for the base fields only. Pass the parameter once; repeating it drops values. At most 25 people per request need an extra lookup to resolve; anyone beyond that carries null, so ask for a smaller page to resolve them all. */
10340
+ /** @description Extra fields to resolve, comma-separated in one value (expand=public_identifier). Present on every result as a value or null; repeating the key drops values. */
10283
10341
  expand?: string;
10284
10342
  };
10285
10343
  header?: never;
@@ -10549,7 +10607,7 @@ interface operations {
10549
10607
  text: string;
10550
10608
  /** @description Optional conversation name / subject line (<= 200 chars). */
10551
10609
  subject?: string;
10552
- /** @description Optional file attachments (base64-encoded). */
10610
+ /** @description Optional file attachments, base64-encoded: at most 5 MiB per file and 9 MiB for the whole request body (base64 adds about a third). */
10553
10611
  attachments?: {
10554
10612
  /** @description Base64-encoded file bytes. */
10555
10613
  content: string;
@@ -10702,11 +10760,11 @@ interface operations {
10702
10760
  getV1AccountIdChatsChatId: {
10703
10761
  parameters: {
10704
10762
  query?: {
10705
- /** @description Additional response fields to resolve, comma-separated in a single value (for example expand=public_identifier). Accepted values: public_identifier. When requested, the field is present on every user object in the response, carrying either a value or null. Omit for the base fields only. Pass the parameter once; repeating it drops values. At most 25 people per request need an extra lookup to resolve; anyone beyond that carries null, so ask for a smaller page to resolve them all. */
10763
+ /** @description Extra fields to resolve, comma-separated in one value (expand=public_identifier). Present on every result as a value or null; repeating the key drops values. */
10706
10764
  expand?: string;
10707
- /** @description How willing this read is to reach LinkedIn. `auto` (default) serves a stored copy while it is within the resource's freshness threshold; `live` always fetches; `refill` serves a stored copy at any age and fetches once when this read has no stored copy yet; `cache_only` never fetches and returns NOT_STORED when nothing is stored. `cache_only` cannot be combined with max_age. A 502 under `cache_only` means the store could not be read, not that nothing is stored: no request was made to LinkedIn, and the same read is worth retrying. */
10765
+ /** @description How willing this read is to reach LinkedIn: auto (default), live, refill, or cache_only. Details: /reference/getting-started/cache. */
10708
10766
  mode?: "live" | "auto" | "refill" | "cache_only";
10709
- /** @description Maximum age, in seconds, of a stored copy this read will accept. Overrides the `auto`, `live` and `refill` presets in both directions; `0` is the same as `mode=live`. Not accepted with `mode=cache_only`, whose guarantee is not a freshness threshold. */
10767
+ /** @description Maximum age in seconds of a stored copy this read accepts; overrides mode in both directions. Not with cache_only. Details: /reference/getting-started/cache. */
10710
10768
  max_age?: number;
10711
10769
  };
10712
10770
  header?: never;
@@ -11095,9 +11153,9 @@ interface operations {
11095
11153
  getV1AccountIdChatsChatIdMessages: {
11096
11154
  parameters: {
11097
11155
  query?: {
11098
- /** @description How willing this read is to reach LinkedIn. `auto` (default) serves a stored copy while it is within the resource's freshness threshold; `live` always fetches; `refill` serves a stored copy at any age and fetches once when this read has no stored copy yet; `cache_only` never fetches and returns NOT_STORED when nothing is stored. `cache_only` cannot be combined with max_age. A 502 under `cache_only` means the store could not be read, not that nothing is stored: no request was made to LinkedIn, and the same read is worth retrying. */
11156
+ /** @description How willing this read is to reach LinkedIn: auto (default), live, refill, or cache_only. Details: /reference/getting-started/cache. */
11099
11157
  mode?: "live" | "auto" | "refill" | "cache_only";
11100
- /** @description Maximum age, in seconds, of a stored copy this read will accept. Overrides the `auto`, `live` and `refill` presets in both directions; `0` is the same as `mode=live`. Not accepted with `mode=cache_only`, whose guarantee is not a freshness threshold. */
11158
+ /** @description Maximum age in seconds of a stored copy this read accepts; overrides mode in both directions. Not with cache_only. Details: /reference/getting-started/cache. */
11101
11159
  max_age?: number;
11102
11160
  /** @description Optional filter: only return messages from this sender ID. */
11103
11161
  user_id?: string;
@@ -11109,7 +11167,7 @@ interface operations {
11109
11167
  limit?: number;
11110
11168
  /** @description An opaque cursor for pagination. Pass the `cursor` from the preceding response to fetch the next page. */
11111
11169
  cursor?: string;
11112
- /** @description Additional response fields to resolve, comma-separated in a single value (for example expand=public_identifier). Accepted values: public_identifier. When requested, the field is present on every user object in the response, carrying either a value or null. Omit for the base fields only. Pass the parameter once; repeating it drops values. At most 25 people per request need an extra lookup to resolve; anyone beyond that carries null, so ask for a smaller page to resolve them all. */
11170
+ /** @description Extra fields to resolve, comma-separated in one value (expand=public_identifier). Present on every result as a value or null; repeating the key drops values. */
11113
11171
  expand?: string;
11114
11172
  };
11115
11173
  header?: never;
@@ -11335,7 +11393,7 @@ interface operations {
11335
11393
  path: {
11336
11394
  /** @description The account ID (`acc_...`) that owns the chat. */
11337
11395
  account_id: string;
11338
- /** @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. */
11396
+ /** @description The chat to send to. A COMPANY_ chat id (from the inboxes endpoints) sends as that company page instead of the connected member. */
11339
11397
  chat_id: string;
11340
11398
  };
11341
11399
  cookie?: never;
@@ -11347,7 +11405,7 @@ interface operations {
11347
11405
  text?: string;
11348
11406
  /** @description Optional message ID to quote or reply to. */
11349
11407
  quote_id?: string;
11350
- /** @description Optional file attachments (base64-encoded). */
11408
+ /** @description Optional file attachments, base64-encoded: at most 5 MiB per file and 9 MiB for the whole request body (base64 adds about a third). */
11351
11409
  attachments?: {
11352
11410
  /** @description Base64-encoded file bytes. */
11353
11411
  content: string;
@@ -11499,7 +11557,7 @@ interface operations {
11499
11557
  getV1AccountIdChatsChatIdMessagesMessageId: {
11500
11558
  parameters: {
11501
11559
  query?: {
11502
- /** @description Additional response fields to resolve, comma-separated in a single value (for example expand=public_identifier). Accepted values: public_identifier. When requested, the field is present on every user object in the response, carrying either a value or null. Omit for the base fields only. Pass the parameter once; repeating it drops values. At most 25 people per request need an extra lookup to resolve; anyone beyond that carries null, so ask for a smaller page to resolve them all. */
11560
+ /** @description Extra fields to resolve, comma-separated in one value (expand=public_identifier). Present on every result as a value or null; repeating the key drops values. */
11503
11561
  expand?: string;
11504
11562
  };
11505
11563
  header?: never;
@@ -12171,7 +12229,7 @@ interface operations {
12171
12229
  getV1AccountIdChatsSearch: {
12172
12230
  parameters: {
12173
12231
  query: {
12174
- /** @description The search term: matches both participant names and message content (e.g. 'sophie keller'). Minimum 3 characters. A shorter term cannot use the search index and is rejected with INVALID_REQUEST. */
12232
+ /** @description Search term, matches participant names and message content. Minimum 3 characters. */
12175
12233
  query: string;
12176
12234
  /** @description Maximum chats to return per page (1-100, default 20). The server may walk a few internal pages to fill one page. */
12177
12235
  limit?: number;
@@ -12651,7 +12709,7 @@ interface operations {
12651
12709
  limit?: number;
12652
12710
  /** @description An opaque cursor for pagination. Pass the `cursor` from the preceding response to fetch the next page. */
12653
12711
  cursor?: string;
12654
- /** @description Additional response fields to resolve, comma-separated in a single value (for example expand=public_identifier). Accepted values: public_identifier. When requested, the field is present on every user object in the response, carrying either a value or null. Omit for the base fields only. Pass the parameter once; repeating it drops values. At most 25 people per request need an extra lookup to resolve; anyone beyond that carries null, so ask for a smaller page to resolve them all. */
12712
+ /** @description Extra fields to resolve, comma-separated in one value (expand=public_identifier). Present on every result as a value or null; repeating the key drops values. */
12655
12713
  expand?: string;
12656
12714
  };
12657
12715
  header?: never;
@@ -12907,11 +12965,11 @@ interface operations {
12907
12965
  getV1AccountIdFeedHome: {
12908
12966
  parameters: {
12909
12967
  query?: {
12910
- /** @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. */
12968
+ /** @description Sort order. recent (default) is reverse-chronological. relevant can rate-limit. Ignored when cursor is supplied; the sort comes from the cursor. */
12911
12969
  sort?: "recent" | "relevant";
12912
- /** @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. */
12970
+ /** @description Minimum posts per page (1-100, default 20); the returned count can exceed this. Page until cursor is null. */
12913
12971
  limit?: number;
12914
- /** @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. */
12972
+ /** @description Opaque cursor from a prior response's cursor; omit for the first page, self-describing of its sort. The relevant cursor expires after about an hour. */
12915
12973
  cursor?: string;
12916
12974
  };
12917
12975
  header?: never;
@@ -13092,11 +13150,11 @@ interface operations {
13092
13150
  getV1AccountIdNotifications: {
13093
13151
  parameters: {
13094
13152
  query?: {
13095
- /** @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. */
13153
+ /** @description Which notification stream to read (default all): jobs, mentions, my_posts, my_posts_comments/reactions/reposts. Any other value is a 400. */
13096
13154
  filter?: "all" | "jobs" | "mentions" | "my_posts" | "my_posts_comments" | "my_posts_reactions" | "my_posts_reposts";
13097
- /** @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. */
13155
+ /** @description Minimum notifications per page (1-100, default 20); the server returns whole pages up to this boundary. Page until cursor is null. */
13098
13156
  limit?: number;
13099
- /** @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. */
13157
+ /** @description Opaque cursor from a prior response's cursor; omit for the first page, pass back verbatim. Poll unread_count instead of deep-paging. */
13100
13158
  cursor?: string;
13101
13159
  };
13102
13160
  header?: never;
@@ -13259,7 +13317,7 @@ interface operations {
13259
13317
  path: {
13260
13318
  /** @description The connected LinkedIn account whose notifications to read or act on. */
13261
13319
  account_id: string;
13262
- /** @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. */
13320
+ /** @description The card_urn field of a notifications list item (not object_urn). Percent-encode it into the path. This cannot be undone. */
13263
13321
  card_urn: string;
13264
13322
  };
13265
13323
  cookie?: never;
@@ -13268,7 +13326,7 @@ interface operations {
13268
13326
  responses: {
13269
13327
  /** @description The notification card was deleted. This cannot be undone.
13270
13328
  *
13271
- * **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.)
13329
+ * **Safe to retry.** Deleting a card you already deleted succeeds with 200 again, 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.)
13272
13330
  *
13273
13331
  * **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. */
13274
13332
  200: {
@@ -13383,7 +13441,7 @@ interface operations {
13383
13441
  path: {
13384
13442
  /** @description The connected LinkedIn account whose notifications to read or act on. */
13385
13443
  account_id: string;
13386
- /** @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. */
13444
+ /** @description The card_urn field of a notifications list item. For network-activity cards this removes the card, same as deleting it. This cannot be undone. */
13387
13445
  card_urn: string;
13388
13446
  };
13389
13447
  cookie?: never;
@@ -13394,7 +13452,7 @@ interface operations {
13394
13452
  *
13395
13453
  * **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.
13396
13454
  *
13397
- * **Safe to retry**, and same timing as `delete_notification`: idempotent (a repeat is a 200, not an error), effective within a few seconds. */
13455
+ * **Safe to retry**, and same timing as `delete_notification`: a repeat call returns 200 again, not an error, effective within a few seconds. */
13398
13456
  200: {
13399
13457
  headers: {
13400
13458
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -13736,7 +13794,7 @@ interface operations {
13736
13794
  path: {
13737
13795
  /** @description The account ID (`acc_...`) to use for the request. */
13738
13796
  account_id: string;
13739
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
13797
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
13740
13798
  post_id: string;
13741
13799
  };
13742
13800
  cookie?: never;
@@ -13907,7 +13965,7 @@ interface operations {
13907
13965
  path: {
13908
13966
  /** @description The account ID (`acc_...`) to comment as. */
13909
13967
  account_id: string;
13910
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
13968
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
13911
13969
  post_id: string;
13912
13970
  };
13913
13971
  cookie?: never;
@@ -14113,7 +14171,7 @@ interface operations {
14113
14171
  path: {
14114
14172
  /** @description The account ID (`acc_...`) to reply as. */
14115
14173
  account_id: string;
14116
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
14174
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
14117
14175
  post_id: string;
14118
14176
  /** @description The parent comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies. */
14119
14177
  comment_id: string;
@@ -14321,7 +14379,7 @@ interface operations {
14321
14379
  path: {
14322
14380
  /** @description The account ID (`acc_...`) that authored the comment. */
14323
14381
  account_id: string;
14324
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
14382
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
14325
14383
  post_id: string;
14326
14384
  /** @description The comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies. */
14327
14385
  comment_id: string;
@@ -14432,7 +14490,7 @@ interface operations {
14432
14490
  path: {
14433
14491
  /** @description The account ID (`acc_...`) that authored the comment. */
14434
14492
  account_id: string;
14435
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
14493
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
14436
14494
  post_id: string;
14437
14495
  /** @description The comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies. */
14438
14496
  comment_id: string;
@@ -14625,7 +14683,7 @@ interface operations {
14625
14683
  path: {
14626
14684
  /** @description The account ID (`acc_...`) to use for the request. */
14627
14685
  account_id: string;
14628
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
14686
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
14629
14687
  post_id: string;
14630
14688
  /** @description The parent comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies. */
14631
14689
  comment_id: string;
@@ -14805,7 +14863,7 @@ interface operations {
14805
14863
  path: {
14806
14864
  /** @description The account ID (`acc_...`) to use for the request. */
14807
14865
  account_id: string;
14808
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
14866
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
14809
14867
  post_id: string;
14810
14868
  /** @description The comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies. */
14811
14869
  comment_id: string;
@@ -14946,7 +15004,7 @@ interface operations {
14946
15004
  path: {
14947
15005
  /** @description The account ID (`acc_...`) to react from. */
14948
15006
  account_id: string;
14949
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
15007
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
14950
15008
  post_id: string;
14951
15009
  /** @description The comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies. */
14952
15010
  comment_id: string;
@@ -15094,7 +15152,7 @@ interface operations {
15094
15152
  path: {
15095
15153
  /** @description The account ID (`acc_...`) whose reaction to remove. */
15096
15154
  account_id: string;
15097
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
15155
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
15098
15156
  post_id: string;
15099
15157
  /** @description The comment's `id` (a bare numeric string), as returned by comment_on_post / list_comment_replies. */
15100
15158
  comment_id: string;
@@ -16097,7 +16155,7 @@ interface operations {
16097
16155
  getV1AccountIdJobs: {
16098
16156
  parameters: {
16099
16157
  query: {
16100
- /** @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`. */
16158
+ /** @description Filter by posting lifecycle state (required). Best-effort: results may not match exactly, re-filter on each item's own state. */
16101
16159
  state: "DRAFT" | "OPEN" | "CLOSED" | "REVIEW" | "SUSPENDED";
16102
16160
  /** @description Number of results to return (1-100). */
16103
16161
  limit?: number;
@@ -16514,14 +16572,14 @@ interface operations {
16514
16572
  getV1AccountIdJobsJobId: {
16515
16573
  parameters: {
16516
16574
  query?: {
16517
- /** @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; each name is trimmed before use. Omit for the base fields only. */
16575
+ /** @description Extra sections to include (e.g. hiring_team, salary, benefits), comma-separated for more than one. Omit for base fields only. */
16518
16576
  with_sections?: string[];
16519
16577
  };
16520
16578
  header?: never;
16521
16579
  path: {
16522
16580
  /** @description The connected LinkedIn account to retrieve the job posting on behalf of. */
16523
16581
  account_id: string;
16524
- /** @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). */
16582
+ /** @description The job posting's numeric id, e.g. 4100000000 (from the LinkedIn job URL or a search/jobs result). A full URL is not accepted here. */
16525
16583
  job_id: string;
16526
16584
  };
16527
16585
  cookie?: never;
@@ -16734,7 +16792,7 @@ interface operations {
16734
16792
  path: {
16735
16793
  /** @description The connected LinkedIn account that owns the job posting. */
16736
16794
  account_id: string;
16737
- /** @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). */
16795
+ /** @description The job posting's numeric id, e.g. 4100000000 (from the LinkedIn job URL or a search/jobs result). A full URL is not accepted here. */
16738
16796
  job_id: string;
16739
16797
  };
16740
16798
  cookie?: never;
@@ -16996,7 +17054,7 @@ interface operations {
16996
17054
  path: {
16997
17055
  /** @description The connected LinkedIn account that owns the job posting. */
16998
17056
  account_id: string;
16999
- /** @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). */
17057
+ /** @description The job posting's numeric id, e.g. 4100000000 (from the LinkedIn job URL or a search/jobs result). A full URL is not accepted here. */
17000
17058
  job_id: string;
17001
17059
  };
17002
17060
  cookie?: never;
@@ -17157,7 +17215,7 @@ interface operations {
17157
17215
  path: {
17158
17216
  /** @description The connected LinkedIn account to publish the job posting on behalf of. */
17159
17217
  account_id: string;
17160
- /** @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). */
17218
+ /** @description The job posting's numeric id, e.g. 4100000000 (from the LinkedIn job URL or a search/jobs result). A full URL is not accepted here. */
17161
17219
  job_id: string;
17162
17220
  };
17163
17221
  cookie?: never;
@@ -17354,7 +17412,7 @@ interface operations {
17354
17412
  path: {
17355
17413
  /** @description The connected LinkedIn account that owns the job posting. */
17356
17414
  account_id: string;
17357
- /** @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). */
17415
+ /** @description The job posting's numeric id, e.g. 4100000000 (from the LinkedIn job URL or a search/jobs result). A full URL is not accepted here. */
17358
17416
  job_id: string;
17359
17417
  };
17360
17418
  cookie?: never;
@@ -17495,7 +17553,7 @@ interface operations {
17495
17553
  path: {
17496
17554
  /** @description The connected LinkedIn account that owns the job posting. */
17497
17555
  account_id: string;
17498
- /** @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). */
17556
+ /** @description The job posting's numeric id, e.g. 4100000000 (from the LinkedIn job URL or a search/jobs result). A full URL is not accepted here. */
17499
17557
  job_id: string;
17500
17558
  };
17501
17559
  cookie?: never;
@@ -17713,7 +17771,7 @@ interface operations {
17713
17771
  path: {
17714
17772
  /** @description The connected LinkedIn account that owns the job posting. */
17715
17773
  account_id: string;
17716
- /** @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). */
17774
+ /** @description The job posting's numeric id, e.g. 4100000000 (from the LinkedIn job URL or a search/jobs result). A full URL is not accepted here. */
17717
17775
  job_id: string;
17718
17776
  /** @description The numeric id of the job applicant, obtained from the list-applicants endpoint's items[].id. */
17719
17777
  applicant_id: string;
@@ -17896,7 +17954,7 @@ interface operations {
17896
17954
  path: {
17897
17955
  /** @description The connected LinkedIn account that owns the job posting. */
17898
17956
  account_id: string;
17899
- /** @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). */
17957
+ /** @description The job posting's numeric id, e.g. 4100000000 (from the LinkedIn job URL or a search/jobs result). A full URL is not accepted here. */
17900
17958
  job_id: string;
17901
17959
  /** @description The numeric id of the job applicant, obtained from the list-applicants endpoint's items[].id. */
17902
17960
  applicant_id: string;
@@ -18018,7 +18076,7 @@ interface operations {
18018
18076
  path: {
18019
18077
  /** @description The account ID (`acc_...`) to use for the request. */
18020
18078
  account_id: string;
18021
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
18079
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
18022
18080
  post_id: string;
18023
18081
  };
18024
18082
  cookie?: never;
@@ -18215,7 +18273,7 @@ interface operations {
18215
18273
  path: {
18216
18274
  /** @description The account ID (`acc_...`) that owns the post. */
18217
18275
  account_id: string;
18218
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
18276
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
18219
18277
  post_id: string;
18220
18278
  };
18221
18279
  cookie?: never;
@@ -18341,7 +18399,7 @@ interface operations {
18341
18399
  /** @description File name for the attachment. */
18342
18400
  filename: string;
18343
18401
  }[];
18344
- /** @description The post to quote or repost. Empty text + quoted_post_id = a simple repost; non-empty text + quoted_post_id = a quote-post. The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
18402
+ /** @description The post to quote or repost. Empty text + quoted_post_id = a simple repost; non-empty text + quoted_post_id = a quote-post. The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
18345
18403
  quoted_post_id?: string;
18346
18404
  /**
18347
18405
  * @description Who can read the post (substrate default: anyone if omitted).
@@ -18696,7 +18754,7 @@ interface operations {
18696
18754
  path: {
18697
18755
  /** @description The account ID (`acc_...`) to use for the request. */
18698
18756
  account_id: string;
18699
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
18757
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
18700
18758
  post_id: string;
18701
18759
  };
18702
18760
  cookie?: never;
@@ -18840,7 +18898,7 @@ interface operations {
18840
18898
  path: {
18841
18899
  /** @description The account ID (`acc_...`) to react from. */
18842
18900
  account_id: string;
18843
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
18901
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
18844
18902
  post_id: string;
18845
18903
  };
18846
18904
  cookie?: never;
@@ -18984,7 +19042,7 @@ interface operations {
18984
19042
  path: {
18985
19043
  /** @description The account ID (`acc_...`) whose reaction to remove. */
18986
19044
  account_id: string;
18987
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
19045
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
18988
19046
  post_id: string;
18989
19047
  };
18990
19048
  cookie?: never;
@@ -19305,9 +19363,9 @@ interface operations {
19305
19363
  getV1AccountIdSavedPosts: {
19306
19364
  parameters: {
19307
19365
  query?: {
19308
- /** @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. */
19366
+ /** @description Minimum items per page (1-100, default 20); a page may return slightly more. Walk with cursor until it is null for the complete list. */
19309
19367
  limit?: number;
19310
- /** @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. */
19368
+ /** @description Opaque cursor from a prior response's cursor; omit for the first page. Page until cursor is null. There is no offset parameter. */
19311
19369
  cursor?: string;
19312
19370
  };
19313
19371
  header?: never;
@@ -19481,13 +19539,13 @@ interface operations {
19481
19539
  requestBody: {
19482
19540
  content: {
19483
19541
  "application/json": {
19484
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
19542
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
19485
19543
  post_id: string;
19486
19544
  };
19487
19545
  };
19488
19546
  };
19489
19547
  responses: {
19490
- /** @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. */
19548
+ /** @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 just returns 200 again, not an error. */
19491
19549
  200: {
19492
19550
  headers: {
19493
19551
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -19611,14 +19669,14 @@ interface operations {
19611
19669
  path: {
19612
19670
  /** @description The account ID (`acc_...`) that performs the unsave. */
19613
19671
  account_id: string;
19614
- /** @description The post's `id`, as returned by `get_post` or any list response (`list_user_posts`, `list_profile_activity`, `get_feed`). A bare numeric activity id (`7332661864792854528`), a URN (`urn:li:activity:<id>`, `urn:li:ugcPost:<id>`, `urn:li:share:<id>`), and a full LinkedIn share URL are all accepted and mean the same post. */
19672
+ /** @description The post's id from get_post or any list response. A bare activity id, a URN (activity/ugcPost/share), or a full share URL all work. */
19615
19673
  post_id: string;
19616
19674
  };
19617
19675
  cookie?: never;
19618
19676
  };
19619
19677
  requestBody?: never;
19620
19678
  responses: {
19621
- /** @description The post is no longer saved. Unsaving a not-currently-saved post is idempotent. */
19679
+ /** @description The post is no longer saved. Unsaving a not-currently-saved post just returns 200 again, not an error. */
19622
19680
  200: {
19623
19681
  headers: {
19624
19682
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -19729,7 +19787,7 @@ interface operations {
19729
19787
  getV1AccountIdRecruiterProfilesUserId: {
19730
19788
  parameters: {
19731
19789
  query?: {
19732
- /** @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. */
19790
+ /** @description Recruiter profile sections to fetch, repeatable: linkedin_experience, linkedin_skills, and others (each has a _preview variant). Omit for base fields only. */
19733
19791
  with_sections?: ("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")[];
19734
19792
  };
19735
19793
  header?: never;
@@ -25033,7 +25091,7 @@ interface operations {
25033
25091
  getV1AccountIdSalesNavigatorProfilesIdentifier: {
25034
25092
  parameters: {
25035
25093
  query?: {
25036
- /** @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. */
25094
+ /** @description Sales Navigator sections to fetch, repeatable: linkedin_experience, linkedin_skills, others (each has a _preview variant). Omit for base fields only. */
25037
25095
  with_sections?: ("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")[];
25038
25096
  };
25039
25097
  header?: never;
@@ -26536,7 +26594,7 @@ interface operations {
26536
26594
  getV1AccountIdSalesNavigatorSearchParameters: {
26537
26595
  parameters: {
26538
26596
  query: {
26539
- /** @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. */
26597
+ /** @description The Sales Navigator filter parameter family to resolve. Any value outside the enum is rejected with 400. */
26540
26598
  type: "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";
26541
26599
  /** @description Human-readable term to search within the parameter family. */
26542
26600
  keywords?: string;
@@ -27855,6 +27913,8 @@ interface operations {
27855
27913
  limit?: number;
27856
27914
  /** @description Opaque pagination cursor from a prior page's `cursor` field. Omit for the first page. */
27857
27915
  cursor?: string;
27916
+ /** @description Return only accounts whose external_id equals this value exactly. */
27917
+ external_id?: string;
27858
27918
  };
27859
27919
  header?: never;
27860
27920
  path?: never;
@@ -27894,6 +27954,12 @@ interface operations {
27894
27954
  connected_at?: string | null;
27895
27955
  /** @description The connection scope this account was last connected with (e.g. ["classic","company","sales_navigator","recruiter"]). A connect asks for every product and LinkedIn activates the ones the account actually has, so this is what was ASKED for, narrowed only by an explicit linkedin_premium on that connect. A linkedin_premium narrowing is not remembered between connects, so this shows what the LAST connect asked for and a reconnect that omits the field widens it again. Null for accounts connected before this was recorded; not attachment truth for Company Pages. */
27896
27956
  requested_products?: ("classic" | "company" | "sales_navigator" | "recruiter")[] | null;
27957
+ /** @description Your own id for this account's end user, as set on connect or PATCH. Null when none. Not unique. */
27958
+ external_id?: string | null;
27959
+ /** @description Your own flat string map for this account, as last set by PATCH. Null when none. */
27960
+ metadata?: {
27961
+ [key: string]: string;
27962
+ } | null;
27897
27963
  /** @description ISO-8601 UTC creation timestamp of the underlying LinkedIn account, distinct from connected_at. Null until the first background enrichment lands. */
27898
27964
  substrate_created_at?: string | null;
27899
27965
  }[];
@@ -28002,6 +28068,12 @@ interface operations {
28002
28068
  seat_id?: string | null;
28003
28069
  /** @description The connection scope this account was last connected with (e.g. ["classic","company","sales_navigator","recruiter"]). A connect asks for every product and LinkedIn activates the ones the account actually has, so this is what was ASKED for, narrowed only by an explicit linkedin_premium on that connect. A linkedin_premium narrowing is not remembered between connects, so this shows what the LAST connect asked for and a reconnect that omits the field widens it again. Null for accounts connected before this was recorded; not attachment truth for Company Pages. */
28004
28070
  requested_products?: ("classic" | "company" | "sales_navigator" | "recruiter")[] | null;
28071
+ /** @description Your own id for this account's end user, as set on connect or PATCH. Null when none. Not unique. */
28072
+ external_id?: string | null;
28073
+ /** @description Your own flat string map for this account, as last set by PATCH. Null when none. */
28074
+ metadata?: {
28075
+ [key: string]: string;
28076
+ } | null;
28005
28077
  /** @description ISO-8601 UTC creation timestamp of the underlying LinkedIn account, distinct from connected_at. Null until the first background enrichment lands. */
28006
28078
  substrate_created_at?: string | null;
28007
28079
  /** @description Account-safety rows for this account: one entry per counted action for the current window of its grain, plus the derived total and the invitation backlog. Each row reports where the account stands, what it is allowed, which band that puts it in, what happens at the ceiling, whether the ceiling was raised above the Curviate default, and any active pause the platform caused. Whether a breach is refused or merely reported is `posture`, and the default is to report: nothing here refuses until you configure it to. Pacing is still the caller's responsibility, and nothing on this array paces for you. The per-minute REQUEST ceiling is a different thing and is deliberately not in this array: it protects Curviate's own servers rather than your LinkedIn account, it counts requests where these count platform operations, it is always enforced with HTTP 429 whatever your posture, and its envelope is returned on that refusal. Read this array to see where the account stands; read the safety events surface to see what has already been refused or flagged. */
@@ -28158,7 +28230,7 @@ interface operations {
28158
28230
  };
28159
28231
  requestBody?: never;
28160
28232
  responses: {
28161
- /** @description The account was disconnected and hard-deleted; its seat is released. This endpoint is idempotent: calling it again for the same account also returns 200, with `already_disconnected` set so you can tell the two apart. */
28233
+ /** @description The account was disconnected and hard-deleted; its seat is released. Calling it again for the same account also returns 200, with `already_disconnected` set so you can tell a repeat call from the first. */
28162
28234
  200: {
28163
28235
  headers: {
28164
28236
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -28265,10 +28337,12 @@ interface operations {
28265
28337
  requestBody: {
28266
28338
  content: {
28267
28339
  "application/json": {
28268
- /** @description Flat string->string map that replaces this account's custom-data store wholesale (unprovided keys are removed). */
28340
+ /** @description Your own flat string map for this account (up to 16 keys, key 40 chars, value 500). Replaces the stored map whole; null clears it. */
28269
28341
  metadata?: {
28270
28342
  [key: string]: string;
28271
- };
28343
+ } | null;
28344
+ /** @description Your own id for this account's end user (1-255 chars), or null to clear it. Omit to leave it unchanged. */
28345
+ external_id?: string | null;
28272
28346
  /** @description Custom-proxy egress config, or null to clear it (revert to automatic proxy protection). Omit to leave it unchanged. */
28273
28347
  proxy?: {
28274
28348
  /**
@@ -28289,7 +28363,7 @@ interface operations {
28289
28363
  };
28290
28364
  };
28291
28365
  responses: {
28292
- /** @description The account metadata / proxy configuration was updated. */
28366
+ /** @description The account was updated. metadata and external_id are stored by Curviate and read back on GET; a PATCH carrying only those makes no LinkedIn call. */
28293
28367
  200: {
28294
28368
  headers: {
28295
28369
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -28308,7 +28382,7 @@ interface operations {
28308
28382
  };
28309
28383
  };
28310
28384
  };
28311
- /** @description Invalid request, a malformed proxy object or an unsupported field (country/ip are no longer accepted). */
28385
+ /** @description Invalid request: a malformed proxy object, metadata over its limits (16 keys, key 40 chars, value 500), external_id outside 1-255 chars, or an unsupported field (country/ip). */
28312
28386
  400: {
28313
28387
  headers: {
28314
28388
  [name: string]: unknown;
@@ -28517,6 +28591,12 @@ interface operations {
28517
28591
  * @enum {string}
28518
28592
  */
28519
28593
  linkedin_premium?: "sales_navigator" | "recruiter";
28594
+ /** @description Optional IANA zone name for this account's LinkedIn session, e.g. Europe/Berlin. Sent in canonical form; a UTC offset such as +02:00 is a 400. */
28595
+ timezone?: string;
28596
+ /** @description Your own id for the end user who owns this account, 1-255 chars, not unique. Treat it as opaque; avoid emails. */
28597
+ external_id?: string;
28598
+ /** @description Optional allow-list of premium products to ask for: sales_navigator, recruiter. Omit to ask for both; [] asks for none. Classic LinkedIn and company pages are always included. */
28599
+ products?: ("sales_navigator" | "recruiter")[];
28520
28600
  /** @description Managed proxy location hint as an ISO 3166-1 alpha-2 country code (e.g. US, DE). */
28521
28601
  country?: string;
28522
28602
  /** @description IPv4 address used to infer the managed proxy location. */
@@ -28569,6 +28649,8 @@ interface operations {
28569
28649
  account_id?: string;
28570
28650
  /** @enum {string} */
28571
28651
  status?: "active";
28652
+ /** @description Your own id for this account's end user, as set on connect or PATCH. Null when none. Not unique. */
28653
+ external_id?: string | null;
28572
28654
  safety_warning?: components["schemas"]["SafetyWarning"];
28573
28655
  };
28574
28656
  };
@@ -28601,6 +28683,8 @@ interface operations {
28601
28683
  * @description Deprecated, use seat_id (same value). Removed at the GA /v1 cutover.
28602
28684
  */
28603
28685
  attached_seat_id?: string | null;
28686
+ /** @description Your own id for this account's end user, as set on connect or PATCH. Null when none. Not unique. */
28687
+ external_id?: string | null;
28604
28688
  /** @description Present and true only when this connect reactivated an account you had previously disconnected, instead of opening a brand-new one. Absent on a normal connect. The account keeps its original id, and its status reflects its real observed state, which may need a reconnect. */
28605
28689
  recovered?: boolean;
28606
28690
  safety_warning?: components["schemas"]["SafetyWarning"];
@@ -28629,7 +28713,16 @@ interface operations {
28629
28713
  * @description The verification challenge LinkedIn issued.
28630
28714
  * @enum {string}
28631
28715
  */
28632
- challenge_type?: "otp" | "two_factor_sms" | "two_factor_app" | "two_factor_whatsapp" | "mobile_app_approval" | "otp_or_mobile_app_approval" | "contract_selection";
28716
+ challenge_type?: "otp" | "two_factor_sms" | "two_factor_app" | "two_factor_whatsapp" | "mobile_app_approval" | "otp_or_mobile_app_approval" | "contract_selection" | "challenge_selection";
28717
+ /** @description Verification methods to choose from (challenge_selection only). Send one id as challenge to POST /v1/auth/checkpoint/request. */
28718
+ challenges?: {
28719
+ /** @enum {string} */
28720
+ id?: "email" | "sms" | "whatsapp";
28721
+ /** @description Display name, e.g. Text message. */
28722
+ label?: string;
28723
+ /** @description The masked destination, when known. */
28724
+ description?: string | null;
28725
+ }[];
28633
28726
  /** @description Contract picker options (contract_selection only). Solve with the chosen id as the code. */
28634
28727
  contracts?: {
28635
28728
  id?: string;
@@ -28637,6 +28730,8 @@ interface operations {
28637
28730
  }[];
28638
28731
  /** @description ISO-8601 expiry of the challenge. */
28639
28732
  expires_at?: string;
28733
+ /** @description Your own id for this account's end user, as set on connect or PATCH. Null when none. Not unique. */
28734
+ external_id?: string | null;
28640
28735
  safety_warning?: components["schemas"]["SafetyWarning"];
28641
28736
  };
28642
28737
  };
@@ -28796,6 +28891,8 @@ interface operations {
28796
28891
  * @description Deprecated, use seat_id (same value). Removed at the GA /v1 cutover.
28797
28892
  */
28798
28893
  attached_seat_id?: string | null;
28894
+ /** @description Your own id for this account's end user, as set on connect or PATCH. Null when none. Not unique. */
28895
+ external_id?: string | null;
28799
28896
  /** @description Present and true only when this connect reactivated an account you had previously disconnected, instead of opening a brand-new one. Absent on a normal connect. The account keeps its original id, and its status reflects its real observed state, which may need a reconnect. */
28800
28897
  recovered?: boolean;
28801
28898
  safety_warning?: components["schemas"]["SafetyWarning"];
@@ -28824,7 +28921,16 @@ interface operations {
28824
28921
  * @description The verification challenge LinkedIn issued.
28825
28922
  * @enum {string}
28826
28923
  */
28827
- challenge_type?: "otp" | "two_factor_sms" | "two_factor_app" | "two_factor_whatsapp" | "mobile_app_approval" | "otp_or_mobile_app_approval" | "contract_selection";
28924
+ challenge_type?: "otp" | "two_factor_sms" | "two_factor_app" | "two_factor_whatsapp" | "mobile_app_approval" | "otp_or_mobile_app_approval" | "contract_selection" | "challenge_selection";
28925
+ /** @description Verification methods to choose from (challenge_selection only). Send one id as challenge to POST /v1/auth/checkpoint/request. */
28926
+ challenges?: {
28927
+ /** @enum {string} */
28928
+ id?: "email" | "sms" | "whatsapp";
28929
+ /** @description Display name, e.g. Text message. */
28930
+ label?: string;
28931
+ /** @description The masked destination, when known. */
28932
+ description?: string | null;
28933
+ }[];
28828
28934
  /** @description Contract picker options (contract_selection only). Solve with the chosen id as the code. */
28829
28935
  contracts?: {
28830
28936
  id?: string;
@@ -28943,6 +29049,11 @@ interface operations {
28943
29049
  "application/json": {
28944
29050
  /** @description The account whose pending checkpoint notification should be re-sent (returned with the 202 checkpoint_required response, or from link/poll). */
28945
29051
  account_id: string;
29052
+ /**
29053
+ * @description Optional. An id from a challenge_selection checkpoint's challenges list: switches to that method and returns the next checkpoint. Omit to re-send the current code.
29054
+ * @enum {string}
29055
+ */
29056
+ challenge?: "email" | "sms" | "whatsapp";
28946
29057
  };
28947
29058
  };
28948
29059
  };
@@ -28967,6 +29078,58 @@ interface operations {
28967
29078
  };
28968
29079
  };
28969
29080
  };
29081
+ /** @description challenge was sent: the method was switched and this is the next verification challenge. Solve it with POST /v1/auth/checkpoint/solve. */
29082
+ 202: {
29083
+ headers: {
29084
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
29085
+ RateLimit: components["headers"]["RateLimit"];
29086
+ [name: string]: unknown;
29087
+ };
29088
+ content: {
29089
+ "application/json": {
29090
+ /**
29091
+ * @description Response type discriminator.
29092
+ * @enum {string}
29093
+ */
29094
+ object?: "checkpoint";
29095
+ /** @enum {string} */
29096
+ status?: "checkpoint_required";
29097
+ /** @description The (provisional) account_id to pass to the checkpoint sub-resource (POST /v1/auth/checkpoint/solve). */
29098
+ account_id?: string;
29099
+ /**
29100
+ * @description The verification challenge LinkedIn issued.
29101
+ * @enum {string}
29102
+ */
29103
+ challenge_type?: "otp" | "two_factor_sms" | "two_factor_app" | "two_factor_whatsapp" | "mobile_app_approval" | "otp_or_mobile_app_approval" | "contract_selection" | "challenge_selection";
29104
+ /** @description Verification methods to choose from (challenge_selection only). Send one id as challenge to POST /v1/auth/checkpoint/request. */
29105
+ challenges?: {
29106
+ /** @enum {string} */
29107
+ id?: "email" | "sms" | "whatsapp";
29108
+ /** @description Display name, e.g. Text message. */
29109
+ label?: string;
29110
+ /** @description The masked destination, when known. */
29111
+ description?: string | null;
29112
+ }[];
29113
+ /** @description Contract picker options (contract_selection only). Solve with the chosen id as the code. */
29114
+ contracts?: {
29115
+ id?: string;
29116
+ name?: string;
29117
+ }[];
29118
+ /** @description ISO-8601 expiry of the challenge. */
29119
+ expires_at?: string;
29120
+ safety_warning?: components["schemas"]["SafetyWarning"];
29121
+ };
29122
+ };
29123
+ };
29124
+ /** @description INVALID_REQUEST. challenge is not a known method id, or is not one of the methods the pending checkpoint offered; send an id from its challenges list. */
29125
+ 400: {
29126
+ headers: {
29127
+ [name: string]: unknown;
29128
+ };
29129
+ content: {
29130
+ "application/json": components["schemas"]["Error"];
29131
+ };
29132
+ };
28970
29133
  /** @description ACCOUNT_RESTRICTED. LinkedIn has restricted this account. Sign in to LinkedIn to see what it needs, resolve it there, then reconnect. */
28971
29134
  403: {
28972
29135
  headers: {
@@ -29109,18 +29272,29 @@ interface operations {
29109
29272
  * @description Deprecated, use seat_id (same value). Removed at the GA /v1 cutover. Present on status:"active".
29110
29273
  */
29111
29274
  attached_seat_id?: string | null;
29275
+ /** @description Your own id for this account's end user, as passed on connect. Present on status:"active". */
29276
+ external_id?: string | null;
29112
29277
  /** @description ISO-8601 expiry. Present on status:"pending" and status:"checkpoint_required". */
29113
29278
  expires_at?: string;
29114
29279
  /**
29115
29280
  * @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.
29116
29281
  * @enum {string}
29117
29282
  */
29118
- challenge_type?: "mobile_app_approval" | "otp" | "two_factor_sms" | "two_factor_app" | "two_factor_whatsapp" | "contract_selection";
29283
+ challenge_type?: "mobile_app_approval" | "otp" | "two_factor_sms" | "two_factor_app" | "two_factor_whatsapp" | "contract_selection" | "challenge_selection";
29119
29284
  /** @description Contract picker options, present only on a chained status:"checkpoint_required" with challenge_type:"contract_selection". */
29120
29285
  contracts?: {
29121
29286
  id?: string;
29122
29287
  name?: string;
29123
29288
  }[];
29289
+ /** @description Verification methods to choose from (challenge_selection only). Send one id as challenge to POST /v1/auth/checkpoint/request. */
29290
+ challenges?: {
29291
+ /** @enum {string} */
29292
+ id?: "email" | "sms" | "whatsapp";
29293
+ /** @description Display name, e.g. Text message. */
29294
+ label?: string;
29295
+ /** @description The masked destination, when known. */
29296
+ description?: string | null;
29297
+ }[];
29124
29298
  /** @description Human-readable, actionable next step when the approval timed out. Present on status:"expired". */
29125
29299
  recovery_hint?: string;
29126
29300
  safety_warning?: components["schemas"]["SafetyWarning"];
@@ -29320,7 +29494,7 @@ interface operations {
29320
29494
  query?: {
29321
29495
  /** @description Pagination cursor from a previous response; decodable, pass it back verbatim */
29322
29496
  cursor?: string;
29323
- /** @description Return only events in this queue state. unread: nobody holds it, which includes an event whose lease expired. claimed: leased to a consumer right now. done: already handled, and it will never be handed out again. Omit to return every state. There is no failed state. */
29497
+ /** @description Return only events in this state: unread (includes an expired lease), claimed, or done. Omit for every state. There is no failed state. */
29324
29498
  state?: "unread" | "claimed" | "done";
29325
29499
  /** @description How many events to return per page, 1 to 100. Defaults to 50. */
29326
29500
  limit?: number;
@@ -29461,7 +29635,9 @@ interface operations {
29461
29635
  content: {
29462
29636
  "application/json": {
29463
29637
  consumer: string;
29638
+ /** @description Max events to lease (1-100, default 10). */
29464
29639
  limit?: number;
29640
+ /** @description Seconds to hold the lease (10-3600, default 300). */
29465
29641
  lease_seconds?: number;
29466
29642
  };
29467
29643
  };
@@ -29823,7 +29999,7 @@ interface operations {
29823
29999
  /** @description The URL that receives delivery POST requests. */
29824
30000
  request_url?: string;
29825
30001
  name?: string | null;
29826
- account_ids?: string[];
30002
+ account_ids?: string[] | null;
29827
30003
  enabled?: boolean;
29828
30004
  /** @description Custom headers added to each delivery POST, with a fingerprint in place of the value. */
29829
30005
  headers?: {
@@ -29836,7 +30012,7 @@ interface operations {
29836
30012
  /** @description First 8 characters of the secret (never the full secret). */
29837
30013
  secret_prefix?: string;
29838
30014
  /**
29839
- * @description Delivery health state. 'degraded' when recent deliveries have repeatedly failed.
30015
+ * @description Delivery health state. 'degraded' when the last delivery exhausted all 5 attempts, or when it could not be signed at all because the webhook's signing secret is unusable (then no delivery can succeed; recreate the webhook).
29840
30016
  * @enum {string}
29841
30017
  */
29842
30018
  health?: "ok" | "degraded";
@@ -29964,8 +30140,8 @@ interface operations {
29964
30140
  request_url: string;
29965
30141
  /** @description Human-readable name for this webhook (1-100 chars) */
29966
30142
  name?: string;
29967
- /** @description Per-account targeting. Required and non-empty; each id must be an acc_-prefixed id owned by the tenant. */
29968
- account_ids: string[];
30143
+ /** @description Per-account targeting. Omit to receive events for every current and future account; each id must be an acc_-prefixed id you own. */
30144
+ account_ids?: string[];
29969
30145
  /**
29970
30146
  * @description A disabled webhook is created but delivers nothing
29971
30147
  * @default true
@@ -30010,8 +30186,8 @@ interface operations {
30010
30186
  request_url?: string;
30011
30187
  /** @description Human-readable label. */
30012
30188
  name?: string | null;
30013
- /** @description Accounts targeted by this webhook. Required and non-empty, each id must be owned by the tenant. */
30014
- account_ids?: string[];
30189
+ /** @description Accounts targeted by this webhook (acc_ ids you own), or null when an account_status webhook covers every current and future account. */
30190
+ account_ids?: string[] | null;
30015
30191
  /** @description A disabled webhook is created but delivers nothing. */
30016
30192
  enabled?: boolean;
30017
30193
  /** @description Custom headers added to each delivery POST. Values are encrypted at rest and no read returns one, so a read shows the name and a fingerprint of the value. */
@@ -30288,8 +30464,8 @@ interface operations {
30288
30464
  request_url?: string;
30289
30465
  /** @description Human-readable label. */
30290
30466
  name?: string | null;
30291
- /** @description Accounts targeted by this webhook. Non-empty, each id is owned by the tenant. */
30292
- account_ids?: string[];
30467
+ /** @description Accounts targeted by this webhook (acc_ ids you own), or null when an account_status webhook covers every current and future account. */
30468
+ account_ids?: string[] | null;
30293
30469
  /** @description A disabled webhook is kept but delivers nothing. Disabling takes effect immediately, including for retries that were already queued; those attempts are abandoned, not deferred, so re-enabling delivers new events rather than replaying the ones that were dropped. */
30294
30470
  enabled?: boolean;
30295
30471
  /** @description Custom headers added to each delivery POST. Values are encrypted at rest and no read returns one, so a read shows the name and a fingerprint of the value. */
@@ -30364,7 +30540,7 @@ interface operations {
30364
30540
  };
30365
30541
  requestBody?: never;
30366
30542
  responses: {
30367
- /** @description Webhook removed. Delivery stops immediately, including retries that were already queued. Idempotent, deleting an already-deleted webhook returns the same shape. */
30543
+ /** @description Webhook removed. Delivery stops immediately, including retries that were already queued. Deleting an already-deleted webhook returns the same shape again, not an error. */
30368
30544
  200: {
30369
30545
  headers: {
30370
30546
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -30453,8 +30629,8 @@ interface operations {
30453
30629
  }[];
30454
30630
  /** @description Replace the field-remapping keys for the delivery payload (whole-array). */
30455
30631
  data?: string[];
30456
- /** @description Replace the targeted accounts (whole-array). Must be non-empty; each id must be an acc_-prefixed id owned by the tenant. */
30457
- account_ids?: string[];
30632
+ /** @description Replace the targeted accounts (whole-array, each an acc_ id you own), or null to cover every current and future account (account_status webhooks only). */
30633
+ account_ids?: string[] | null;
30458
30634
  };
30459
30635
  };
30460
30636
  };
@@ -30484,8 +30660,8 @@ interface operations {
30484
30660
  request_url?: string;
30485
30661
  /** @description Human-readable label. */
30486
30662
  name?: string | null;
30487
- /** @description Accounts targeted by this webhook. Non-empty, each id is owned by the tenant. */
30488
- account_ids?: string[];
30663
+ /** @description Accounts targeted by this webhook (acc_ ids you own), or null when an account_status webhook covers every current and future account. */
30664
+ account_ids?: string[] | null;
30489
30665
  /** @description A disabled webhook is kept but delivers nothing. Disabling takes effect immediately, including for retries that were already queued; those attempts are abandoned, not deferred, so re-enabling delivers new events rather than replaying the ones that were dropped. */
30490
30666
  enabled?: boolean;
30491
30667
  /** @description Custom headers added to each delivery POST. Values are encrypted at rest and no read returns one, so a read shows the name and a fingerprint of the value. */
@@ -31508,10 +31684,302 @@ interface operations {
31508
31684
  };
31509
31685
  };
31510
31686
  };
31687
+ postV1BillingSeatsAdd: {
31688
+ parameters: {
31689
+ query?: never;
31690
+ header?: never;
31691
+ path?: never;
31692
+ cookie?: never;
31693
+ };
31694
+ requestBody: {
31695
+ content: {
31696
+ "application/json": {
31697
+ qty: number;
31698
+ };
31699
+ };
31700
+ };
31701
+ responses: {
31702
+ /** @description Seats added. */
31703
+ 200: {
31704
+ headers: {
31705
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
31706
+ RateLimit: components["headers"]["RateLimit"];
31707
+ [name: string]: unknown;
31708
+ };
31709
+ content: {
31710
+ "application/json": {
31711
+ /** @description Amount collected right now, or null when nothing was collected today. */
31712
+ charged_today_eur: number | null;
31713
+ /**
31714
+ * Format: date-time
31715
+ * @description Reserved for a future queued-proration date; always null today.
31716
+ */
31717
+ next_invoice_at: string | null;
31718
+ /** @description The newly created seat ids. */
31719
+ seat_ids: string[];
31720
+ safety_warning?: components["schemas"]["SafetyWarning"];
31721
+ };
31722
+ };
31723
+ };
31724
+ /** @description qty must be a whole number from 1 to 50. */
31725
+ 400: {
31726
+ headers: {
31727
+ [name: string]: unknown;
31728
+ };
31729
+ content: {
31730
+ "application/json": components["schemas"]["Error"];
31731
+ };
31732
+ };
31733
+ /** @description Missing or invalid API key. */
31734
+ 401: {
31735
+ headers: {
31736
+ [name: string]: unknown;
31737
+ };
31738
+ content: {
31739
+ "application/json": components["schemas"]["Error"];
31740
+ };
31741
+ };
31742
+ /** @description No active subscription, a past-due subscription, an account under dispute review, or the card was declined (no seats added). */
31743
+ 402: {
31744
+ headers: {
31745
+ [name: string]: unknown;
31746
+ };
31747
+ content: {
31748
+ "application/json": components["schemas"]["Error"];
31749
+ };
31750
+ };
31751
+ /** @description The workspace is on a free trial and cannot add seats. Buy a seat to convert to a paid subscription first. */
31752
+ 409: {
31753
+ headers: {
31754
+ [name: string]: unknown;
31755
+ };
31756
+ content: {
31757
+ "application/json": components["schemas"]["Error"];
31758
+ };
31759
+ };
31760
+ /** @description Payload too large, the request body exceeds the size limit. */
31761
+ 413: {
31762
+ headers: {
31763
+ [name: string]: unknown;
31764
+ };
31765
+ content: {
31766
+ "application/json": components["schemas"]["Error"];
31767
+ };
31768
+ };
31769
+ /** @description Rate limited, slow down and retry after the hinted delay. */
31770
+ 429: {
31771
+ headers: {
31772
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
31773
+ RateLimit: components["headers"]["RateLimit"];
31774
+ "Retry-After": components["headers"]["Retry-After"];
31775
+ [name: string]: unknown;
31776
+ };
31777
+ content: {
31778
+ "application/json": components["schemas"]["Error"];
31779
+ };
31780
+ };
31781
+ /** @description The purchase failed after today's charge was taken; the charge was refunded in full and the seat count was confirmed unchanged, so no seats were added. Safe to retry. */
31782
+ 502: {
31783
+ headers: {
31784
+ [name: string]: unknown;
31785
+ };
31786
+ content: {
31787
+ "application/json": components["schemas"]["Error"];
31788
+ };
31789
+ };
31790
+ /** @description The purchase could not be confirmed while another change was in progress (check the seat count before retrying), or the seat price is misconfigured on our side (nothing charged; contact support, retrying fails the same way). */
31791
+ 503: {
31792
+ headers: {
31793
+ [name: string]: unknown;
31794
+ };
31795
+ content: {
31796
+ "application/json": components["schemas"]["Error"];
31797
+ };
31798
+ };
31799
+ };
31800
+ };
31801
+ postV1BillingSeatsSeatIdCancel: {
31802
+ parameters: {
31803
+ query?: never;
31804
+ header?: never;
31805
+ path: {
31806
+ /** @description The seat ID (`seat_...`) to cancel. */
31807
+ seat_id: string;
31808
+ };
31809
+ cookie?: never;
31810
+ };
31811
+ requestBody?: never;
31812
+ responses: {
31813
+ /** @description Cancellation scheduled (or already was). */
31814
+ 200: {
31815
+ headers: {
31816
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
31817
+ RateLimit: components["headers"]["RateLimit"];
31818
+ [name: string]: unknown;
31819
+ };
31820
+ content: {
31821
+ "application/json": {
31822
+ /**
31823
+ * Format: date-time
31824
+ * @description When the seat's access ends.
31825
+ */
31826
+ effective_at: string;
31827
+ safety_warning?: components["schemas"]["SafetyWarning"];
31828
+ };
31829
+ };
31830
+ };
31831
+ /** @description seat_id not found for this workspace, or its cancellation already took effect. */
31832
+ 400: {
31833
+ headers: {
31834
+ [name: string]: unknown;
31835
+ };
31836
+ content: {
31837
+ "application/json": components["schemas"]["Error"];
31838
+ };
31839
+ };
31840
+ /** @description Missing or invalid API key. */
31841
+ 401: {
31842
+ headers: {
31843
+ [name: string]: unknown;
31844
+ };
31845
+ content: {
31846
+ "application/json": components["schemas"]["Error"];
31847
+ };
31848
+ };
31849
+ /** @description No active subscription, a past-due subscription, or an account under dispute review. */
31850
+ 402: {
31851
+ headers: {
31852
+ [name: string]: unknown;
31853
+ };
31854
+ content: {
31855
+ "application/json": components["schemas"]["Error"];
31856
+ };
31857
+ };
31858
+ /** @description The workspace is on a free trial and cannot change seats. Buy a seat to convert to a paid subscription first. */
31859
+ 409: {
31860
+ headers: {
31861
+ [name: string]: unknown;
31862
+ };
31863
+ content: {
31864
+ "application/json": components["schemas"]["Error"];
31865
+ };
31866
+ };
31867
+ /** @description Rate limited, slow down and retry after the hinted delay. */
31868
+ 429: {
31869
+ headers: {
31870
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
31871
+ RateLimit: components["headers"]["RateLimit"];
31872
+ "Retry-After": components["headers"]["Retry-After"];
31873
+ [name: string]: unknown;
31874
+ };
31875
+ content: {
31876
+ "application/json": components["schemas"]["Error"];
31877
+ };
31878
+ };
31879
+ /** @description Another change to this subscription is in progress. Retry shortly. */
31880
+ 503: {
31881
+ headers: {
31882
+ [name: string]: unknown;
31883
+ };
31884
+ content: {
31885
+ "application/json": components["schemas"]["Error"];
31886
+ };
31887
+ };
31888
+ };
31889
+ };
31890
+ postV1BillingSeatsSeatIdCancelRevert: {
31891
+ parameters: {
31892
+ query?: never;
31893
+ header?: never;
31894
+ path: {
31895
+ /** @description The seat ID (`seat_...`) whose scheduled cancellation to revert. */
31896
+ seat_id: string;
31897
+ };
31898
+ cookie?: never;
31899
+ };
31900
+ requestBody?: never;
31901
+ responses: {
31902
+ /** @description Cancellation reverted. */
31903
+ 200: {
31904
+ headers: {
31905
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
31906
+ RateLimit: components["headers"]["RateLimit"];
31907
+ [name: string]: unknown;
31908
+ };
31909
+ content: {
31910
+ "application/json": {
31911
+ /**
31912
+ * @description Always true on success.
31913
+ * @enum {boolean}
31914
+ */
31915
+ reverted: true;
31916
+ safety_warning?: components["schemas"]["SafetyWarning"];
31917
+ };
31918
+ };
31919
+ };
31920
+ /** @description seat_id not found, no cancellation is scheduled, it already took effect, or the whole subscription (not this seat) was scheduled to cancel. */
31921
+ 400: {
31922
+ headers: {
31923
+ [name: string]: unknown;
31924
+ };
31925
+ content: {
31926
+ "application/json": components["schemas"]["Error"];
31927
+ };
31928
+ };
31929
+ /** @description Missing or invalid API key. */
31930
+ 401: {
31931
+ headers: {
31932
+ [name: string]: unknown;
31933
+ };
31934
+ content: {
31935
+ "application/json": components["schemas"]["Error"];
31936
+ };
31937
+ };
31938
+ /** @description No active subscription, a past-due subscription, or an account under dispute review. */
31939
+ 402: {
31940
+ headers: {
31941
+ [name: string]: unknown;
31942
+ };
31943
+ content: {
31944
+ "application/json": components["schemas"]["Error"];
31945
+ };
31946
+ };
31947
+ /** @description The workspace is on a free trial and cannot change seats. Buy a seat to convert to a paid subscription first. */
31948
+ 409: {
31949
+ headers: {
31950
+ [name: string]: unknown;
31951
+ };
31952
+ content: {
31953
+ "application/json": components["schemas"]["Error"];
31954
+ };
31955
+ };
31956
+ /** @description Rate limited, slow down and retry after the hinted delay. */
31957
+ 429: {
31958
+ headers: {
31959
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
31960
+ RateLimit: components["headers"]["RateLimit"];
31961
+ "Retry-After": components["headers"]["Retry-After"];
31962
+ [name: string]: unknown;
31963
+ };
31964
+ content: {
31965
+ "application/json": components["schemas"]["Error"];
31966
+ };
31967
+ };
31968
+ /** @description Another change to this subscription is in progress (retry shortly), or the seat price is misconfigured on our side (nothing charged; contact support, retrying fails the same way). */
31969
+ 503: {
31970
+ headers: {
31971
+ [name: string]: unknown;
31972
+ };
31973
+ content: {
31974
+ "application/json": components["schemas"]["Error"];
31975
+ };
31976
+ };
31977
+ };
31978
+ };
31511
31979
  }
31512
31980
 
31513
31981
  /**
31514
- * Accounts resource: connected-account management (5 methods, root-scoped).
31982
+ * Accounts resource: connected-account and seat management (8 methods, root-scoped).
31515
31983
  *
31516
31984
  * Pattern followed by all resource namespaces:
31517
31985
  * - take a {@link RequestContext} in the constructor,
@@ -31543,6 +32011,14 @@ type AccountUpdateBody = paths["/v1/accounts/{account_id}"]["patch"]["requestBod
31543
32011
  type AccountUpdateResult = paths["/v1/accounts/{account_id}"]["patch"]["responses"]["200"]["content"]["application/json"];
31544
32012
  /** `DELETE /v1/accounts/{account_id}` 200 body. */
31545
32013
  type AccountDisconnectResult = paths["/v1/accounts/{account_id}"]["delete"]["responses"]["200"]["content"]["application/json"];
32014
+ /** `POST /v1/billing/seats/add` request body. */
32015
+ type SeatAddBody = paths["/v1/billing/seats/add"]["post"]["requestBody"]["content"]["application/json"];
32016
+ /** `POST /v1/billing/seats/add` 200 body: the new `seat_ids` and what was charged today. */
32017
+ type SeatAddResult = paths["/v1/billing/seats/add"]["post"]["responses"]["200"]["content"]["application/json"];
32018
+ /** `POST /v1/billing/seats/{seat_id}/cancel` 200 body. */
32019
+ type SeatCancelResult = paths["/v1/billing/seats/{seat_id}/cancel"]["post"]["responses"]["200"]["content"]["application/json"];
32020
+ /** `POST /v1/billing/seats/{seat_id}/cancel/revert` 200 body. */
32021
+ type SeatCancelRevertResult = paths["/v1/billing/seats/{seat_id}/cancel/revert"]["post"]["responses"]["200"]["content"]["application/json"];
31546
32022
  declare class AccountsResource {
31547
32023
  private readonly ctx;
31548
32024
  constructor(ctx: RequestContext);
@@ -31554,12 +32030,19 @@ declare class AccountsResource {
31554
32030
  * `signatures`, `groups`) populated by an async background enrichment,
31555
32031
  * `null`/`[]` until the account's first enrichment pass completes.
31556
32032
  *
31557
- * @param params - optional `limit` (1-250) and `cursor` (from a prior page).
32033
+ * Each item carries `external_id` (your own id for the account's end user,
32034
+ * set on `auth.intent` or `update`) and `metadata`, both `null` when unset.
32035
+ *
32036
+ * @param params - optional `limit` (1-250), `cursor` (from a prior page), and
32037
+ * `external_id` (exact match: only that end user's accounts).
31558
32038
  * @returns a page of accounts and the next-page `cursor` (null when exhausted).
31559
32039
  *
31560
32040
  * @example
31561
32041
  * const page = await curviate.accounts.list({ limit: 50 });
31562
32042
  * for (const acc of page.items ?? []) console.log(acc.account_id);
32043
+ *
32044
+ * @example
32045
+ * const { items } = await curviate.accounts.list({ external_id: "usr_42" });
31563
32046
  */
31564
32047
  list(params?: AccountListParams): Promise<AccountListPage>;
31565
32048
  /**
@@ -31621,17 +32104,69 @@ declare class AccountsResource {
31621
32104
  /**
31622
32105
  * Update an account's configuration.
31623
32106
  *
31624
- * `metadata` is a flat string->string map that **replaces** the account's
31625
- * custom-data store wholesale (keys not provided are removed). `proxy` sets a
31626
- * custom egress proxy, or clears it (reverting to automatic proxy protection)
31627
- * when passed as `null`. The `proxy.password`, if given, is stored securely
31628
- * and never returned.
32107
+ * `external_id` is your own id for the account's end user (1-255 chars, not
32108
+ * unique, `null` clears it); treat it as an opaque id, not an email.
32109
+ * `metadata` is a flat string->string map (at most 16 keys, key 40 chars,
32110
+ * value 500) that **replaces** the stored map wholesale; `null` clears it.
32111
+ * Both are stored by Curviate, read back on `get`/`list`, and a PATCH
32112
+ * carrying only them makes no LinkedIn call. `proxy` sets a custom egress
32113
+ * proxy, or clears it (reverting to automatic proxy protection) when passed
32114
+ * as `null`. The `proxy.password`, if given, is stored securely and never
32115
+ * returned.
32116
+ *
32117
+ * @example
32118
+ * await curviate.accounts.update("acc_123", { external_id: "usr_42", metadata: { plan: "pro" } });
31629
32119
  */
31630
32120
  update(accountId: string, body: AccountUpdateBody): Promise<AccountUpdateResult>;
31631
32121
  /**
31632
32122
  * Hard-disconnect a LinkedIn account; releases the attached seat.
31633
32123
  */
31634
32124
  disconnect(accountId: string): Promise<AccountDisconnectResult>;
32125
+ /**
32126
+ * Buy seats on the workspace's active subscription. Returns the new
32127
+ * `seat_ids`; connect an account into one with `auth.intent({ seat_id })`.
32128
+ *
32129
+ * Every call buys the `qty` it asks for, so a repeated call buys again.
32130
+ * The SDK never retries it for you. A
32131
+ * `CurviateError(code: "SUBSCRIPTION_BUSY")` (503) means the purchase could
32132
+ * not be confirmed while another change was in progress: check the seat
32133
+ * count with `listSeats()` before trying again. A trialing workspace
32134
+ * throws `CurviateError(code: "TRIAL_ACTIVE_SEAT_LIMIT")`: buy a seat to
32135
+ * convert first.
32136
+ *
32137
+ * @param body - `{ qty }`, 1-50.
32138
+ *
32139
+ * @example
32140
+ * const { seat_ids } = await curviate.accounts.addSeats({ qty: 1 });
32141
+ */
32142
+ addSeats(body: SeatAddBody): Promise<SeatAddResult>;
32143
+ /**
32144
+ * Schedule a seat's cancellation at the end of the current period.
32145
+ * `effective_at` is when access ends; until then the seat keeps working
32146
+ * and `revertSeatCancellation()` can undo it. Repeating the call on an
32147
+ * already-scheduled seat returns the same `effective_at`; a seat whose
32148
+ * cancellation already took effect throws
32149
+ * `CurviateError(code: "ALREADY_CANCELLED")`.
32150
+ *
32151
+ * @param seatId - a `seat_...` id from `listSeats()`.
32152
+ *
32153
+ * @example
32154
+ * const { effective_at } = await curviate.accounts.cancelSeat("seat_123");
32155
+ */
32156
+ cancelSeat(seatId: string): Promise<SeatCancelResult>;
32157
+ /**
32158
+ * Undo a scheduled seat cancellation before it takes effect. A seat with
32159
+ * nothing scheduled (never cancelled, already reverted, or already
32160
+ * effective) throws `CurviateError(code: "CANCELLATION_ALREADY_EFFECTIVE")`;
32161
+ * a seat covered by a whole-subscription cancellation throws
32162
+ * `CurviateError(code: "INVALID_CANCELLATION_SOURCE")`.
32163
+ *
32164
+ * @param seatId - the `seat_...` id passed to `cancelSeat()`.
32165
+ *
32166
+ * @example
32167
+ * await curviate.accounts.revertSeatCancellation("seat_123");
32168
+ */
32169
+ revertSeatCancellation(seatId: string): Promise<SeatCancelRevertResult>;
31635
32170
  }
31636
32171
 
31637
32172
  /**
@@ -31668,8 +32203,19 @@ type AuthIntentResult = AuthIntentReconnected | AuthIntentCreated | AuthIntentCh
31668
32203
  type AuthSolveCheckpointBody = Omit<paths["/v1/auth/checkpoint/solve"]["post"]["requestBody"]["content"]["application/json"], "account_id">;
31669
32204
  /** `POST /v1/auth/checkpoint/solve` result, 201 (active) or 202 (chained challenge). */
31670
32205
  type AuthSolveCheckpointResult = paths["/v1/auth/checkpoint/solve"]["post"]["responses"]["201"]["content"]["application/json"] | paths["/v1/auth/checkpoint/solve"]["post"]["responses"]["202"]["content"]["application/json"];
31671
- /** `POST /v1/auth/checkpoint/request` 200 body. */
31672
- type AuthRequestCheckpointResult = paths["/v1/auth/checkpoint/request"]["post"]["responses"]["200"]["content"]["application/json"];
32206
+ /**
32207
+ * `requestCheckpoint`'s optional body minus `account_id`: `{ challenge }`, an
32208
+ * id from a `challenge_selection` checkpoint's `challenges` list.
32209
+ */
32210
+ type AuthRequestCheckpointBody = Omit<paths["/v1/auth/checkpoint/request"]["post"]["requestBody"]["content"]["application/json"], "account_id">;
32211
+ /**
32212
+ * `POST /v1/auth/checkpoint/request` result: 200 `{ resent }` for a re-send, or
32213
+ * 202 (the next checkpoint) after switching to a `challenge`. Narrow with
32214
+ * `"status" in result` for the 202 checkpoint and `"resent" in result` for
32215
+ * the 200 re-send. Each check narrows only its true branch (every field on
32216
+ * both shapes is optional), so test for the shape you want, not its else.
32217
+ */
32218
+ type AuthRequestCheckpointResult = paths["/v1/auth/checkpoint/request"]["post"]["responses"]["200"]["content"]["application/json"] | paths["/v1/auth/checkpoint/request"]["post"]["responses"]["202"]["content"]["application/json"];
31673
32219
  /** `POST /v1/auth/checkpoint/poll` 200 body. */
31674
32220
  type AuthPollCheckpointResult = paths["/v1/auth/checkpoint/poll"]["post"]["responses"]["200"]["content"]["application/json"];
31675
32221
  /** `GET /v1/auth/sessions/{session_id}` 200 body. */
@@ -31737,16 +32283,32 @@ declare class AuthResource {
31737
32283
  */
31738
32284
  solveCheckpoint(accountId: string, body: AuthSolveCheckpointBody): Promise<AuthSolveCheckpointResult>;
31739
32285
  /**
31740
- * Re-request the pending checkpoint notification (OTP / 2FA / mobile-app
31741
- * push). `resent` is honest: `true` once the notification was actually
31742
- * re-sent, `false` when there was nothing to re-send for that challenge
31743
- * type (e.g. an authenticator-app code); this call never throws just
32286
+ * Re-send the pending checkpoint code, or switch its verification method.
32287
+ *
32288
+ * Without `body`: re-requests the pending notification (OTP / 2FA /
32289
+ * mobile-app push) and returns 200 `{ resent }`. `resent` is honest: `true`
32290
+ * once the notification was actually re-sent, `false` when there was
32291
+ * nothing to re-send for that challenge type (e.g. an authenticator-app
32292
+ * code, or a `challenge_selection` checkpoint); this call never throws just
31744
32293
  * because a re-send wasn't applicable. Does not reset the checkpoint's
31745
32294
  * expiry.
31746
32295
  *
32296
+ * With `{ challenge }`: answers a `challenge_selection` checkpoint. Pass one
32297
+ * `id` from its `challenges` list (`email`, `sms` or `whatsapp`); the
32298
+ * response is the next checkpoint (202), which you then solve as usual. An
32299
+ * id the checkpoint did not offer throws `CurviateError(code:
32300
+ * "INVALID_REQUEST")`.
32301
+ *
31747
32302
  * @param accountId - the (provisional) `account_id` from the 202 response.
32303
+ * @param body - optional `{ challenge }` for a `challenge_selection` checkpoint.
32304
+ *
32305
+ * @example
32306
+ * const cp = await curviate.auth.intent({ seat_id, auth_method: "credentials", credentials });
32307
+ * if (cp.object === "checkpoint" && cp.challenge_type === "challenge_selection") {
32308
+ * const next = await curviate.auth.requestCheckpoint(cp.account_id!, { challenge: cp.challenges![0]!.id });
32309
+ * }
31748
32310
  */
31749
- requestCheckpoint(accountId: string): Promise<AuthRequestCheckpointResult>;
32311
+ requestCheckpoint(accountId: string, body?: AuthRequestCheckpointBody): Promise<AuthRequestCheckpointResult>;
31750
32312
  /**
31751
32313
  * Poll for mobile-app approval of a pending checkpoint challenge until it
31752
32314
  * leaves `pending`.
@@ -33711,7 +34273,14 @@ declare class WebhooksResource {
33711
34273
  * Register a new webhook endpoint to receive real-time events.
33712
34274
  * `POST /v1/webhooks`
33713
34275
  * The HMAC signing secret is returned exactly once in the 201 response.
33714
- * `account_ids` is required (each webhook is scoped to specific accounts).
34276
+ * `account_ids` scopes a webhook to specific accounts (`acc_` ids you own)
34277
+ * and is required for `messaging` and `user`. For `account_status` it is
34278
+ * optional: omit it to receive status events for every current and future
34279
+ * account of the workspace (reads then return `account_ids: null`). An
34280
+ * explicit `[]` is rejected.
34281
+ *
34282
+ * @example
34283
+ * await curviate.webhooks.create({ source: "account_status", request_url: "https://example.com/hooks" });
33715
34284
  */
33716
34285
  create(body: WebhookCreateBody): Promise<WebhookCreateResult>;
33717
34286
  /**
@@ -33735,6 +34304,8 @@ declare class WebhooksResource {
33735
34304
  /**
33736
34305
  * Update a webhook in place. `source` is immutable.
33737
34306
  * `PATCH /v1/webhooks/{id}`
34307
+ * `account_ids: null` switches an `account_status` webhook to every current
34308
+ * and future account.
33738
34309
  */
33739
34310
  update(id: string, body: WebhookUpdateBody): Promise<WebhookUpdateResult>;
33740
34311
  /**
@@ -34172,8 +34743,20 @@ interface MessagePayload extends EventPayloadBase {
34172
34743
  type ConnectionPayload = EventPayloadBase;
34173
34744
  /**
34174
34745
  * Payload carried by account-state events.
34746
+ *
34747
+ * `account.restricted` (`status: "restricted"`) means the account is still
34748
+ * connected but some actions on it fail: LinkedIn restricted it, or one
34749
+ * LinkedIn product on it (Sales Navigator, Recruiter) needs re-authentication
34750
+ * or is failing. Surface it to a human; for a single failing product a
34751
+ * reconnect may restore it.
34175
34752
  */
34176
- type AccountPayload = EventPayloadBase;
34753
+ interface AccountPayload extends EventPayloadBase {
34754
+ /**
34755
+ * Your own id for the account's end user, as passed on connect or update;
34756
+ * `null` when none is set.
34757
+ */
34758
+ external_id?: string | null;
34759
+ }
34177
34760
  /**
34178
34761
  * Delivery metadata that accompanies every Curviate webhook event.
34179
34762
  *