@curviate/sdk 0.30.0 → 0.32.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
@@ -2398,6 +2398,26 @@ interface paths {
2398
2398
  patch: operations["patchV1AccountsAccountId"];
2399
2399
  trace?: never;
2400
2400
  };
2401
+ "/v1/accounts/seats": {
2402
+ parameters: {
2403
+ query?: never;
2404
+ header?: never;
2405
+ path?: never;
2406
+ cookie?: never;
2407
+ };
2408
+ /**
2409
+ * List seats
2410
+ * @description List the workspace's seats: each `seat_id`, whether an account occupies it, and that `account_id`. Pass an unoccupied `seat_id` to POST /v1/auth/intent to connect a new account. Every unoccupied seat listed is a valid connect target. Not paginated.
2411
+ */
2412
+ get: operations["getV1AccountsSeats"];
2413
+ put?: never;
2414
+ post?: never;
2415
+ delete?: never;
2416
+ options?: never;
2417
+ head?: never;
2418
+ patch?: never;
2419
+ trace?: never;
2420
+ };
2401
2421
  "/v1/auth/intent": {
2402
2422
  parameters: {
2403
2423
  query?: never;
@@ -2409,7 +2429,7 @@ interface paths {
2409
2429
  put?: never;
2410
2430
  /**
2411
2431
  * Start a credential/cookie authentication
2412
- * @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` (every seat id is listed with click-to-copy in 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.
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.
2413
2433
  */
2414
2434
  post: operations["postV1AuthIntent"];
2415
2435
  delete?: never;
@@ -2679,7 +2699,7 @@ interface paths {
2679
2699
  };
2680
2700
  /**
2681
2701
  * Read an account's safety policy
2682
- * @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. 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. When the Curviate seat attached to this account disagrees with that, `seat_tier_mismatch` names the seat tier; the detected product wins the numbers either way.
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.
2683
2703
  */
2684
2704
  get: operations["getV1AccountIdSafetyPolicy"];
2685
2705
  put?: never;
@@ -2689,7 +2709,7 @@ interface paths {
2689
2709
  head?: never;
2690
2710
  /**
2691
2711
  * Update an account's safety policy
2692
- * @description The single safety-policy write. 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 Curviate default. 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 is an operator override of that result, and it holds until the next connect. When the seat and the detected product disagree, the detected product wins the numbers and the read reports the disagreement as `seat_tier_mismatch`. 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.
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 is an operator override of that result, and it holds until the next connect. 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.
2693
2713
  */
2694
2714
  patch: operations["patchV1AccountIdSafetyPolicy"];
2695
2715
  trace?: never;
@@ -2714,6 +2734,30 @@ interface paths {
2714
2734
  patch?: never;
2715
2735
  trace?: never;
2716
2736
  };
2737
+ "/v1/safety-policy": {
2738
+ parameters: {
2739
+ query?: never;
2740
+ header?: never;
2741
+ path?: never;
2742
+ cookie?: never;
2743
+ };
2744
+ /**
2745
+ * 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.
2747
+ */
2748
+ get: operations["getV1SafetyPolicy"];
2749
+ put?: never;
2750
+ post?: never;
2751
+ delete?: never;
2752
+ options?: never;
2753
+ head?: never;
2754
+ /**
2755
+ * 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`.
2757
+ */
2758
+ patch: operations["patchV1SafetyPolicy"];
2759
+ trace?: never;
2760
+ };
2717
2761
  }
2718
2762
  interface components {
2719
2763
  schemas: {
@@ -9319,7 +9363,7 @@ interface operations {
9319
9363
  }[];
9320
9364
  /** @description Paging metadata. */
9321
9365
  paging: {
9322
- /** @description Total matching result count. */
9366
+ /** @description Total number of matching job postings, including 0 on an empty page. */
9323
9367
  total_count: number | null;
9324
9368
  };
9325
9369
  /** @description Opaque next-page cursor; null on the last page. */
@@ -28333,6 +28377,91 @@ interface operations {
28333
28377
  };
28334
28378
  };
28335
28379
  };
28380
+ getV1AccountsSeats: {
28381
+ parameters: {
28382
+ query?: never;
28383
+ header?: never;
28384
+ path?: never;
28385
+ cookie?: never;
28386
+ };
28387
+ requestBody?: never;
28388
+ responses: {
28389
+ /** @description Every live seat in the workspace with its occupancy. Empty list when the workspace has no seats. */
28390
+ 200: {
28391
+ headers: {
28392
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
28393
+ RateLimit: components["headers"]["RateLimit"];
28394
+ [name: string]: unknown;
28395
+ };
28396
+ content: {
28397
+ "application/json": {
28398
+ /**
28399
+ * @description Response type discriminator.
28400
+ * @enum {string}
28401
+ */
28402
+ object: "seat_list";
28403
+ items: {
28404
+ /** @description The seat ID (`seat_...`). Pass an unoccupied one as `seat_id` when connecting a new account. */
28405
+ seat_id: string;
28406
+ /** @description True when an account is connected on this seat. */
28407
+ occupied: boolean;
28408
+ /** @description The account on this seat, or null when unoccupied. */
28409
+ account_id: string | null;
28410
+ }[];
28411
+ safety_warning?: components["schemas"]["SafetyWarning"];
28412
+ };
28413
+ };
28414
+ };
28415
+ /** @description Missing or invalid API key. */
28416
+ 401: {
28417
+ headers: {
28418
+ [name: string]: unknown;
28419
+ };
28420
+ content: {
28421
+ "application/json": components["schemas"]["Error"];
28422
+ };
28423
+ };
28424
+ /** @description Rate limited, slow down and retry after the hinted delay. */
28425
+ 429: {
28426
+ headers: {
28427
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
28428
+ RateLimit: components["headers"]["RateLimit"];
28429
+ "Retry-After": components["headers"]["Retry-After"];
28430
+ [name: string]: unknown;
28431
+ };
28432
+ content: {
28433
+ "application/json": components["schemas"]["Error"];
28434
+ };
28435
+ };
28436
+ /** @description Internal error. */
28437
+ 500: {
28438
+ headers: {
28439
+ [name: string]: unknown;
28440
+ };
28441
+ content: {
28442
+ "application/json": components["schemas"]["Error"];
28443
+ };
28444
+ };
28445
+ /** @description Service unavailable. */
28446
+ 503: {
28447
+ headers: {
28448
+ [name: string]: unknown;
28449
+ };
28450
+ content: {
28451
+ "application/json": components["schemas"]["Error"];
28452
+ };
28453
+ };
28454
+ /** @description Gateway timeout. */
28455
+ 504: {
28456
+ headers: {
28457
+ [name: string]: unknown;
28458
+ };
28459
+ content: {
28460
+ "application/json": components["schemas"]["Error"];
28461
+ };
28462
+ };
28463
+ };
28464
+ };
28336
28465
  postV1AuthIntent: {
28337
28466
  parameters: {
28338
28467
  query?: never;
@@ -28343,7 +28472,7 @@ interface operations {
28343
28472
  requestBody: {
28344
28473
  content: {
28345
28474
  "application/json": {
28346
- /** @description The empty seat this NEW account will occupy. Required on a new connect; omit it and the call returns 400 INVALID_REQUEST with 'seat_id is required'. Seat ids look like seat_01H..., and every seat you own is listed with click-to-copy in the seat table on your dashboard; any seat showing no attached account is free to use. Ignored when account_id is present, because a reconnect keeps the account on its current seat. */
28475
+ /** @description The empty seat this NEW account will occupy. Required on a new connect; omit it and the call returns 400 INVALID_REQUEST with 'seat_id is required'. Seat ids look like seat_01H..., and every seat you own is listed by GET /v1/accounts/seats (any item with occupied false is free to use) and with click-to-copy in the seat table on your dashboard. Ignored when account_id is present, because a reconnect keeps the account on its current seat. */
28347
28476
  seat_id?: string;
28348
28477
  /**
28349
28478
  * @description How to authenticate. 'credentials' reads the nested `credentials` object (email + password). 'cookie' reads the nested `cookie` object (li_at) and also requires a top-level `user_agent`. Neither set of fields is accepted at the top level.
@@ -28400,7 +28529,7 @@ interface operations {
28400
28529
  /** @description Maximum number of messages to sync per chat. */
28401
28530
  messages?: number;
28402
28531
  };
28403
- /** @description Which Recruiter contract to bind this account to (Recruiter tier only). */
28532
+ /** @description Which Recruiter contract to bind this account to. Only meaningful when the LinkedIn account holds a Recruiter subscription. */
28404
28533
  recruiter_contract_id?: string;
28405
28534
  };
28406
28535
  };
@@ -30453,11 +30582,6 @@ interface operations {
30453
30582
  * @enum {string}
30454
30583
  */
30455
30584
  limit_profile?: "basic" | "premium" | "sales_navigator" | "recruiter";
30456
- /**
30457
- * @description The Curviate seat tier attached to this account when it disagrees with `limit_profile`, and null when the two agree or the account holds no seat. A seat records what you bought from Curviate; `limit_profile` records what LinkedIn currently grants, and a lapsed subscription moves one and not the other. The detected product always wins the numbers, so this is a report, not a refusal: a `recruiter` seat here means you are paying for Recruiter on an account LinkedIn does not currently grant it to. `core` alongside `basic` or `premium` is agreement, not a mismatch: Premium is a LinkedIn product, not a Curviate tier. A free-trial seat never reports here, because a trial is not a purchase, and neither does a seat whose entitlement has not started yet or has already lapsed.
30458
- * @enum {string|null}
30459
- */
30460
- seat_tier_mismatch?: "core" | "sn" | "recruiter" | null;
30461
30585
  /**
30462
30586
  * @description Where `limit_profile` came from. `detected`: Curviate read it from LinkedIn, at `limit_profile_detected_at`. `operator`: it was set through this operation and holds until the account next connects, or until you send `limit_profile_source: "default"` on this operation, which releases it. `default`: it has never been observed, so the value is the seeded `basic` and says nothing about the account; Curviate detects it on the account's next read or connect.
30463
30587
  * @enum {string}
@@ -30718,8 +30842,6 @@ interface operations {
30718
30842
  object?: unknown;
30719
30843
  /** @description READ-ONLY. The account this document describes; the path names it. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
30720
30844
  account_id?: unknown;
30721
- /** @description READ-ONLY. The Curviate seat tier that disagrees with `limit_profile`. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
30722
- seat_tier_mismatch?: unknown;
30723
30845
  /**
30724
30846
  * @description Where `limit_profile` came from: `default` (never observed), `detected` (read from LinkedIn) or `operator` (set through this operation). Sending `default` releases an operator override: the value is re-read from LinkedIn on the account's next read or connect. Sending `detected` or `operator` is accepted and ignored, so the whole document round-trips.
30725
30847
  * @enum {string}
@@ -30758,11 +30880,6 @@ interface operations {
30758
30880
  * @enum {string}
30759
30881
  */
30760
30882
  limit_profile?: "basic" | "premium" | "sales_navigator" | "recruiter";
30761
- /**
30762
- * @description The Curviate seat tier attached to this account when it disagrees with `limit_profile`, and null when the two agree or the account holds no seat. A seat records what you bought from Curviate; `limit_profile` records what LinkedIn currently grants, and a lapsed subscription moves one and not the other. The detected product always wins the numbers, so this is a report, not a refusal: a `recruiter` seat here means you are paying for Recruiter on an account LinkedIn does not currently grant it to. `core` alongside `basic` or `premium` is agreement, not a mismatch: Premium is a LinkedIn product, not a Curviate tier. A free-trial seat never reports here, because a trial is not a purchase, and neither does a seat whose entitlement has not started yet or has already lapsed.
30763
- * @enum {string|null}
30764
- */
30765
- seat_tier_mismatch?: "core" | "sn" | "recruiter" | null;
30766
30883
  /**
30767
30884
  * @description Where `limit_profile` came from. `detected`: Curviate read it from LinkedIn, at `limit_profile_detected_at`. `operator`: it was set through this operation and holds until the account next connects, or until you send `limit_profile_source: "default"` on this operation, which releases it. `default`: it has never been observed, so the value is the seeded `basic` and says nothing about the account; Curviate detects it on the account's next read or connect.
30768
30885
  * @enum {string}
@@ -31042,10 +31159,342 @@ interface operations {
31042
31159
  };
31043
31160
  };
31044
31161
  };
31162
+ getV1SafetyPolicy: {
31163
+ parameters: {
31164
+ query?: never;
31165
+ header?: never;
31166
+ path?: never;
31167
+ cookie?: never;
31168
+ };
31169
+ requestBody?: never;
31170
+ responses: {
31171
+ /** @description The tenant safety defaults, every limit profile and every budget row. */
31172
+ 200: {
31173
+ headers: {
31174
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
31175
+ RateLimit: components["headers"]["RateLimit"];
31176
+ [name: string]: unknown;
31177
+ };
31178
+ content: {
31179
+ "application/json": {
31180
+ /**
31181
+ * @description Response type discriminator.
31182
+ * @enum {string}
31183
+ */
31184
+ object?: "tenant_safety_policy";
31185
+ /**
31186
+ * @description The workspace-wide posture default every account in the tenant inherits, or null when none is set. Always present, and separate from `posture` on purpose: when this account overrides the tenant default, a change to the tenant default does not move `posture`, and this field is how you can still see it took effect.
31187
+ * @enum {string|null}
31188
+ */
31189
+ tenant_default_posture?: "warn" | "enforce" | null;
31190
+ /** @description One entry per limit profile, always all of them. */
31191
+ profiles?: {
31192
+ /**
31193
+ * @description The limit profile these defaults apply to. An account resolves from its own profile's defaults.
31194
+ * @enum {string}
31195
+ */
31196
+ limit_profile?: "basic" | "premium" | "sales_navigator" | "recruiter";
31197
+ /** @description Every budget row, always: the tenant default where one is set, the Curviate default otherwise. */
31198
+ rows?: {
31199
+ /** @description The counted-action row this policy governs. */
31200
+ budget_row?: string;
31201
+ /** @description What `enforce` refuses at and `warn` reports at, in the row's own unit. Null means the row is uncalibrated: Curviate has no figure for it. */
31202
+ ceiling?: number | null;
31203
+ /** @description Routine band. */
31204
+ green?: number | null;
31205
+ /** @description Warn-louder band. */
31206
+ amber?: number | null;
31207
+ /**
31208
+ * @description The calendar grain this row is counted in.
31209
+ * @enum {string}
31210
+ */
31211
+ window_kind?: "day" | "week" | "month";
31212
+ /** @description How many grain units one counting window spans. */
31213
+ window_span?: number;
31214
+ /** @description IANA zone name the counting window is aligned to. Null counts in UTC. */
31215
+ window_timezone?: string | null;
31216
+ /** @description Local HH:MM the activity window opens. */
31217
+ activity_window_start?: string;
31218
+ /** @description Local HH:MM the activity window closes. */
31219
+ activity_window_end?: string;
31220
+ /** @description IANA zone name the activity window is read in. Null disables the window entirely. */
31221
+ activity_window_timezone?: string | null;
31222
+ /**
31223
+ * @description What the activity window governs. `writes` (the default) covers live writes to LinkedIn; `all` widens it to live reads as well, which is the setting for a persona that should not be seen browsing at 03:00. It is broader than it sounds: `all` covers every live read, including the ones about the account itself, so a nightly analytics or invitation-backlog poll is refused at 03:00 too. A read Curviate answers from its own store never reaches LinkedIn, so it is never subject to the window under either setting, at any hour; the same read IS covered when the store cannot answer it, or when you ask for it live. Inbound events are never subject to it either. One action set to `all` reaches the whole account's live reads that spend no budget of their own (notifications, profile analytics, SSI, profile visitors, the invitation and saved-list listings): those calls debit no action type, so they have none to read this setting from and take the account-wide answer instead. Reads that DO debit an action type read that action type's own setting.
31224
+ * @enum {string}
31225
+ */
31226
+ activity_window_applies_to?: "writes" | "all";
31227
+ /** @description The tenant default multiplier for this row, or null when none is set. Null means each account follows its own derived warm-up ramp; 1 pins every account on this profile out of it. */
31228
+ warm_up_factor?: number | null;
31229
+ /** @description Length cap on the row's free-text field, in characters. */
31230
+ character_cap?: number | null;
31231
+ /** @description Length cap on the row's subject line, in characters. */
31232
+ subject_character_cap?: number | null;
31233
+ /** @description Bound on a single query's result lines. Search rows only. */
31234
+ per_query_cap?: number | null;
31235
+ /**
31236
+ * @description How well calibrated this row's number is. `unseeded` means Curviate has no green, amber or ceiling figure for this row on this profile: the row is reported so nothing is silently missing, but nothing has calibrated it, so no value you set can be `over_default`.
31237
+ * @enum {string}
31238
+ */
31239
+ source_class?: "substrate" | "linkedin_official" | "practitioner" | "inferred" | "unseeded";
31240
+ /** @description What a call through the matching ELEVATED interface is held to on this row: the `/v1/{account_id}/sales-navigator/...` and `/v1/{account_id}/recruiter/...` operations. Null when this row and limit profile have no such figure, which is every row on `basic` and `premium` and most rows everywhere. Everything else on this row (`ceiling`, `effective_ceiling`, `band` and `over_default`) is the STANDARD-interface figure, because one counter serves both interfaces and the standard side is the conservative one to band against. The consequence is worth reading: on a `sales_navigator` or `recruiter` account a row can report `band: "over"` with `posture: "enforce"` while a call through the elevated interface still succeeds; the refusal the band predicts is the one a standard call gets. */
31241
+ interface_ceiling?: number | null;
31242
+ /** @description Empty when nothing on this row is above default. Computed against the STANDARD-interface default, like `band` and for the same reason. */
31243
+ over_default?: {
31244
+ /**
31245
+ * @description The field whose configured value is above default.
31246
+ * @enum {string}
31247
+ */
31248
+ field?: "ceiling" | "green" | "amber" | "character_cap" | "subject_character_cap" | "per_query_cap";
31249
+ /** @description The configured value. */
31250
+ value?: number;
31251
+ /** @description The Curviate default it exceeds. */
31252
+ default?: number;
31253
+ /**
31254
+ * @description How well calibrated the DEFAULT is. `substrate` and `linkedin_official` are published figures; `practitioner` is corroborated operator experience; `inferred` is our own reasoning; `unseeded` means we have no figure at all for that row, in which case there is nothing to be above and no entry appears. Read this before deciding whether being above default matters.
31255
+ * @enum {string}
31256
+ */
31257
+ source_class?: "substrate" | "linkedin_official" | "practitioner" | "inferred" | "unseeded";
31258
+ }[];
31259
+ }[];
31260
+ }[];
31261
+ safety_warning?: components["schemas"]["SafetyWarning"];
31262
+ };
31263
+ };
31264
+ };
31265
+ /** @description Rate limited, slow down and retry after the hinted delay. */
31266
+ 429: {
31267
+ headers: {
31268
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
31269
+ RateLimit: components["headers"]["RateLimit"];
31270
+ "Retry-After": components["headers"]["Retry-After"];
31271
+ [name: string]: unknown;
31272
+ };
31273
+ content: {
31274
+ "application/json": components["schemas"]["Error"];
31275
+ };
31276
+ };
31277
+ };
31278
+ };
31279
+ patchV1SafetyPolicy: {
31280
+ parameters: {
31281
+ query?: never;
31282
+ header?: never;
31283
+ path?: never;
31284
+ cookie?: never;
31285
+ };
31286
+ requestBody: {
31287
+ content: {
31288
+ "application/json": {
31289
+ /**
31290
+ * @description The tenant-wide posture default every account inherits unless it overrides it. Null clears it back to `warn`.
31291
+ * @enum {string|null}
31292
+ */
31293
+ tenant_default_posture?: "warn" | "enforce" | null;
31294
+ /** @description Tenant defaults, per limit profile. */
31295
+ profiles?: {
31296
+ /**
31297
+ * @description The limit profile these defaults apply to. An account resolves from the defaults of its own `limit_profile` only.
31298
+ * @enum {string}
31299
+ */
31300
+ limit_profile: "basic" | "premium" | "sales_navigator" | "recruiter";
31301
+ /** @description Per-row defaults for this profile. Omit a field to leave it; `null` clears the tenant default back to the Curviate default. A row read back from this document may be sent unchanged. */
31302
+ rows: {
31303
+ /**
31304
+ * @description The budget row this patch configures.
31305
+ * @enum {string}
31306
+ */
31307
+ budget_row: "connection_requests_with_note" | "connection_requests_no_note" | "messages_first_degree" | "inmail" | "open_profile_inmail" | "profile_views" | "search" | "comments" | "post_likes" | "follows" | "content_poll" | "job_poll" | "posts" | "endorsements" | "invite_responses" | "withdrawal_sweep" | "total_actions" | "pending_invites";
31308
+ /** @description What `enforce` refuses at and `warn` reports at, in this row's own unit. Any value up to 9007199254740991 is accepted and stored verbatim; a value above the Curviate default is reported back, never clamped. */
31309
+ ceiling?: number | null;
31310
+ /** @description Routine band. Activity at or below it is unremarkable. */
31311
+ green?: number | null;
31312
+ /** @description Warn-louder band, between green and the ceiling. */
31313
+ amber?: number | null;
31314
+ /**
31315
+ * @description The calendar grain this row is counted in.
31316
+ * @enum {string|null}
31317
+ */
31318
+ window_kind?: "day" | "week" | "month" | null;
31319
+ /** @description How many `window_kind` units one counting window spans. */
31320
+ window_span?: number | null;
31321
+ /** @description IANA zone name the counting window is aligned to, e.g. `Europe/Berlin` or `UTC`. Must be a real zone; anything else is a 400. Null counts in UTC. */
31322
+ window_timezone?: string | null;
31323
+ /** @description Local time the activity window opens, HH:MM. Outside the window, live write operations are reported or refused per posture. */
31324
+ activity_window_start?: string | null;
31325
+ /** @description Local time the activity window closes, HH:MM. */
31326
+ activity_window_end?: string | null;
31327
+ /** @description IANA zone name the activity window is read in, e.g. `Europe/Berlin`. Must be a real zone; anything else is a 400. Null DISABLES the activity window: a guessed zone inverts it, which is worse than not having one. */
31328
+ activity_window_timezone?: string | null;
31329
+ /**
31330
+ * @description What the activity window governs. `writes` (the default) covers live writes to LinkedIn; `all` widens it to live reads. A read Curviate answers from its own store never reaches LinkedIn and so is never covered; the same read IS covered when the store cannot answer it, or when you ask for it live. Stored reads and inbound events are never subject to the window under either setting, at any hour. One action set to `all` reaches the whole account's live reads that spend no budget of their own (notifications, profile analytics, SSI, profile visitors, the invitation and saved-list listings): those calls debit no action type, so they have none to read this setting from and take the account-wide answer instead. Reads that DO debit an action type read that action type's own setting.
31331
+ * @enum {string|null}
31332
+ */
31333
+ activity_window_applies_to?: "writes" | "all" | null;
31334
+ /** @description Multiplier applied to this row's ceiling while ramping. 1 is not ramping. */
31335
+ warm_up_factor?: number | null;
31336
+ /** @description Length cap on this row's free-text field, in characters (an invitation note, an InMail body). */
31337
+ character_cap?: number | null;
31338
+ /** @description Length cap on this row's subject line, in characters. */
31339
+ subject_character_cap?: number | null;
31340
+ /** @description Bound on a single query's result lines. Search rows only. */
31341
+ per_query_cap?: number | null;
31342
+ /**
31343
+ * @description How well calibrated this row's configured number is. Overriding it labels your own figure; the over-default warning always reports the class of the Curviate default.
31344
+ * @enum {string|null}
31345
+ */
31346
+ 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. */
31348
+ interface_ceiling?: unknown;
31349
+ /** @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
+ over_default?: unknown;
31351
+ }[];
31352
+ }[];
31353
+ /** @description READ-ONLY. The document's type discriminator. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
31354
+ object?: unknown;
31355
+ /** @description READ-ONLY. What the last write changed across the tenant's accounts. Sent back on a write it is accepted and ignored, so the whole document round-trips; it is never stored and never ledgered. */
31356
+ impact?: unknown;
31357
+ };
31358
+ };
31359
+ };
31360
+ responses: {
31361
+ /** @description The tenant safety defaults as they now read, plus the `impact` of this write. */
31362
+ 200: {
31363
+ headers: {
31364
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
31365
+ RateLimit: components["headers"]["RateLimit"];
31366
+ [name: string]: unknown;
31367
+ };
31368
+ content: {
31369
+ "application/json": {
31370
+ /**
31371
+ * @description Response type discriminator.
31372
+ * @enum {string}
31373
+ */
31374
+ object?: "tenant_safety_policy";
31375
+ /**
31376
+ * @description The workspace-wide posture default every account in the tenant inherits, or null when none is set. Always present, and separate from `posture` on purpose: when this account overrides the tenant default, a change to the tenant default does not move `posture`, and this field is how you can still see it took effect.
31377
+ * @enum {string|null}
31378
+ */
31379
+ tenant_default_posture?: "warn" | "enforce" | null;
31380
+ /** @description One entry per limit profile, always all of them. */
31381
+ profiles?: {
31382
+ /**
31383
+ * @description The limit profile these defaults apply to. An account resolves from its own profile's defaults.
31384
+ * @enum {string}
31385
+ */
31386
+ limit_profile?: "basic" | "premium" | "sales_navigator" | "recruiter";
31387
+ /** @description Every budget row, always: the tenant default where one is set, the Curviate default otherwise. */
31388
+ rows?: {
31389
+ /** @description The counted-action row this policy governs. */
31390
+ budget_row?: string;
31391
+ /** @description What `enforce` refuses at and `warn` reports at, in the row's own unit. Null means the row is uncalibrated: Curviate has no figure for it. */
31392
+ ceiling?: number | null;
31393
+ /** @description Routine band. */
31394
+ green?: number | null;
31395
+ /** @description Warn-louder band. */
31396
+ amber?: number | null;
31397
+ /**
31398
+ * @description The calendar grain this row is counted in.
31399
+ * @enum {string}
31400
+ */
31401
+ window_kind?: "day" | "week" | "month";
31402
+ /** @description How many grain units one counting window spans. */
31403
+ window_span?: number;
31404
+ /** @description IANA zone name the counting window is aligned to. Null counts in UTC. */
31405
+ window_timezone?: string | null;
31406
+ /** @description Local HH:MM the activity window opens. */
31407
+ activity_window_start?: string;
31408
+ /** @description Local HH:MM the activity window closes. */
31409
+ activity_window_end?: string;
31410
+ /** @description IANA zone name the activity window is read in. Null disables the window entirely. */
31411
+ activity_window_timezone?: string | null;
31412
+ /**
31413
+ * @description What the activity window governs. `writes` (the default) covers live writes to LinkedIn; `all` widens it to live reads as well, which is the setting for a persona that should not be seen browsing at 03:00. It is broader than it sounds: `all` covers every live read, including the ones about the account itself, so a nightly analytics or invitation-backlog poll is refused at 03:00 too. A read Curviate answers from its own store never reaches LinkedIn, so it is never subject to the window under either setting, at any hour; the same read IS covered when the store cannot answer it, or when you ask for it live. Inbound events are never subject to it either. One action set to `all` reaches the whole account's live reads that spend no budget of their own (notifications, profile analytics, SSI, profile visitors, the invitation and saved-list listings): those calls debit no action type, so they have none to read this setting from and take the account-wide answer instead. Reads that DO debit an action type read that action type's own setting.
31414
+ * @enum {string}
31415
+ */
31416
+ activity_window_applies_to?: "writes" | "all";
31417
+ /** @description The tenant default multiplier for this row, or null when none is set. Null means each account follows its own derived warm-up ramp; 1 pins every account on this profile out of it. */
31418
+ warm_up_factor?: number | null;
31419
+ /** @description Length cap on the row's free-text field, in characters. */
31420
+ character_cap?: number | null;
31421
+ /** @description Length cap on the row's subject line, in characters. */
31422
+ subject_character_cap?: number | null;
31423
+ /** @description Bound on a single query's result lines. Search rows only. */
31424
+ per_query_cap?: number | null;
31425
+ /**
31426
+ * @description How well calibrated this row's number is. `unseeded` means Curviate has no green, amber or ceiling figure for this row on this profile: the row is reported so nothing is silently missing, but nothing has calibrated it, so no value you set can be `over_default`.
31427
+ * @enum {string}
31428
+ */
31429
+ source_class?: "substrate" | "linkedin_official" | "practitioner" | "inferred" | "unseeded";
31430
+ /** @description What a call through the matching ELEVATED interface is held to on this row: the `/v1/{account_id}/sales-navigator/...` and `/v1/{account_id}/recruiter/...` operations. Null when this row and limit profile have no such figure, which is every row on `basic` and `premium` and most rows everywhere. Everything else on this row (`ceiling`, `effective_ceiling`, `band` and `over_default`) is the STANDARD-interface figure, because one counter serves both interfaces and the standard side is the conservative one to band against. The consequence is worth reading: on a `sales_navigator` or `recruiter` account a row can report `band: "over"` with `posture: "enforce"` while a call through the elevated interface still succeeds; the refusal the band predicts is the one a standard call gets. */
31431
+ interface_ceiling?: number | null;
31432
+ /** @description Empty when nothing on this row is above default. Computed against the STANDARD-interface default, like `band` and for the same reason. */
31433
+ over_default?: {
31434
+ /**
31435
+ * @description The field whose configured value is above default.
31436
+ * @enum {string}
31437
+ */
31438
+ field?: "ceiling" | "green" | "amber" | "character_cap" | "subject_character_cap" | "per_query_cap";
31439
+ /** @description The configured value. */
31440
+ value?: number;
31441
+ /** @description The Curviate default it exceeds. */
31442
+ default?: number;
31443
+ /**
31444
+ * @description How well calibrated the DEFAULT is. `substrate` and `linkedin_official` are published figures; `practitioner` is corroborated operator experience; `inferred` is our own reasoning; `unseeded` means we have no figure at all for that row, in which case there is nothing to be above and no entry appears. Read this before deciding whether being above default matters.
31445
+ * @enum {string}
31446
+ */
31447
+ source_class?: "substrate" | "linkedin_official" | "practitioner" | "inferred" | "unseeded";
31448
+ }[];
31449
+ }[];
31450
+ }[];
31451
+ /** @description What this write changed across the tenant's accounts, measured on them before and after it applied. */
31452
+ impact?: {
31453
+ /** @description Accounts on which at least one budget row's resolved ceiling changed. */
31454
+ accounts_affected?: number;
31455
+ /** @description Accounts on which at least one budget row moved into `band: "over"`. */
31456
+ accounts_moved_into_over?: number;
31457
+ };
31458
+ safety_warning?: components["schemas"]["SafetyWarning"];
31459
+ };
31460
+ };
31461
+ };
31462
+ /** @description INVALID_REQUEST. An unknown limit profile, row name or field, or a value that is not a value (a negative ceiling). A value is never rejected for being unsafe. */
31463
+ 400: {
31464
+ headers: {
31465
+ [name: string]: unknown;
31466
+ };
31467
+ content: {
31468
+ "application/json": components["schemas"]["Error"];
31469
+ };
31470
+ };
31471
+ /** @description Payload too large, the request body exceeds the size limit. */
31472
+ 413: {
31473
+ headers: {
31474
+ [name: string]: unknown;
31475
+ };
31476
+ content: {
31477
+ "application/json": components["schemas"]["Error"];
31478
+ };
31479
+ };
31480
+ /** @description Rate limited, slow down and retry after the hinted delay. */
31481
+ 429: {
31482
+ headers: {
31483
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
31484
+ RateLimit: components["headers"]["RateLimit"];
31485
+ "Retry-After": components["headers"]["Retry-After"];
31486
+ [name: string]: unknown;
31487
+ };
31488
+ content: {
31489
+ "application/json": components["schemas"]["Error"];
31490
+ };
31491
+ };
31492
+ };
31493
+ };
31045
31494
  }
31046
31495
 
31047
31496
  /**
31048
- * Accounts resource: connected-account management (4 methods, root-scoped).
31497
+ * Accounts resource: connected-account management (5 methods, root-scoped).
31049
31498
  *
31050
31499
  * Pattern followed by all resource namespaces:
31051
31500
  * - take a {@link RequestContext} in the constructor,
@@ -31067,6 +31516,8 @@ interface operations {
31067
31516
  type AccountListPage = paths["/v1/accounts"]["get"]["responses"]["200"]["content"]["application/json"];
31068
31517
  /** `GET /v1/accounts` query params. */
31069
31518
  type AccountListParams = NonNullable<paths["/v1/accounts"]["get"]["parameters"]["query"]>;
31519
+ /** `GET /v1/accounts/seats` 200 body, the workspace's live seats with their occupancy. */
31520
+ type SeatList = paths["/v1/accounts/seats"]["get"]["responses"]["200"]["content"]["application/json"];
31070
31521
  /** `GET /v1/accounts/{account_id}` 200 body. */
31071
31522
  type AccountDetail = paths["/v1/accounts/{account_id}"]["get"]["responses"]["200"]["content"]["application/json"];
31072
31523
  /** `PATCH /v1/accounts/{account_id}` request body. */
@@ -31094,6 +31545,26 @@ declare class AccountsResource {
31094
31545
  * for (const acc of page.items ?? []) console.log(acc.account_id);
31095
31546
  */
31096
31547
  list(params?: AccountListParams): Promise<AccountListPage>;
31548
+ /**
31549
+ * List the workspace's live seats: each `seat_id`, whether an account
31550
+ * `occupied` it, and that `account_id` (`null` when free). Not paginated.
31551
+ *
31552
+ * Only live seats are listed, and an empty seat is listed only when
31553
+ * connecting an account to it would be accepted right now. So an empty seat
31554
+ * that is provisional, cancelling, on an ended trial, or blocked by billing
31555
+ * does not appear, and `items` can be `[]` even though the workspace has
31556
+ * seats. Any seat with `occupied: false` is a valid `seat_id` for connecting
31557
+ * a new account with `auth.intent`. Carries no billing fields.
31558
+ *
31559
+ * @returns `{ object: "seat_list", items: { seat_id, occupied, account_id }[] }`.
31560
+ *
31561
+ * @example
31562
+ * const { items } = await curviate.accounts.listSeats();
31563
+ * const free = items.find((seat) => !seat.occupied);
31564
+ * if (!free) throw new Error("No seat is free to connect to right now (add a seat, or check billing).");
31565
+ * await curviate.auth.intent({ seat_id: free.seat_id, auth_method: "cookie", cookie: { li_at }, user_agent });
31566
+ */
31567
+ listSeats(): Promise<SeatList>;
31097
31568
  /**
31098
31569
  * Return metadata and current state for one connected account, including the
31099
31570
  * central `quotas[]` account-safety view, `account_states[]` and `seat_id`
@@ -31192,7 +31663,8 @@ declare class AuthResource {
31192
31663
  /**
31193
31664
  * Authenticate a LinkedIn account with credentials or a session cookie.
31194
31665
  *
31195
- * Omit `account_id` to connect a NEW account into an empty seat; include it
31666
+ * Omit `account_id` to connect a NEW account into an empty seat (find one
31667
+ * with `accounts.listSeats()`: any seat with `occupied: false`); include it
31196
31668
  * to re-authenticate an EXISTING account in place. Returns the account on
31197
31669
  * success (200 re-authenticated in place / 201 new), or a checkpoint
31198
31670
  * challenge (202) when LinkedIn requires verification; resolve it with
@@ -33381,13 +33853,13 @@ declare class Curviate {
33381
33853
  *
33382
33854
  * So a retirement is two steps. First `@deprecated`, kept exported, with the
33383
33855
  * replacement named. Then removed, in the first release after every deployment
33384
- * carries the new contract. `TIER_NOT_ACTIVE` and `PREMIUM_CONFLICT` are at
33385
- * step one as of 0.30.0.
33856
+ * carries the new contract. `TIER_NOT_ACTIVE` and `PREMIUM_CONFLICT` took step
33857
+ * one in 0.30.0 and step two in 0.31.0.
33386
33858
  *
33387
33859
  * A code the API NEVER emitted is a different case and goes immediately, since
33388
33860
  * no deployment can be sending it: `RATE_LIMITED` went that way in 0.30.0.
33389
33861
  */
33390
- declare const ERROR_CODES: readonly ["UNAUTHORIZED", "INVALID_REQUEST", "UNSUPPORTED_MEDIA_TYPE", "PAYLOAD_TOO_LARGE", "ACCOUNT_NOT_FOUND", "ACCOUNT_RESTRICTED", "ACCOUNT_ALREADY_LINKED", "RESOURCE_NOT_FOUND", "NOT_STORED", "RESOURCE_ACCESS_RESTRICTED", "FILTER_CANDIDATES_REQUIRED", "NO_ACTIVE_SEAT", "LINKEDIN_FEATURE_NOT_SUBSCRIBED", "BETA_NOT_ENABLED", "TIER_NOT_ACTIVE", "RATE_LIMIT_ACCOUNT", "RATE_LIMIT_TENANT", "PLATFORM_RATE_LIMIT", "BUDGET_EXHAUSTED", "PLATFORM_ERROR", "PLATFORM_NOT_IMPLEMENTED", "LINKEDIN_OPERATION_NOT_SUPPORTED", "CHECKPOINT_NOT_FOUND", "CHECKPOINT_EXPIRED", "CHECKPOINT_INVALID_CODE", "CHECKPOINT_MAX_ATTEMPTS", "CHECKPOINT_ALREADY_RESOLVED", "CHECKPOINT_UNSUPPORTED", "CONNECTION_IN_PROGRESS", "PREMIUM_CONFLICT", "REAUTH_REQUIRED", "LINKEDIN_AUTH_FAILED", "LINKEDIN_SESSION_EVICTED", "LINKEDIN_RATE_LIMITED", "LINKEDIN_COOKIE_INVALID", "LINKEDIN_SERVICE_UNAVAILABLE", "MESSAGE_WINDOW_EXPIRED", "RECIPIENT_UNREACHABLE", "CONNECTION_REQUEST_CONFLICT", "PAYMENT_REQUIRED", "PAYMENT_FAILED", "SUBSCRIPTION_BUSY", "SUBSCRIPTION_NOT_FOUND", "SEAT_NOT_FOUND", "SEAT_CANCELLED", "NOT_FOUND", "REACTION_NOT_FOUND", "SUBSTRATE_LINK_FAILED", "SUBSTRATE_CAP_REACHED", "BILLING_CHECKOUT_FAILED", "BILLING_PORTAL_UNAVAILABLE", "ACCOUNT_DISPUTED", "ACCOUNT_LINKING_DISABLED", "PERIOD_LOCKED", "SEAT_NOT_EMPTY", "SEAT_PROVISIONAL", "SUBSCRIPTION_ALREADY_EXISTS", "ALREADY_CANCELLED", "CANCELLATION_ALREADY_EFFECTIVE", "INVALID_CANCELLATION_SOURCE", "TRIAL_EXPIRED", "TRIAL_SEAT_LIMIT", "TRIAL_ACTIVE_SEAT_LIMIT", "TRIAL_IDENTITY_ALREADY_USED", "TRIAL_IDENTITY_UNRESOLVED", "ADMIN_BYPASS", "INTERNAL"];
33862
+ declare const ERROR_CODES: readonly ["UNAUTHORIZED", "INVALID_REQUEST", "UNSUPPORTED_MEDIA_TYPE", "PAYLOAD_TOO_LARGE", "ACCOUNT_NOT_FOUND", "ACCOUNT_RESTRICTED", "ACCOUNT_ALREADY_LINKED", "RESOURCE_NOT_FOUND", "NOT_STORED", "RESOURCE_ACCESS_RESTRICTED", "FILTER_CANDIDATES_REQUIRED", "NO_ACTIVE_SEAT", "LINKEDIN_FEATURE_NOT_SUBSCRIBED", "BETA_NOT_ENABLED", "RATE_LIMIT_ACCOUNT", "RATE_LIMIT_TENANT", "PLATFORM_RATE_LIMIT", "BUDGET_EXHAUSTED", "PLATFORM_ERROR", "PLATFORM_NOT_IMPLEMENTED", "LINKEDIN_OPERATION_NOT_SUPPORTED", "CHECKPOINT_NOT_FOUND", "CHECKPOINT_EXPIRED", "CHECKPOINT_INVALID_CODE", "CHECKPOINT_MAX_ATTEMPTS", "CHECKPOINT_ALREADY_RESOLVED", "CHECKPOINT_UNSUPPORTED", "CONNECTION_IN_PROGRESS", "REAUTH_REQUIRED", "LINKEDIN_AUTH_FAILED", "LINKEDIN_SESSION_EVICTED", "LINKEDIN_RATE_LIMITED", "LINKEDIN_COOKIE_INVALID", "LINKEDIN_SERVICE_UNAVAILABLE", "MESSAGE_WINDOW_EXPIRED", "RECIPIENT_UNREACHABLE", "CONNECTION_REQUEST_CONFLICT", "PAYMENT_REQUIRED", "PAYMENT_FAILED", "SUBSCRIPTION_BUSY", "SUBSCRIPTION_NOT_FOUND", "SEAT_NOT_FOUND", "SEAT_CANCELLED", "NOT_FOUND", "REACTION_NOT_FOUND", "SUBSTRATE_LINK_FAILED", "SUBSTRATE_CAP_REACHED", "BILLING_CHECKOUT_FAILED", "BILLING_PORTAL_UNAVAILABLE", "ACCOUNT_DISPUTED", "ACCOUNT_LINKING_DISABLED", "PERIOD_LOCKED", "SEAT_NOT_EMPTY", "SEAT_PROVISIONAL", "SUBSCRIPTION_ALREADY_EXISTS", "ALREADY_CANCELLED", "CANCELLATION_ALREADY_EFFECTIVE", "INVALID_CANCELLATION_SOURCE", "TRIAL_EXPIRED", "TRIAL_SEAT_LIMIT", "TRIAL_ACTIVE_SEAT_LIMIT", "TRIAL_IDENTITY_ALREADY_USED", "TRIAL_IDENTITY_UNRESOLVED", "ADMIN_BYPASS", "STRIPE_DRIFT_DETECTED", "INTERNAL"];
33391
33863
  /**
33392
33864
  * The complete set of error codes observable by API callers.
33393
33865
  *
@@ -33843,4 +34315,4 @@ interface ConstructEventOptions {
33843
34315
  */
33844
34316
  declare function constructEvent(rawBody: string | Buffer, signatureHeader: string, secret: string, opts?: ConstructEventOptions): Promise<CurviateEvent>;
33845
34317
 
33846
- export { type AccountListPage, type AccountListParams, type AccountPayload, type AccountScopedNamespaces, type ConnectionPayload, type ConstructEventOptions, Curviate, type CurviateConfig, CurviateError, type CurviateErrorInit, type CurviateErrorJSON, type CurviateEvent, type CurviateEventEnvelope, ERROR_CODES, type ErrorCode, type EventPayloadBase, type MessagePayload, type ResolvedConfig, type ResourceNamespaces, type RetryHint, type SafetyHint, type SafetyReason, WebhookSignatureError, type components, constructEvent, isCurviateError, type operations, type paths };
34318
+ export { type AccountListPage, type AccountListParams, type AccountPayload, type AccountScopedNamespaces, type ConnectionPayload, type ConstructEventOptions, Curviate, type CurviateConfig, CurviateError, type CurviateErrorInit, type CurviateErrorJSON, type CurviateEvent, type CurviateEventEnvelope, ERROR_CODES, type ErrorCode, type EventPayloadBase, type MessagePayload, type ResolvedConfig, type ResourceNamespaces, type RetryHint, type SafetyHint, type SafetyReason, type SeatList, WebhookSignatureError, type components, constructEvent, isCurviateError, type operations, type paths };