@curviate/sdk 0.32.0 → 0.34.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/CHANGELOG.md CHANGED
@@ -7,6 +7,82 @@ Versioning: semantic. Minor for additive changes, patch for bug fixes; no stabil
7
7
 
8
8
  ---
9
9
 
10
+ ## [0.34.0] - 2026-09-18
11
+
12
+ Fixture and types regenerated against the deployed production document
13
+ (`https://api.curviate.com`, 127 paths, server `dc4d3d9f0cce8159d7b6685a93291d71eec488c8`).
14
+
15
+ ### Fixed
16
+
17
+ - **Ordinary-message subject retention copy corrected.** The served subject
18
+ description previously read "...The InMail subject line, when the platform
19
+ carries one on this message. Ordinary messages have none. ...", which a live
20
+ round-trip disproved: a classic `start_chat` to a FIRST_DEGREE contact, sent
21
+ with a subject, reads it back on `message.specifics.subject` and stores it
22
+ on both sides. The description now reads "The message's subject line, when
23
+ the platform carries one on this message. Typically an InMail opener, but an
24
+ ordinary message sent with a subject carries one too. ...". No type shape
25
+ change: description string only, at the three sites the served document
26
+ carries it.
27
+
28
+ ## [0.33.0] - 2026-09-17
29
+
30
+ The InMail subject on the message reads, now typed. Fixture and types
31
+ regenerated against the deployed production document
32
+ (`https://api.curviate.com`, 127 paths, server `a38f685e`); the exact source
33
+ commit is recorded in `fixtures/PROVENANCE.json`.
34
+
35
+ ### Added
36
+
37
+ - **`MessageDetail["specifics"]`** types as `{ subject?: string | null }`, on
38
+ `messaging.getMessage()` and each item of `messaging.listMessages()`. The
39
+ served object is narrowed to `subject` alone (`additionalProperties: false`).
40
+ `getChat()`, `listChats()` and `inboxes.listChats()` carry no `specifics` on
41
+ their embedded `last_message`.
42
+
43
+ ### Changed
44
+
45
+ - **`recruiter.startChat()` `follow_up.subject` retention copy corrected.** It
46
+ previously read "Never stored and never logged, on any path", which is not
47
+ supportable: a Recruiter follow-up is an InMail, so once sent it lands in the
48
+ classic InMail inbox that the chat reads harvest. The served document now
49
+ states the conditional, and the regenerated types and fixture carry it.
50
+ - **`messages.sendInmail()` `text`** and the `last_message` descriptions on the
51
+ chat reads carry the same corrected retention wording.
52
+
53
+ ### Documented
54
+
55
+ - **`messaging.listMessages()` / `messaging.getMessage()`**: an InMail thread's
56
+ subject line arrives on a message as `specifics.subject`, set on the thread's
57
+ opening message. The chat object carries no subject at all, and `chat.name` is
58
+ the counterpart's display name, so the subject is read off the first message
59
+ and not off the chat. An ordinary message returns `specifics: {}`. The served
60
+ `specifics` object is narrowed to `subject` alone.
61
+ - **`messaging.getChat()` / `listChats()` / `inboxes.listChats()`**: a chat read
62
+ carries no subject anywhere, its embedded `last_message` included. The preview
63
+ is deliberately narrower than a message read so that a chat read returns the
64
+ same fields whether it was answered live or from Curviate's stored copy. Read
65
+ the chat's messages to get a subject.
66
+
67
+ ### Fixture drift swept in by the refresh
68
+
69
+ The refresh also picked up already-deployed drift the previous fixture lagged
70
+ (it was captured from staging `c98d526`, 2026-09-15). All of it is real served
71
+ state, verified against both `api.curviate.com` and `api.staging.curviate.com`:
72
+
73
+ - Error-response `examples` blocks removed on **144** operations (343 response
74
+ slots), on status codes 409, 422, 503 and 504 only. This is server commit
75
+ `57afde5c5`, "error examples use only codes the API emits", which landed
76
+ immediately after the previous fixture's base. The earlier estimate of ~38
77
+ operations undercounted.
78
+ - Prose corrections to a handful of already-served descriptions: the 503 on the
79
+ applicant-résumé read now names its code, the Sales Navigator chat 422 names
80
+ only the code it emits, the auth-intent 402 describes both codes it can
81
+ carry, and the safety-policy descriptions drop raw path templates and say
82
+ "tenant" rather than "workspace".
83
+
84
+ ---
85
+
10
86
  ## [0.32.0] - 2026-09-15
11
87
 
12
88
  Seat discovery for connecting an account. Additive; nothing removed or renamed.
package/dist/index.d.ts CHANGED
@@ -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). Message content passes through to the platform and is never stored. Company pages are reply-only and cannot start a conversation; reply using a `COMPANY_` chat id from GET /v1/{account_id}/inboxes/{inbox_id}/chats instead.
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.
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. Message content passes through to the platform and is never stored. Sending on behalf of a company page: use a COMPANY_ chat id (from GET /v1/{account_id}/inboxes/{inbox_id}/chats) and the message sends AS THE PAGE, no separate parameter needed. The response's sent_as field names the acting identity that was actually used. Company pages are reply-only: this endpoint can answer an existing conversation on a page's behalf, but a page can never start a new one.
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.
899
899
  */
900
900
  post: operations["postV1AccountIdChatsChatIdMessages"];
901
901
  delete?: never;
@@ -2885,7 +2885,7 @@ interface components {
2885
2885
  chat_id?: string;
2886
2886
  /** @description Identifier of the sender. */
2887
2887
  sender_id?: string;
2888
- /** @description Full message text (content pass-through, never stored). */
2888
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
2889
2889
  text?: string | null;
2890
2890
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
2891
2891
  attachments?: {
@@ -2920,6 +2920,11 @@ interface components {
2920
2920
  reaction_count?: number;
2921
2921
  /** @description The platform this message originates from. */
2922
2922
  provider?: string;
2923
+ /** @description Platform-specific detail on the message. Carries `subject` for an InMail, which is set on the thread's opening message; absent or empty for an ordinary message. */
2924
+ specifics?: {
2925
+ /** @description The message's subject line, when the platform carries one on this message. Typically an InMail opener, but an ordinary message sent with a subject carries one too. Reading a conversation back stores the subject in your tenant's inbox records alongside the body, with no expiry. */
2926
+ subject?: string | null;
2927
+ };
2923
2928
  /** @description The sender's profile, when the platform returned one alongside the message. sender_id always carries the identifier; this object carries the rest of what is known about that person. */
2924
2929
  sender?: {
2925
2930
  /** @description Identifier of the counterpart. */
@@ -10336,7 +10341,7 @@ interface operations {
10336
10341
  last_message_timestamp?: string;
10337
10342
  /** @description Identifier of the 1:1 counterpart. */
10338
10343
  user_id?: string;
10339
- /** @description The most recent message in the chat. */
10344
+ /** @description The most recent message in the chat. Subjects are not previewed here, read the chat's messages for one. */
10340
10345
  last_message?: {
10341
10346
  /**
10342
10347
  * @description Response type discriminator.
@@ -10352,7 +10357,7 @@ interface operations {
10352
10357
  chat_id?: string;
10353
10358
  /** @description Identifier of the sender. */
10354
10359
  sender_id?: string;
10355
- /** @description Full message text (content pass-through, never stored). */
10360
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
10356
10361
  text?: string | null;
10357
10362
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
10358
10363
  attachments?: {
@@ -10761,7 +10766,7 @@ interface operations {
10761
10766
  last_message_timestamp?: string;
10762
10767
  /** @description Identifier of the 1:1 counterpart. */
10763
10768
  user_id?: string;
10764
- /** @description The most recent message in the chat. */
10769
+ /** @description The most recent message in the chat. Subjects are not previewed here, read the chat's messages for one. */
10765
10770
  last_message?: {
10766
10771
  /**
10767
10772
  * @description Response type discriminator.
@@ -10777,7 +10782,7 @@ interface operations {
10777
10782
  chat_id?: string;
10778
10783
  /** @description Identifier of the sender. */
10779
10784
  sender_id?: string;
10780
- /** @description Full message text (content pass-through, never stored). */
10785
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
10781
10786
  text?: string | null;
10782
10787
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
10783
10788
  attachments?: {
@@ -11147,7 +11152,7 @@ interface operations {
11147
11152
  chat_id?: string;
11148
11153
  /** @description Identifier of the sender. */
11149
11154
  sender_id?: string;
11150
- /** @description Full message text (content pass-through, never stored). */
11155
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
11151
11156
  text?: string | null;
11152
11157
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
11153
11158
  attachments?: {
@@ -11182,6 +11187,11 @@ interface operations {
11182
11187
  reaction_count?: number;
11183
11188
  /** @description The platform this message originates from. */
11184
11189
  provider?: string;
11190
+ /** @description Platform-specific detail on the message. Carries `subject` for an InMail, which is set on the thread's opening message; absent or empty for an ordinary message. */
11191
+ specifics?: {
11192
+ /** @description The message's subject line, when the platform carries one on this message. Typically an InMail opener, but an ordinary message sent with a subject carries one too. Reading a conversation back stores the subject in your tenant's inbox records alongside the body, with no expiry. */
11193
+ subject?: string | null;
11194
+ };
11185
11195
  /** @description The sender's profile, when the platform returned one alongside the message. sender_id always carries the identifier; this object carries the rest of what is known about that person. */
11186
11196
  sender?: {
11187
11197
  /** @description Identifier of the counterpart. */
@@ -11526,7 +11536,7 @@ interface operations {
11526
11536
  chat_id?: string;
11527
11537
  /** @description Identifier of the sender. */
11528
11538
  sender_id?: string;
11529
- /** @description Full message text (content pass-through, never stored). */
11539
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
11530
11540
  text?: string | null;
11531
11541
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
11532
11542
  attachments?: {
@@ -11561,6 +11571,11 @@ interface operations {
11561
11571
  reaction_count?: number;
11562
11572
  /** @description The platform this message originates from. */
11563
11573
  provider?: string;
11574
+ /** @description Platform-specific detail on the message. Carries `subject` for an InMail, which is set on the thread's opening message; absent or empty for an ordinary message. */
11575
+ specifics?: {
11576
+ /** @description The message's subject line, when the platform carries one on this message. Typically an InMail opener, but an ordinary message sent with a subject carries one too. Reading a conversation back stores the subject in your tenant's inbox records alongside the body, with no expiry. */
11577
+ subject?: string | null;
11578
+ };
11564
11579
  /** @description The sender's profile, when the platform returned one alongside the message. sender_id always carries the identifier; this object carries the rest of what is known about that person. */
11565
11580
  sender?: {
11566
11581
  /** @description Identifier of the counterpart. */
@@ -12218,7 +12233,7 @@ interface operations {
12218
12233
  id?: string;
12219
12234
  /** @description Account id that owns this message. */
12220
12235
  account_id?: string;
12221
- /** @description Full message text (content pass-through, never stored). */
12236
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
12222
12237
  text?: string | null;
12223
12238
  /** @description Identifier of the sender. */
12224
12239
  sender_id?: string;
@@ -12357,7 +12372,7 @@ interface operations {
12357
12372
  recipient_urn: string;
12358
12373
  /** @description InMail subject line (1-200 chars). */
12359
12374
  subject: string;
12360
- /** @description InMail body text (1-8000 chars). */
12375
+ /** @description InMail body text (1-8000 chars). This call keeps nothing and logs nothing. Once sent it is a message in the account's InMail inbox, so reading that chat back through Curviate stores its body in your tenant's inbox records, with no expiry. */
12361
12376
  text: string;
12362
12377
  };
12363
12378
  };
@@ -12700,7 +12715,7 @@ interface operations {
12700
12715
  last_message_timestamp?: string;
12701
12716
  /** @description Identifier of the 1:1 counterpart. */
12702
12717
  user_id?: string;
12703
- /** @description The most recent message in the chat. */
12718
+ /** @description The most recent message in the chat. Subjects are not previewed here, read the chat's messages for one. */
12704
12719
  last_message?: {
12705
12720
  /**
12706
12721
  * @description Response type discriminator.
@@ -12716,7 +12731,7 @@ interface operations {
12716
12731
  chat_id?: string;
12717
12732
  /** @description Identifier of the sender. */
12718
12733
  sender_id?: string;
12719
- /** @description Full message text (content pass-through, never stored). */
12734
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
12720
12735
  text?: string | null;
12721
12736
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
12722
12737
  attachments?: {
@@ -17974,7 +17989,7 @@ interface operations {
17974
17989
  "application/json": components["schemas"]["Error"];
17975
17990
  };
17976
17991
  };
17977
- /** @description The résumé is still being generated and was not ready in time. Retry the request shortly. */
17992
+ /** @description LINKEDIN_SERVICE_UNAVAILABLE, the résumé is still being generated and was not ready in time. Retry the request shortly. */
17978
17993
  503: {
17979
17994
  headers: {
17980
17995
  [name: string]: unknown;
@@ -20180,11 +20195,11 @@ interface operations {
20180
20195
  "application/json": {
20181
20196
  /** @description One or more Recruiter member IDs (AE... format) to include in the chat. */
20182
20197
  attendees_ids: string[];
20183
- /** @description Opening message text (1-8000 chars). Passed to the platform and discarded; never stored or logged. */
20198
+ /** @description Opening message text (1-8000 chars). This call keeps nothing and logs nothing. Once sent it is a message in the account's InMail inbox, so reading that chat back through Curviate stores its body in your tenant's inbox records, with no expiry. */
20184
20199
  text: string;
20185
20200
  /** @description Subject line; REQUIRED for Recruiter (InMail-based messaging), unlike the classic surface (<= 200 chars). */
20186
20201
  subject: string;
20187
- /** @description Sender signature; REQUIRED for Recruiter. Not stored or logged. */
20202
+ /** @description Sender signature; REQUIRED for Recruiter. Kept as a field by neither this call nor the log. The platform renders it into the sent message body, which is stored if that chat is later read back through Curviate. */
20188
20203
  signature: string;
20189
20204
  /**
20190
20205
  * @description Visibility of the recruiter chat.
@@ -20203,11 +20218,11 @@ interface operations {
20203
20218
  send_as?: "INMAIL" | "EMAIL";
20204
20219
  /** @description Sourcing channel for tracking purposes (e.g. CAREER_SITE, MANUAL_IMPORT, INTERNAL_CANDIDATES, RECRUITER_SEARCH, REFERRAL; the vendor's own vocabulary is broader than this illustrative set, so any non-empty value is accepted rather than a closed enum). */
20205
20220
  channel_type?: string;
20206
- /** @description Recruiter PRO only: schedule a follow-up message. subject/text are not stored or logged. */
20221
+ /** @description Recruiter PRO only: schedule a follow-up message. subject: This call keeps nothing and logs nothing, and unlike the message body the platform does not render it into what is sent. Once sent it is an InMail in the account's inbox: if a message read surfaces this subject, reading that chat back stores it in your tenant's inbox records like a body, with no expiry. text: This call keeps nothing and logs nothing. Once sent it is a message in the account's InMail inbox, so reading that chat back through Curviate stores its body in your tenant's inbox records, with no expiry. */
20207
20222
  follow_up?: {
20208
- /** @description Follow-up message subject. Not stored or logged. */
20223
+ /** @description Follow-up message subject. This call keeps nothing and logs nothing, and unlike the message body the platform does not render it into what is sent. Once sent it is an InMail in the account's inbox: if a message read surfaces this subject, reading that chat back stores it in your tenant's inbox records like a body, with no expiry. */
20209
20224
  subject: string;
20210
- /** @description Follow-up message body. Not stored or logged. */
20225
+ /** @description Follow-up message body. This call keeps nothing and logs nothing. Once sent it is a message in the account's InMail inbox, so reading that chat back through Curviate stores its body in your tenant's inbox records, with no expiry. */
20211
20226
  text: string;
20212
20227
  /** @description Optional follow-up attachments. */
20213
20228
  attachments?: {
@@ -24850,7 +24865,7 @@ interface operations {
24850
24865
  "application/json": {
24851
24866
  /** @description Sales Navigator member IDs for the chat recipients (>= 1, e.g. ACw...). */
24852
24867
  attendees_ids: string[];
24853
- /** @description Opening message text (1-8000 chars). Not stored or logged. */
24868
+ /** @description Opening message text (1-8000 chars). This call keeps nothing and logs nothing. Once sent it is a message in the account's InMail inbox, so reading that chat back through Curviate stores its body in your tenant's inbox records, with no expiry. */
24854
24869
  text: string;
24855
24870
  /** @description Subject line; REQUIRED for Sales Navigator (InMail-based messaging), unlike the classic surface where it is optional (<= 200 chars). Maps into the SN-only specifics branch. */
24856
24871
  subject: string;
@@ -24954,7 +24969,7 @@ interface operations {
24954
24969
  "application/json": components["schemas"]["Error"];
24955
24970
  };
24956
24971
  };
24957
- /** @description RECIPIENT_UNREACHABLE or ACCOUNT_RESTRICTED, the recipient cannot be messaged or the account is restricted. */
24972
+ /** @description ACCOUNT_RESTRICTED, the connected LinkedIn account cannot perform this operation. */
24958
24973
  422: {
24959
24974
  headers: {
24960
24975
  [name: string]: unknown;
@@ -28642,7 +28657,7 @@ interface operations {
28642
28657
  "application/json": components["schemas"]["Error"];
28643
28658
  };
28644
28659
  };
28645
- /** @description Payment required, an active subscription / seat is needed. */
28660
+ /** @description Either PAYMENT_REQUIRED (an active subscription / seat is needed; update your payment method or purchase a seat) or ACCOUNT_DISPUTED (the tenant's account is under dispute review; contact support). The code field distinguishes the two. */
28646
28661
  402: {
28647
28662
  headers: {
28648
28663
  [name: string]: unknown;
@@ -30753,14 +30768,14 @@ interface operations {
30753
30768
  content: {
30754
30769
  "application/json": {
30755
30770
  /**
30756
- * @description Which set of Curviate defaults this account's rows resolve from: `basic`, `premium`, `sales_navigator` or `recruiter`. Each inherits the one before it and raises a few rows. This is the platform product active on the account, NOT the Curviate seat entitlement, and the two can disagree: a lapsed subscription leaves the seat untouched. Curviate detects it from the platform when the account connects, re-detects it on every reconnect and, at most once a day, on an account read; setting it here is an operator override of that result and holds until the next connect. To undo the override, send `limit_profile_source: "default"`: the pin is released, and Curviate re-reads the value from LinkedIn on the account's next read or connect. Sending the value the account already holds changes nothing and pins nothing. The change is recorded in the ledger and it moves the defaults under every row at once, so any row you have configured explicitly keeps your value. The elevated Sales Navigator and Recruiter figures apply only to calls made through the matching interface, the `/v1/{account_id}/sales-navigator/...` and `/v1/{account_id}/recruiter/...` operations, and Curviate holds each call to the figure for the interface it goes through. The numbers here are therefore the ones a standard-interface call is held to, on every profile; a call through one of those operations resolves from the elevated set instead, and each row publishes that figure as `interface_ceiling`.
30771
+ * @description Which set of Curviate defaults this account's rows resolve from: `basic`, `premium`, `sales_navigator` or `recruiter`. Each inherits the one before it and raises a few rows. This is the platform product active on the account, NOT the Curviate seat entitlement, and the two can disagree: a lapsed subscription leaves the seat untouched. Curviate detects it from the platform when the account connects, re-detects it on every reconnect and, at most once a day, on an account read; setting it here is an operator override of that result and holds until the next connect. To undo the override, send `limit_profile_source: "default"`: the pin is released, and Curviate re-reads the value from LinkedIn on the account's next read or connect. Sending the value the account already holds changes nothing and pins nothing. The change is recorded in the ledger and it moves the defaults under every row at once, so any row you have configured explicitly keeps your value. The elevated Sales Navigator and Recruiter figures apply only to calls made through the matching interface, the Sales Navigator and Recruiter operations, and Curviate holds each call to the figure for the interface it goes through. The numbers here are therefore the ones a standard-interface call is held to, on every profile; a call through one of those operations resolves from the elevated set instead, and each row publishes that figure as `interface_ceiling`.
30757
30772
  * @enum {string}
30758
30773
  */
30759
30774
  limit_profile?: "basic" | "premium" | "sales_navigator" | "recruiter";
30760
30775
  /** @description The IANA zone this account's ACTIVITY window is read in, e.g. `Europe/Berlin`. Must be a real zone; anything else is a 400. Null clears it, which DISABLES the activity window for every row that has not set its own: a guessed zone inverts the window, which is worse than not having one. */
30761
30776
  timezone?: string | null;
30762
30777
  /**
30763
- * @description The tenant-wide posture default, which every account inherits unless it overrides it. Set it once for a whole workspace of personas. Null clears it back to `warn`.
30778
+ * @description The tenant-wide posture default, which every account inherits unless it overrides it. Set it once for a whole tenant of personas. Null clears it back to `warn`.
30764
30779
  * @enum {string|null}
30765
30780
  */
30766
30781
  tenant_default_posture?: "warn" | "enforce" | null;
@@ -30829,7 +30844,7 @@ interface operations {
30829
30844
  source_class?: "substrate" | "linkedin_official" | "practitioner" | "inferred" | "unseeded" | null;
30830
30845
  /** @description READ-ONLY. `ceiling` with the account's warm-up ramp applied, which is what this row is actually held to. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
30831
30846
  effective_ceiling?: unknown;
30832
- /** @description READ-ONLY. What a call through the matching elevated interface (`/v1/{account_id}/sales-navigator/...`, `/v1/{account_id}/recruiter/...`) is held to on this row, or null when this row and limit profile have no such figure. `ceiling`, `effective_ceiling`, `band` and `over_default` are all the STANDARD-interface figure, so on a `sales_navigator` or `recruiter` account a row can report `over` while a call through the elevated interface still succeeds. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
30847
+ /** @description READ-ONLY. What a call through the matching elevated interface (the Sales Navigator and Recruiter operations) is held to on this row, or null when this row and limit profile have no such figure. `ceiling`, `effective_ceiling`, `band` and `over_default` are all the STANDARD-interface figure, so on a `sales_navigator` or `recruiter` account a row can report `over` while a call through the elevated interface still succeeds. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
30833
30848
  interface_ceiling?: unknown;
30834
30849
  /** @description READ-ONLY. `interface_ceiling` with the account's warm-up ramp applied. Read THIS to know where an elevated-interface call stops, for the same reason `effective_ceiling` and not `ceiling` answers that for a standard one. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
30835
30850
  effective_interface_ceiling?: unknown;
@@ -31344,7 +31359,7 @@ interface operations {
31344
31359
  * @enum {string|null}
31345
31360
  */
31346
31361
  source_class?: "substrate" | "linkedin_official" | "practitioner" | "inferred" | "unseeded" | null;
31347
- /** @description READ-ONLY. What a call through the matching elevated interface (`/v1/{account_id}/sales-navigator/...`, `/v1/{account_id}/recruiter/...`) is held to on this row, or null when this row and limit profile have no such figure. `ceiling`, `effective_ceiling`, `band` and `over_default` are all the STANDARD-interface figure, so on a `sales_navigator` or `recruiter` account a row can report `over` while a call through the elevated interface still succeeds. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
31362
+ /** @description READ-ONLY. What a call through the matching elevated interface (the Sales Navigator and Recruiter operations) is held to on this row, or null when this row and limit profile have no such figure. `ceiling`, `effective_ceiling`, `band` and `over_default` are all the STANDARD-interface figure, so on a `sales_navigator` or `recruiter` account a row can report `over` while a call through the elevated interface still succeeds. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
31348
31363
  interface_ceiling?: unknown;
31349
31364
  /** @description READ-ONLY. The fields on this row configured above the Curviate default. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
31350
31365
  over_default?: unknown;
@@ -31833,6 +31848,19 @@ declare class MessagingResource {
31833
31848
  /**
31834
31849
  * List messages in a chat, cursor-paginated.
31835
31850
  * `GET /v1/{account_id}/chats/{chat_id}/messages`
31851
+ *
31852
+ * An InMail thread's subject line arrives on a MESSAGE, as
31853
+ * `message.specifics.subject`, carried by the thread's opening message. The
31854
+ * chat object has no subject of its own, and `chat.name` is the counterpart's
31855
+ * display name rather than a folded-in subject, so read the subject from the
31856
+ * first message rather than from the chat. Ordinary (non-InMail) messages
31857
+ * return `specifics: {}`.
31858
+ *
31859
+ * A CHAT READ CARRIES NO SUBJECT AT ALL, including on its embedded
31860
+ * `last_message`: the preview is deliberately narrower than a message read, so
31861
+ * that a chat read returns the same fields whether it was answered from
31862
+ * LinkedIn or from Curviate's stored copy. Getting a subject means reading the
31863
+ * chat's messages.
31836
31864
  */
31837
31865
  listMessages(chatId: string, params?: MessageListQuery): Promise<MessageListPage>;
31838
31866
  /**
@@ -31867,6 +31895,11 @@ declare class MessagingResource {
31867
31895
  /**
31868
31896
  * Get a single message by ID, re-homed under its chat.
31869
31897
  * `GET /v1/{account_id}/chats/{chat_id}/messages/{message_id}`
31898
+ *
31899
+ * `specifics` carries the InMail subject when the platform set one on this
31900
+ * message (`specifics.subject`), and is `{}` otherwise. It is narrowed to
31901
+ * that one field on purpose: the platform's other `specifics` keys are not
31902
+ * part of the published surface.
31870
31903
  */
31871
31904
  getMessage(chatId: string, messageId: string): Promise<MessageDetail>;
31872
31905
  /**
@@ -33631,7 +33664,7 @@ declare class CompaniesResource {
33631
33664
  * const result = await acc.companies.sendMessage("112013061", chats[0]!.id, {
33632
33665
  * text: "Thanks for reaching out, happy to help!",
33633
33666
  * });
33634
- * console.log(result.sent_as); // { kind: "company", company_id: "112013061", name: "RedHire" }
33667
+ * console.log(result.sent_as); // { kind: "company", company_id: "112013061", name: "Northwind Talent" }
33635
33668
  */
33636
33669
  sendMessage(identifier: string, chatId: string, body: CompanySendMessageBody): Promise<CompanySendMessageResult>;
33637
33670
  }
package/dist/index.js CHANGED
@@ -785,6 +785,19 @@ var MessagingResource = class {
785
785
  /**
786
786
  * List messages in a chat, cursor-paginated.
787
787
  * `GET /v1/{account_id}/chats/{chat_id}/messages`
788
+ *
789
+ * An InMail thread's subject line arrives on a MESSAGE, as
790
+ * `message.specifics.subject`, carried by the thread's opening message. The
791
+ * chat object has no subject of its own, and `chat.name` is the counterpart's
792
+ * display name rather than a folded-in subject, so read the subject from the
793
+ * first message rather than from the chat. Ordinary (non-InMail) messages
794
+ * return `specifics: {}`.
795
+ *
796
+ * A CHAT READ CARRIES NO SUBJECT AT ALL, including on its embedded
797
+ * `last_message`: the preview is deliberately narrower than a message read, so
798
+ * that a chat read returns the same fields whether it was answered from
799
+ * LinkedIn or from Curviate's stored copy. Getting a subject means reading the
800
+ * chat's messages.
788
801
  */
789
802
  listMessages(chatId, params) {
790
803
  return this.ctx.request({
@@ -831,6 +844,11 @@ var MessagingResource = class {
831
844
  /**
832
845
  * Get a single message by ID, re-homed under its chat.
833
846
  * `GET /v1/{account_id}/chats/{chat_id}/messages/{message_id}`
847
+ *
848
+ * `specifics` carries the InMail subject when the platform set one on this
849
+ * message (`specifics.subject`), and is `{}` otherwise. It is narrowed to
850
+ * that one field on purpose: the platform's other `specifics` keys are not
851
+ * part of the published surface.
834
852
  */
835
853
  getMessage(chatId, messageId) {
836
854
  return this.ctx.request({
@@ -2811,7 +2829,7 @@ var CompaniesResource = class {
2811
2829
  * const result = await acc.companies.sendMessage("112013061", chats[0]!.id, {
2812
2830
  * text: "Thanks for reaching out, happy to help!",
2813
2831
  * });
2814
- * console.log(result.sent_as); // { kind: "company", company_id: "112013061", name: "RedHire" }
2832
+ * console.log(result.sent_as); // { kind: "company", company_id: "112013061", name: "Northwind Talent" }
2815
2833
  */
2816
2834
  sendMessage(identifier, chatId, body) {
2817
2835
  return this.ctx.request({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curviate/sdk",
3
- "version": "0.32.0",
3
+ "version": "0.34.0",
4
4
  "private": false,
5
5
  "description": "TypeScript SDK for the Curviate API.",
6
6
  "license": "MIT",
@@ -749,7 +749,7 @@ export interface paths {
749
749
  put?: never;
750
750
  /**
751
751
  * Start a chat
752
- * @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). Message content passes through to the platform and is never stored. Company pages are reply-only and cannot start a conversation; reply using a `COMPANY_` chat id from GET /v1/{account_id}/inboxes/{inbox_id}/chats instead.
752
+ * @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.
753
753
  */
754
754
  post: operations["postV1AccountIdChats"];
755
755
  delete?: never;
@@ -797,7 +797,7 @@ export interface paths {
797
797
  put?: never;
798
798
  /**
799
799
  * Send a message
800
- * @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. Message content passes through to the platform and is never stored. Sending on behalf of a company page: use a COMPANY_ chat id (from GET /v1/{account_id}/inboxes/{inbox_id}/chats) and the message sends AS THE PAGE, no separate parameter needed. The response's sent_as field names the acting identity that was actually used. Company pages are reply-only: this endpoint can answer an existing conversation on a page's behalf, but a page can never start a new one.
800
+ * @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.
801
801
  */
802
802
  post: operations["postV1AccountIdChatsChatIdMessages"];
803
803
  delete?: never;
@@ -2788,7 +2788,7 @@ export interface components {
2788
2788
  chat_id?: string;
2789
2789
  /** @description Identifier of the sender. */
2790
2790
  sender_id?: string;
2791
- /** @description Full message text (content pass-through, never stored). */
2791
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
2792
2792
  text?: string | null;
2793
2793
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
2794
2794
  attachments?: {
@@ -2823,6 +2823,11 @@ export interface components {
2823
2823
  reaction_count?: number;
2824
2824
  /** @description The platform this message originates from. */
2825
2825
  provider?: string;
2826
+ /** @description Platform-specific detail on the message. Carries `subject` for an InMail, which is set on the thread's opening message; absent or empty for an ordinary message. */
2827
+ specifics?: {
2828
+ /** @description The message's subject line, when the platform carries one on this message. Typically an InMail opener, but an ordinary message sent with a subject carries one too. Reading a conversation back stores the subject in your tenant's inbox records alongside the body, with no expiry. */
2829
+ subject?: string | null;
2830
+ };
2826
2831
  /** @description The sender's profile, when the platform returned one alongside the message. sender_id always carries the identifier; this object carries the rest of what is known about that person. */
2827
2832
  sender?: {
2828
2833
  /** @description Identifier of the counterpart. */
@@ -10240,7 +10245,7 @@ export interface operations {
10240
10245
  last_message_timestamp?: string;
10241
10246
  /** @description Identifier of the 1:1 counterpart. */
10242
10247
  user_id?: string;
10243
- /** @description The most recent message in the chat. */
10248
+ /** @description The most recent message in the chat. Subjects are not previewed here, read the chat's messages for one. */
10244
10249
  last_message?: {
10245
10250
  /**
10246
10251
  * @description Response type discriminator.
@@ -10256,7 +10261,7 @@ export interface operations {
10256
10261
  chat_id?: string;
10257
10262
  /** @description Identifier of the sender. */
10258
10263
  sender_id?: string;
10259
- /** @description Full message text (content pass-through, never stored). */
10264
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
10260
10265
  text?: string | null;
10261
10266
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
10262
10267
  attachments?: {
@@ -10665,7 +10670,7 @@ export interface operations {
10665
10670
  last_message_timestamp?: string;
10666
10671
  /** @description Identifier of the 1:1 counterpart. */
10667
10672
  user_id?: string;
10668
- /** @description The most recent message in the chat. */
10673
+ /** @description The most recent message in the chat. Subjects are not previewed here, read the chat's messages for one. */
10669
10674
  last_message?: {
10670
10675
  /**
10671
10676
  * @description Response type discriminator.
@@ -10681,7 +10686,7 @@ export interface operations {
10681
10686
  chat_id?: string;
10682
10687
  /** @description Identifier of the sender. */
10683
10688
  sender_id?: string;
10684
- /** @description Full message text (content pass-through, never stored). */
10689
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
10685
10690
  text?: string | null;
10686
10691
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
10687
10692
  attachments?: {
@@ -11051,7 +11056,7 @@ export interface operations {
11051
11056
  chat_id?: string;
11052
11057
  /** @description Identifier of the sender. */
11053
11058
  sender_id?: string;
11054
- /** @description Full message text (content pass-through, never stored). */
11059
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
11055
11060
  text?: string | null;
11056
11061
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
11057
11062
  attachments?: {
@@ -11086,6 +11091,11 @@ export interface operations {
11086
11091
  reaction_count?: number;
11087
11092
  /** @description The platform this message originates from. */
11088
11093
  provider?: string;
11094
+ /** @description Platform-specific detail on the message. Carries `subject` for an InMail, which is set on the thread's opening message; absent or empty for an ordinary message. */
11095
+ specifics?: {
11096
+ /** @description The message's subject line, when the platform carries one on this message. Typically an InMail opener, but an ordinary message sent with a subject carries one too. Reading a conversation back stores the subject in your tenant's inbox records alongside the body, with no expiry. */
11097
+ subject?: string | null;
11098
+ };
11089
11099
  /** @description The sender's profile, when the platform returned one alongside the message. sender_id always carries the identifier; this object carries the rest of what is known about that person. */
11090
11100
  sender?: {
11091
11101
  /** @description Identifier of the counterpart. */
@@ -11430,7 +11440,7 @@ export interface operations {
11430
11440
  chat_id?: string;
11431
11441
  /** @description Identifier of the sender. */
11432
11442
  sender_id?: string;
11433
- /** @description Full message text (content pass-through, never stored). */
11443
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
11434
11444
  text?: string | null;
11435
11445
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
11436
11446
  attachments?: {
@@ -11465,6 +11475,11 @@ export interface operations {
11465
11475
  reaction_count?: number;
11466
11476
  /** @description The platform this message originates from. */
11467
11477
  provider?: string;
11478
+ /** @description Platform-specific detail on the message. Carries `subject` for an InMail, which is set on the thread's opening message; absent or empty for an ordinary message. */
11479
+ specifics?: {
11480
+ /** @description The message's subject line, when the platform carries one on this message. Typically an InMail opener, but an ordinary message sent with a subject carries one too. Reading a conversation back stores the subject in your tenant's inbox records alongside the body, with no expiry. */
11481
+ subject?: string | null;
11482
+ };
11468
11483
  /** @description The sender's profile, when the platform returned one alongside the message. sender_id always carries the identifier; this object carries the rest of what is known about that person. */
11469
11484
  sender?: {
11470
11485
  /** @description Identifier of the counterpart. */
@@ -12122,7 +12137,7 @@ export interface operations {
12122
12137
  id?: string;
12123
12138
  /** @description Account id that owns this message. */
12124
12139
  account_id?: string;
12125
- /** @description Full message text (content pass-through, never stored). */
12140
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
12126
12141
  text?: string | null;
12127
12142
  /** @description Identifier of the sender. */
12128
12143
  sender_id?: string;
@@ -12261,7 +12276,7 @@ export interface operations {
12261
12276
  recipient_urn: string;
12262
12277
  /** @description InMail subject line (1-200 chars). */
12263
12278
  subject: string;
12264
- /** @description InMail body text (1-8000 chars). */
12279
+ /** @description InMail body text (1-8000 chars). This call keeps nothing and logs nothing. Once sent it is a message in the account's InMail inbox, so reading that chat back through Curviate stores its body in your tenant's inbox records, with no expiry. */
12265
12280
  text: string;
12266
12281
  };
12267
12282
  };
@@ -12604,7 +12619,7 @@ export interface operations {
12604
12619
  last_message_timestamp?: string;
12605
12620
  /** @description Identifier of the 1:1 counterpart. */
12606
12621
  user_id?: string;
12607
- /** @description The most recent message in the chat. */
12622
+ /** @description The most recent message in the chat. Subjects are not previewed here, read the chat's messages for one. */
12608
12623
  last_message?: {
12609
12624
  /**
12610
12625
  * @description Response type discriminator.
@@ -12620,7 +12635,7 @@ export interface operations {
12620
12635
  chat_id?: string;
12621
12636
  /** @description Identifier of the sender. */
12622
12637
  sender_id?: string;
12623
- /** @description Full message text (content pass-through, never stored). */
12638
+ /** @description Full message text. Curviate does not keep it on the way out; reading a conversation back stores its message bodies in your tenant's inbox records, with no expiry. */
12624
12639
  text?: string | null;
12625
12640
  /** @description Attachment descriptors (no bytes, use the attachment endpoint to download). */
12626
12641
  attachments?: {
@@ -17878,7 +17893,7 @@ export interface operations {
17878
17893
  "application/json": components["schemas"]["Error"];
17879
17894
  };
17880
17895
  };
17881
- /** @description The résumé is still being generated and was not ready in time. Retry the request shortly. */
17896
+ /** @description LINKEDIN_SERVICE_UNAVAILABLE, the résumé is still being generated and was not ready in time. Retry the request shortly. */
17882
17897
  503: {
17883
17898
  headers: {
17884
17899
  [name: string]: unknown;
@@ -20084,11 +20099,11 @@ export interface operations {
20084
20099
  "application/json": {
20085
20100
  /** @description One or more Recruiter member IDs (AE... format) to include in the chat. */
20086
20101
  attendees_ids: string[];
20087
- /** @description Opening message text (1-8000 chars). Passed to the platform and discarded; never stored or logged. */
20102
+ /** @description Opening message text (1-8000 chars). This call keeps nothing and logs nothing. Once sent it is a message in the account's InMail inbox, so reading that chat back through Curviate stores its body in your tenant's inbox records, with no expiry. */
20088
20103
  text: string;
20089
20104
  /** @description Subject line; REQUIRED for Recruiter (InMail-based messaging), unlike the classic surface (<= 200 chars). */
20090
20105
  subject: string;
20091
- /** @description Sender signature; REQUIRED for Recruiter. Not stored or logged. */
20106
+ /** @description Sender signature; REQUIRED for Recruiter. Kept as a field by neither this call nor the log. The platform renders it into the sent message body, which is stored if that chat is later read back through Curviate. */
20092
20107
  signature: string;
20093
20108
  /**
20094
20109
  * @description Visibility of the recruiter chat.
@@ -20107,11 +20122,11 @@ export interface operations {
20107
20122
  send_as?: "INMAIL" | "EMAIL";
20108
20123
  /** @description Sourcing channel for tracking purposes (e.g. CAREER_SITE, MANUAL_IMPORT, INTERNAL_CANDIDATES, RECRUITER_SEARCH, REFERRAL; the vendor's own vocabulary is broader than this illustrative set, so any non-empty value is accepted rather than a closed enum). */
20109
20124
  channel_type?: string;
20110
- /** @description Recruiter PRO only: schedule a follow-up message. subject/text are not stored or logged. */
20125
+ /** @description Recruiter PRO only: schedule a follow-up message. subject: This call keeps nothing and logs nothing, and unlike the message body the platform does not render it into what is sent. Once sent it is an InMail in the account's inbox: if a message read surfaces this subject, reading that chat back stores it in your tenant's inbox records like a body, with no expiry. text: This call keeps nothing and logs nothing. Once sent it is a message in the account's InMail inbox, so reading that chat back through Curviate stores its body in your tenant's inbox records, with no expiry. */
20111
20126
  follow_up?: {
20112
- /** @description Follow-up message subject. Not stored or logged. */
20127
+ /** @description Follow-up message subject. This call keeps nothing and logs nothing, and unlike the message body the platform does not render it into what is sent. Once sent it is an InMail in the account's inbox: if a message read surfaces this subject, reading that chat back stores it in your tenant's inbox records like a body, with no expiry. */
20113
20128
  subject: string;
20114
- /** @description Follow-up message body. Not stored or logged. */
20129
+ /** @description Follow-up message body. This call keeps nothing and logs nothing. Once sent it is a message in the account's InMail inbox, so reading that chat back through Curviate stores its body in your tenant's inbox records, with no expiry. */
20115
20130
  text: string;
20116
20131
  /** @description Optional follow-up attachments. */
20117
20132
  attachments?: {
@@ -24754,7 +24769,7 @@ export interface operations {
24754
24769
  "application/json": {
24755
24770
  /** @description Sales Navigator member IDs for the chat recipients (>= 1, e.g. ACw...). */
24756
24771
  attendees_ids: string[];
24757
- /** @description Opening message text (1-8000 chars). Not stored or logged. */
24772
+ /** @description Opening message text (1-8000 chars). This call keeps nothing and logs nothing. Once sent it is a message in the account's InMail inbox, so reading that chat back through Curviate stores its body in your tenant's inbox records, with no expiry. */
24758
24773
  text: string;
24759
24774
  /** @description Subject line; REQUIRED for Sales Navigator (InMail-based messaging), unlike the classic surface where it is optional (<= 200 chars). Maps into the SN-only specifics branch. */
24760
24775
  subject: string;
@@ -24858,7 +24873,7 @@ export interface operations {
24858
24873
  "application/json": components["schemas"]["Error"];
24859
24874
  };
24860
24875
  };
24861
- /** @description RECIPIENT_UNREACHABLE or ACCOUNT_RESTRICTED, the recipient cannot be messaged or the account is restricted. */
24876
+ /** @description ACCOUNT_RESTRICTED, the connected LinkedIn account cannot perform this operation. */
24862
24877
  422: {
24863
24878
  headers: {
24864
24879
  [name: string]: unknown;
@@ -28546,7 +28561,7 @@ export interface operations {
28546
28561
  "application/json": components["schemas"]["Error"];
28547
28562
  };
28548
28563
  };
28549
- /** @description Payment required, an active subscription / seat is needed. */
28564
+ /** @description Either PAYMENT_REQUIRED (an active subscription / seat is needed; update your payment method or purchase a seat) or ACCOUNT_DISPUTED (the tenant's account is under dispute review; contact support). The code field distinguishes the two. */
28550
28565
  402: {
28551
28566
  headers: {
28552
28567
  [name: string]: unknown;
@@ -30657,14 +30672,14 @@ export interface operations {
30657
30672
  content: {
30658
30673
  "application/json": {
30659
30674
  /**
30660
- * @description Which set of Curviate defaults this account's rows resolve from: `basic`, `premium`, `sales_navigator` or `recruiter`. Each inherits the one before it and raises a few rows. This is the platform product active on the account, NOT the Curviate seat entitlement, and the two can disagree: a lapsed subscription leaves the seat untouched. Curviate detects it from the platform when the account connects, re-detects it on every reconnect and, at most once a day, on an account read; setting it here is an operator override of that result and holds until the next connect. To undo the override, send `limit_profile_source: "default"`: the pin is released, and Curviate re-reads the value from LinkedIn on the account's next read or connect. Sending the value the account already holds changes nothing and pins nothing. The change is recorded in the ledger and it moves the defaults under every row at once, so any row you have configured explicitly keeps your value. The elevated Sales Navigator and Recruiter figures apply only to calls made through the matching interface, the `/v1/{account_id}/sales-navigator/...` and `/v1/{account_id}/recruiter/...` operations, and Curviate holds each call to the figure for the interface it goes through. The numbers here are therefore the ones a standard-interface call is held to, on every profile; a call through one of those operations resolves from the elevated set instead, and each row publishes that figure as `interface_ceiling`.
30675
+ * @description Which set of Curviate defaults this account's rows resolve from: `basic`, `premium`, `sales_navigator` or `recruiter`. Each inherits the one before it and raises a few rows. This is the platform product active on the account, NOT the Curviate seat entitlement, and the two can disagree: a lapsed subscription leaves the seat untouched. Curviate detects it from the platform when the account connects, re-detects it on every reconnect and, at most once a day, on an account read; setting it here is an operator override of that result and holds until the next connect. To undo the override, send `limit_profile_source: "default"`: the pin is released, and Curviate re-reads the value from LinkedIn on the account's next read or connect. Sending the value the account already holds changes nothing and pins nothing. The change is recorded in the ledger and it moves the defaults under every row at once, so any row you have configured explicitly keeps your value. The elevated Sales Navigator and Recruiter figures apply only to calls made through the matching interface, the Sales Navigator and Recruiter operations, and Curviate holds each call to the figure for the interface it goes through. The numbers here are therefore the ones a standard-interface call is held to, on every profile; a call through one of those operations resolves from the elevated set instead, and each row publishes that figure as `interface_ceiling`.
30661
30676
  * @enum {string}
30662
30677
  */
30663
30678
  limit_profile?: "basic" | "premium" | "sales_navigator" | "recruiter";
30664
30679
  /** @description The IANA zone this account's ACTIVITY window is read in, e.g. `Europe/Berlin`. Must be a real zone; anything else is a 400. Null clears it, which DISABLES the activity window for every row that has not set its own: a guessed zone inverts the window, which is worse than not having one. */
30665
30680
  timezone?: string | null;
30666
30681
  /**
30667
- * @description The tenant-wide posture default, which every account inherits unless it overrides it. Set it once for a whole workspace of personas. Null clears it back to `warn`.
30682
+ * @description The tenant-wide posture default, which every account inherits unless it overrides it. Set it once for a whole tenant of personas. Null clears it back to `warn`.
30668
30683
  * @enum {string|null}
30669
30684
  */
30670
30685
  tenant_default_posture?: "warn" | "enforce" | null;
@@ -30733,7 +30748,7 @@ export interface operations {
30733
30748
  source_class?: "substrate" | "linkedin_official" | "practitioner" | "inferred" | "unseeded" | null;
30734
30749
  /** @description READ-ONLY. `ceiling` with the account's warm-up ramp applied, which is what this row is actually held to. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
30735
30750
  effective_ceiling?: unknown;
30736
- /** @description READ-ONLY. What a call through the matching elevated interface (`/v1/{account_id}/sales-navigator/...`, `/v1/{account_id}/recruiter/...`) is held to on this row, or null when this row and limit profile have no such figure. `ceiling`, `effective_ceiling`, `band` and `over_default` are all the STANDARD-interface figure, so on a `sales_navigator` or `recruiter` account a row can report `over` while a call through the elevated interface still succeeds. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
30751
+ /** @description READ-ONLY. What a call through the matching elevated interface (the Sales Navigator and Recruiter operations) is held to on this row, or null when this row and limit profile have no such figure. `ceiling`, `effective_ceiling`, `band` and `over_default` are all the STANDARD-interface figure, so on a `sales_navigator` or `recruiter` account a row can report `over` while a call through the elevated interface still succeeds. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
30737
30752
  interface_ceiling?: unknown;
30738
30753
  /** @description READ-ONLY. `interface_ceiling` with the account's warm-up ramp applied. Read THIS to know where an elevated-interface call stops, for the same reason `effective_ceiling` and not `ceiling` answers that for a standard one. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
30739
30754
  effective_interface_ceiling?: unknown;
@@ -31248,7 +31263,7 @@ export interface operations {
31248
31263
  * @enum {string|null}
31249
31264
  */
31250
31265
  source_class?: "substrate" | "linkedin_official" | "practitioner" | "inferred" | "unseeded" | null;
31251
- /** @description READ-ONLY. What a call through the matching elevated interface (`/v1/{account_id}/sales-navigator/...`, `/v1/{account_id}/recruiter/...`) is held to on this row, or null when this row and limit profile have no such figure. `ceiling`, `effective_ceiling`, `band` and `over_default` are all the STANDARD-interface figure, so on a `sales_navigator` or `recruiter` account a row can report `over` while a call through the elevated interface still succeeds. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
31266
+ /** @description READ-ONLY. What a call through the matching elevated interface (the Sales Navigator and Recruiter operations) is held to on this row, or null when this row and limit profile have no such figure. `ceiling`, `effective_ceiling`, `band` and `over_default` are all the STANDARD-interface figure, so on a `sales_navigator` or `recruiter` account a row can report `over` while a call through the elevated interface still succeeds. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
31252
31267
  interface_ceiling?: unknown;
31253
31268
  /** @description READ-ONLY. The fields on this row configured above the Curviate default. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
31254
31269
  over_default?: unknown;