@cavuno/board 1.43.0 → 2.0.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.
@@ -63,15 +63,6 @@ interface components {
63
63
  AddCategoryAliasesBody: {
64
64
  aliases: string[];
65
65
  };
66
- AddForagerCompanyBody: {
67
- companyUrl: string;
68
- companyName: string;
69
- description?: string | null;
70
- };
71
- AddForagerExclusionBody: {
72
- pattern: string;
73
- type: string;
74
- };
75
66
  AddMarketAliasesBody: {
76
67
  aliases: string[];
77
68
  };
@@ -111,24 +102,24 @@ interface components {
111
102
  price: components["schemas"]["PlanPrice"];
112
103
  features: components["schemas"]["PlanFeature"][];
113
104
  };
114
- AiUsage: {
105
+ AdminSalesLedPlan: {
106
+ /** @description Cavuno salesLedEmployerPlans ID. */
115
107
  id: string;
116
108
  /** @enum {string} */
117
- object: "ai_usage";
118
- /** @description The UTC day these counts are for (YYYY-MM-DD). */
119
- date: string;
120
- /** @description ISO timestamp of the next UTC-midnight counter reset. */
121
- resetAt: string;
122
- features: components["schemas"]["AiUsageFeature"][];
123
- };
124
- AiUsageFeature: {
125
- feature: string;
126
- used: number;
127
- limit: number;
128
- remaining: number;
109
+ object: "sales_led_plan";
110
+ name: string;
111
+ description: string;
112
+ priceText: string;
113
+ ctaText: string;
114
+ ctaDestination: string;
115
+ featuredBullets: string[];
116
+ isPublic: boolean;
117
+ displayOrder: number;
118
+ /** @description ISO-8601 creation timestamp. */
119
+ createdAt: string;
129
120
  };
130
121
  Alert: {
131
- /** @description Job-alert preference ID also the path key. */
122
+ /** @description Job-alert preference ID. Also the path key. */
132
123
  id: string;
133
124
  /** @enum {string} */
134
125
  object: "alert";
@@ -163,33 +154,92 @@ interface components {
163
154
  salaryMax?: number | null;
164
155
  salaryCurrency?: string | null;
165
156
  };
166
- ApiKey: {
167
- /** @description Unique identifier for the object. */
168
- id: string;
169
- /**
170
- * @description String representing the object's type. Objects of the same type share the same value.
171
- * @enum {string}
172
- */
173
- object: "api_key";
174
- /** @description Public key ID component, embedded in the key prefix as `cavuno_live_<keyId>_`. */
175
- keyId: string;
176
- /** @description Human-readable name for the key, shown in the dashboard. */
177
- name: string;
178
- /** @description Public prefix in the form `cavuno_live_<keyId>_`. Safe to log; the full plaintext secret is never returned by the API. */
179
- prefix: string;
180
- /** @description Time at which the key was created. Unix epoch in milliseconds. */
181
- createdAt: number;
182
- /** @description Identifier of the user who minted the key. */
183
- createdBy: string;
184
- /** @description Time at which the key was last used to authenticate a request, or `null` if it has never been used. Unix epoch in milliseconds. */
185
- lastUsedAt: number | null;
186
- /** @description Time at which the key was revoked, or `null` if the key is still active. Unix epoch in milliseconds. */
187
- revokedAt: number | null;
188
- /** @description Time at which the key expires, or `null` if the key has no expiry. Unix epoch in milliseconds. */
189
- expiresAt: number | null;
157
+ AnalyticsChange: {
158
+ absolute: number;
159
+ /** @description Null when both periods are zero (undefined percent change). */
160
+ percentage: number | null;
161
+ };
162
+ AnalyticsDateRange: {
163
+ /** @description UTC date-only YYYY-MM-DD. */
164
+ start: string;
165
+ /** @description UTC date-only YYYY-MM-DD. */
166
+ end: string;
167
+ };
168
+ AnalyticsMetric: {
169
+ /** @enum {string} */
170
+ key: "sessions" | "page_views" | "average_session_duration" | "job_apply_clicks" | "impressions" | "stripe_revenue" | "adsense_revenue";
171
+ /** @enum {string} */
172
+ unit: "count" | "seconds" | "currency";
173
+ /** @description ISO currency code in lowercase when unit is currency. */
174
+ currency?: string;
175
+ current: {
176
+ total: number;
177
+ change: components["schemas"]["AnalyticsChange"];
178
+ points: components["schemas"]["AnalyticsTrendPoint"][];
179
+ };
180
+ previous: {
181
+ total: number;
182
+ points: components["schemas"]["AnalyticsTrendPoint"][];
183
+ };
184
+ /** @description Latest available day for lagging providers (GSC/AdSense) when the window tail is incomplete. */
185
+ dataAvailableThrough?: string;
186
+ };
187
+ AnalyticsOverview: {
188
+ /** @enum {string} */
189
+ object: "analytics_overview";
190
+ range: components["schemas"]["AnalyticsDateRange"];
191
+ comparisonRange: components["schemas"]["AnalyticsDateRange"];
192
+ /** @description Realtime visitors on the board right now. */
193
+ currentVisitors: number;
194
+ metrics: components["schemas"]["AnalyticsMetric"][];
195
+ };
196
+ AnalyticsTraffic: {
197
+ /** @enum {string} */
198
+ object: "analytics_traffic";
199
+ range: components["schemas"]["AnalyticsTrafficDateRange"];
200
+ pages: components["schemas"]["AnalyticsTrafficPage"][];
201
+ sources: components["schemas"]["AnalyticsTrafficSource"][];
202
+ locations: components["schemas"]["AnalyticsTrafficLocation"][];
203
+ devices: components["schemas"]["AnalyticsTrafficDevice"][];
204
+ };
205
+ AnalyticsTrafficDateRange: {
206
+ /** @description UTC date-only YYYY-MM-DD. */
207
+ start: string;
208
+ /** @description UTC date-only YYYY-MM-DD. */
209
+ end: string;
210
+ };
211
+ AnalyticsTrafficDevice: {
212
+ device: string;
213
+ visits: number;
214
+ visitsChangePercentage: number | null;
215
+ applyClicks: number;
216
+ };
217
+ AnalyticsTrafficLocation: {
218
+ countryCode: string;
219
+ visits: number;
220
+ visitsChangePercentage: number | null;
221
+ applyClicks: number;
222
+ };
223
+ AnalyticsTrafficPage: {
224
+ pathname: string;
225
+ visits: number;
226
+ visitsChangePercentage: number | null;
227
+ };
228
+ AnalyticsTrafficSource: {
229
+ /** @description Normalized referrer source (never a full URL). */
230
+ source: string;
231
+ visits: number;
232
+ visitsChangePercentage: number | null;
233
+ applyClicks: number;
234
+ };
235
+ AnalyticsTrendPoint: {
236
+ /** @description UTC date-only YYYY-MM-DD. */
237
+ date: string;
238
+ /** @description Metric value for the day, or null when a lagging provider has not reported yet. */
239
+ value: number | null;
190
240
  };
191
241
  Application: {
192
- /** @description Application ID the `:applicationId` path key. */
242
+ /** @description Application ID. Also the `:applicationId` path key. */
193
243
  id: string;
194
244
  /** @enum {string} */
195
245
  object: "application";
@@ -226,58 +276,71 @@ interface components {
226
276
  /** @description Optional intended role for the approved employer, recorded in the audit log. Not yet persisted (companyMembers has no role field). */
227
277
  role?: string;
228
278
  };
229
- AuditLogEntry: {
230
- /** @description Unique identifier for the object. */
279
+ BackfillBulkItemResult: {
280
+ companyId: string;
281
+ /** @enum {string} */
282
+ status: "ok" | "error";
283
+ error?: {
284
+ code: string;
285
+ message: string;
286
+ };
287
+ };
288
+ BackfillBulkResult: {
289
+ /** @enum {string} */
290
+ object: "backfill_bulk_result";
291
+ data: components["schemas"]["BackfillBulkItemResult"][];
292
+ };
293
+ BackfillCompany: {
294
+ /** @enum {string} */
295
+ object: "backfill_company";
296
+ companyId: string;
297
+ name: string;
298
+ website: string | null;
299
+ /** @enum {string} */
300
+ state: "backfilling" | "available" | "needs_match" | "not_backfilling";
301
+ candidates?: components["schemas"]["BackfillMatchCandidate"][];
302
+ };
303
+ BackfillMatchCandidate: {
304
+ index: number;
305
+ name: string;
306
+ website: string | null;
307
+ };
308
+ BackfillProgress: {
309
+ /** @enum {string} */
310
+ object: "backfill_progress";
311
+ /** @enum {string} */
312
+ status: "pending" | "syncing" | "enqueuing" | "enhancing" | "succeeded" | "failed";
313
+ jobsMatched: number;
314
+ jobsToEnhance: number;
315
+ jobsEnhanced: number;
316
+ jobsFailed: number;
317
+ } | null;
318
+ BackfillRule: {
319
+ /** @description Stable Cavuno-owned resource ID. */
231
320
  id: string;
232
- /**
233
- * @description String representing the object's type. Objects of the same type share the same value.
234
- * @enum {string}
235
- */
236
- object: "audit_log";
237
- /** @description Identifier of the account the entry belongs to. */
238
- accountId: string;
239
- /**
240
- * @description Type of actor that performed the action.
241
- * @enum {string}
242
- */
243
- actorType: "api_key" | "oauth_token" | "user_session" | "system";
244
- /** @description Identifier of the actor that performed the action. */
245
- actorId: string;
246
- /** @description Human-readable label for the actor, suitable for display. */
247
- actorLabel: string;
248
- /** @description Action that was performed (e.g. `jobs.create`, `companies.update`). */
249
- action: string;
250
- /** @description Type of resource the action was performed on. */
251
- resourceType: string;
252
- /** @description Identifier of the resource the action was performed on, or `null` for resource-less actions. */
253
- resourceId: string | null;
254
- /** @description Serialized JSON snapshot of the resource before the action, or `null` for create actions. */
255
- before: string | null;
256
- /** @description Serialized JSON snapshot of the resource after the action, or `null` for delete actions. */
257
- after: string | null;
258
- /** @description Serialized JSON of free-form metadata about the action (e.g. truncation byte sizes), or `null` if none was attached. */
259
- metadata: string | null;
260
- /** @description IP address the request originated from, or `null` if unavailable. */
261
- ipAddress: string | null;
262
- /** @description User-agent string from the request, or `null` if unavailable. */
263
- userAgent: string | null;
264
- /** @description Identifier of the request that produced the entry. Use this to correlate with platform logs. */
265
- requestId: string;
266
- /** @description Time at which the audit entry was written. Unix epoch in milliseconds. */
267
- timestamp: number;
268
- };
269
- BatchForagerCompaniesBody: {
270
- /** @enum {string} */
271
- mode: "add";
272
- companies: {
273
- url: string;
274
- name: string;
275
- }[];
276
- description?: string | null;
277
- } | {
278
321
  /** @enum {string} */
279
- mode: "remove";
280
- companyUrls: string[];
322
+ object: "backfill_rule";
323
+ name: string;
324
+ rules: {
325
+ /** @enum {string} */
326
+ match: "any" | "all";
327
+ conditions: {
328
+ /** @enum {string} */
329
+ field: "title" | "description";
330
+ /** @enum {string} */
331
+ operator: "contains_any" | "contains_all" | "is_not";
332
+ terms: string[];
333
+ }[];
334
+ }[];
335
+ filters: {
336
+ countries?: string[];
337
+ subdivisions?: string[];
338
+ seniorities?: string[];
339
+ employmentTypes?: string[];
340
+ workplaceTypes?: string[];
341
+ };
342
+ createdAt: string | null;
343
+ updatedAt: string | null;
281
344
  };
282
345
  BatchRequestBody: {
283
346
  /** @description Array of sub-operations to execute. Each entry runs independently and reports its result on the corresponding entry of the response `data` array. Sub-operation `id` values must be unique within the batch. Up to 100 entries. */
@@ -307,11 +370,9 @@ interface components {
307
370
  funding: components["schemas"]["BillingHostedCheckoutFunding"];
308
371
  /**
309
372
  * Format: uri
310
- * @description Hosted Stripe Checkout Session URL.
373
+ * @description Short-lived hosted checkout URL.
311
374
  */
312
375
  url: string;
313
- /** @description Stripe Checkout Session id (cs_…). */
314
- sessionId: string;
315
376
  /**
316
377
  * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
317
378
  * @enum {string}
@@ -336,105 +397,58 @@ interface components {
336
397
  /** @enum {string} */
337
398
  object: "billing_connect";
338
399
  connected: boolean;
339
- stripeConnectAccountId: string | null;
340
- chargesEnabled: boolean;
400
+ acceptingPayments: boolean;
341
401
  payoutsEnabled: boolean;
342
402
  detailsSubmitted: boolean;
343
- requirements: components["schemas"]["BillingConnectRequirements"];
344
- };
345
- BillingConnectRequirements: {
346
- currentlyDue: string[];
347
- eventuallyDue: string[];
348
- pastDue: string[];
349
- disabledReason: string | null;
350
- /** @description Unix timestamp (seconds) from Stripe, or null. */
351
- currentDeadline: number | null;
352
- } | null;
353
- BillingEntitlements: {
354
- /** @enum {string} */
355
- object: "billing_entitlements";
356
- /** @description Platform plan slug, or 'unknown' when absent. */
357
- planKey: string;
358
- limits: components["schemas"]["BillingEntitlementsLimits"];
359
- /**
360
- * @description Whether the stored flat limits came from the plan defaults or a staff override.
361
- * @enum {string|null}
362
- */
363
- limitsSource: "plan" | "override" | null;
364
- };
365
- BillingEntitlementsLimits: {
366
- activeJobs: number | null;
367
- subscribers: number | null;
368
- teamSeats: number | null;
369
- canBePublic: boolean;
370
- canRemoveBranding: boolean;
371
- apiAccess: boolean;
403
+ actionRequired: boolean;
372
404
  };
373
405
  BillingHostedCheckoutFunding: {
374
406
  /** @enum {string} */
375
407
  type: "hosted_checkout";
376
408
  };
377
- BillingSavedPmFunding: {
378
- /** @enum {string} */
379
- type: "saved_pm";
380
- };
381
409
  BillingSubscription: {
382
410
  /** @enum {string} */
383
411
  object: "billing_subscription";
384
412
  active: boolean;
385
413
  status: string | null;
386
- planSlug: string | null;
387
- stripeSubscriptionId: string | null;
388
- stripeCustomerId: string | null;
414
+ planKey: string | null;
389
415
  /** @description Subscription period end as a millisecond epoch. */
390
416
  currentPeriodEnd: number | null;
391
417
  cancelAtPeriodEnd: boolean;
392
- items: components["schemas"]["BillingSubscriptionItem"][];
393
- };
394
- BillingSubscriptionItem: {
395
- stripePriceId: string;
396
- quantity: number;
397
- };
398
- BillingUpgrade: components["schemas"]["BillingUpgradeSavedPm"] | components["schemas"]["BillingUpgradeCheckoutRequired"];
399
- BillingUpgradeBody: {
400
- /**
401
- * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
402
- * @enum {string}
403
- */
404
- planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
405
- /**
406
- * @description Billing interval. Defaults to monthly when omitted.
407
- * @enum {string}
408
- */
409
- interval?: "monthly" | "annual";
418
+ capabilities: {
419
+ activeJobsLimit: number | null;
420
+ subscriberLimit: number | null;
421
+ teamSeatLimit: number | null;
422
+ canBePublic: boolean;
423
+ canRemoveBranding: boolean;
424
+ apiAccess: boolean;
425
+ };
410
426
  };
411
- BillingUpgradeCheckoutRequired: {
427
+ BillingUpgrade: {
412
428
  /** @enum {string} */
413
429
  object: "billing_upgrade";
414
430
  funding: components["schemas"]["BillingHostedCheckoutFunding"];
415
431
  /** @enum {string} */
416
- status: "checkout_required";
432
+ status: "human_action_required";
417
433
  /** Format: uri */
418
434
  url: string;
419
- sessionId: string;
420
435
  /**
421
436
  * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
422
437
  * @enum {string}
423
438
  */
424
439
  planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
425
440
  };
426
- BillingUpgradeSavedPm: {
427
- /** @enum {string} */
428
- object: "billing_upgrade";
429
- funding: components["schemas"]["BillingSavedPmFunding"];
430
- /** @enum {string} */
431
- status: "upgraded";
441
+ BillingUpgradeBody: {
432
442
  /**
433
443
  * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
434
444
  * @enum {string}
435
445
  */
436
446
  planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
437
- stripeSubscriptionId: string;
447
+ /**
448
+ * @description Billing interval. Defaults to monthly when omitted.
449
+ * @enum {string}
450
+ */
451
+ interval?: "monthly" | "annual";
438
452
  };
439
453
  Block: {
440
454
  /** @enum {string} */
@@ -650,18 +664,6 @@ interface components {
650
664
  BoardAuthVerifyEmailBody: {
651
665
  token: string;
652
666
  };
653
- BoardContentBody: {
654
- /** @description The board name. */
655
- boardName: string;
656
- /** @description Optional board description to steer the copy. */
657
- boardDescription?: string;
658
- };
659
- BoardRulesBody: {
660
- /** @description The board name. */
661
- boardName: string;
662
- /** @description Optional board description to steer the scraping rules. */
663
- boardDescription?: string;
664
- };
665
667
  BoardSeo: {
666
668
  /** @enum {string} */
667
669
  object: "board_seo";
@@ -691,16 +693,6 @@ interface components {
691
693
  themeColor: string;
692
694
  };
693
695
  };
694
- BoardThemeBody: {
695
- /** @description The board name. */
696
- boardName: string;
697
- /** @description Optional board description to steer the palette + fonts. */
698
- boardDescription?: string;
699
- };
700
- BoardToneBody: {
701
- /** @description The board name the AI tone/voice profile is generated from. */
702
- boardName: string;
703
- };
704
696
  BoardUser: {
705
697
  /** @description Board user ID. */
706
698
  id: string;
@@ -712,6 +704,10 @@ interface components {
712
704
  displayName: string | null;
713
705
  emailVerified: boolean;
714
706
  };
707
+ BulkBackfillCompaniesBody: {
708
+ /** @description Ordered Cavuno company IDs (max 100). Partial success is returned per item. */
709
+ companyIds: string[];
710
+ };
715
711
  BulkMoveApplicantsBody: {
716
712
  applicationIds: string[];
717
713
  /** @description The target stage id. */
@@ -805,6 +801,84 @@ interface components {
805
801
  name: string;
806
802
  proficiency: string;
807
803
  };
804
+ CandidatePaywall: {
805
+ /** @enum {string} */
806
+ object: "candidate_paywall";
807
+ enabled: boolean;
808
+ previewCount: number;
809
+ lockHeading: string;
810
+ lockDescription: string;
811
+ buttonText: string;
812
+ disclaimerText: string;
813
+ /** @description ISO 4217 currency code, lowercase (e.g. usd). */
814
+ currency: string;
815
+ perMonthLabel: string;
816
+ savingsTemplate: string;
817
+ offers: components["schemas"]["CandidatePaywallOffer"][];
818
+ };
819
+ CandidatePaywallOffer: {
820
+ /** @enum {string} */
821
+ key: "daily" | "weekly" | "monthly" | "quarterly" | "yearly" | "lifetime";
822
+ /** @enum {string} */
823
+ kind: "recurring" | "lifetime";
824
+ enabled: boolean;
825
+ amountCents: number;
826
+ label: string;
827
+ billingLabel: string;
828
+ isDefault: boolean;
829
+ displayOrder: number;
830
+ /** @enum {string|null} */
831
+ intervalUnit: "day" | "week" | "month" | "year" | null;
832
+ intervalCount: number | null;
833
+ };
834
+ CandidatePaywallSubscription: {
835
+ /** @description Cavuno candidate access grant ID. */
836
+ id: string;
837
+ /** @enum {string} */
838
+ object: "candidate_paywall_subscription";
839
+ /** @description Board user / Candidate Cavuno ID (boardUsers id). */
840
+ candidateId: string;
841
+ email: string;
842
+ displayName: string;
843
+ /** @enum {string} */
844
+ kind: "recurring" | "lifetime";
845
+ /**
846
+ * @description One of: daily, weekly, monthly, quarterly, yearly, lifetime.
847
+ * @enum {string}
848
+ */
849
+ offerKey: "daily" | "weekly" | "monthly" | "quarterly" | "yearly" | "lifetime";
850
+ /** @enum {string} */
851
+ status: "pending" | "active" | "trialing" | "expired" | "past_due" | "unpaid" | "incomplete" | "incomplete_expired" | "canceled";
852
+ amountCents: number;
853
+ /** @description ISO 4217 currency code, lowercase (e.g. usd). */
854
+ currency: string;
855
+ /**
856
+ * Format: date-time
857
+ * @description ISO-8601 or null.
858
+ */
859
+ currentPeriodStart: string | null;
860
+ /**
861
+ * Format: date-time
862
+ * @description ISO-8601 or null.
863
+ */
864
+ currentPeriodEnd: string | null;
865
+ cancelAtPeriodEnd: boolean;
866
+ /**
867
+ * Format: date-time
868
+ * @description ISO-8601 or null.
869
+ */
870
+ activatedAt: string | null;
871
+ /**
872
+ * Format: date-time
873
+ * @description ISO-8601 or null.
874
+ */
875
+ canceledAt: string | null;
876
+ /**
877
+ * Format: date-time
878
+ * @description ISO-8601 creation time.
879
+ */
880
+ createdAt: string;
881
+ };
808
882
  CandidateProfile: {
809
883
  id: string;
810
884
  /** @enum {string} */
@@ -823,10 +897,10 @@ interface components {
823
897
  jobSearchStatusVisibleTo: "everyone" | "employers_only";
824
898
  openToRelocate: boolean;
825
899
  };
826
- /** @description Signed Convex storage URL + metadata for the uploaded resume, or `null` when no resume is on file (or the storage blob is missing). Treat the URL as sensitive PII. */
900
+ /** @description Protected download path and metadata for the uploaded resume, or `null` when no resume is on file (or the storage blob is missing). */
827
901
  CandidateResumeFile: {
828
- /** @description Convex storage download URL for the candidate resume. Unguessable; treat as sensitive PII — it serves the candidate’s actual resume file. Short-lived: do not cache or store it; re-fetch the candidate to get a fresh URL. */
829
- url: string;
902
+ /** @description Stable, permission-protected Cavuno API path for downloading the candidate resume. */
903
+ downloadUrl: string;
830
904
  /** @description MIME type of the stored resume file. */
831
905
  contentType: string;
832
906
  /** @description Size of the resume file in bytes. */
@@ -858,15 +932,6 @@ interface components {
858
932
  slug: string;
859
933
  website: string | null;
860
934
  };
861
- CollectReportsBody: {
862
- /** @description Restrict collection to these providers. Omit to collect every enabled provider. */
863
- providers?: ("search_console" | "adsense" | "tinybird" | "stripe")[];
864
- /**
865
- * Format: date-time
866
- * @description Collect up to this end date (ISO-8601). Defaults to the current day.
867
- */
868
- endDate?: string;
869
- };
870
935
  CompaniesBatchRequest: {
871
936
  /** @description Array of sub-operations to execute. Each entry runs independently and reports its result on the corresponding entry of the response `data` array. Sub-operation `id` values must be unique within the batch. Up to 100 entries. */
872
937
  operations: ({
@@ -1136,11 +1201,8 @@ interface components {
1136
1201
  };
1137
1202
  };
1138
1203
  ConfirmImportBody: {
1139
- /** @description A first-time or revised mapping to persist. Omit to use the mapping already attached to the batch (fingerprint reuse). */
1204
+ /** @description A first-time or revised mapping review to persist. Omit it to accept the mapping already attached to this Import. */
1140
1205
  inlineMapping?: {
1141
- schemaFingerprint: string;
1142
- /** @enum {string} */
1143
- sourceFormat: "csv" | "xml";
1144
1206
  fieldMappings: {
1145
1207
  sourceColumn: string;
1146
1208
  targetField: string;
@@ -1235,8 +1297,8 @@ interface components {
1235
1297
  * @enum {string}
1236
1298
  */
1237
1299
  status?: "active" | "inactive";
1238
- /** @description Storage ID of an uploaded avatar image (from `POST /v1/media/upload`). Pass `null` to clear an existing avatar. */
1239
- avatarStorageId?: string | null;
1300
+ /** @description Cavuno media ID of an uploaded avatar image. Pass `null` to clear it. */
1301
+ avatarMediaId?: string | null;
1240
1302
  /** @description The author's personal website URL. Normalized to a canonical URL when stored. */
1241
1303
  websiteUrl?: string;
1242
1304
  /** @description The author's X (Twitter) profile URL. Stored as the canonical `https://x.com/<handle>` URL. */
@@ -1252,6 +1314,27 @@ interface components {
1252
1314
  /** @description The author's display name. */
1253
1315
  name: string;
1254
1316
  };
1317
+ CreateBackfillRuleBody: {
1318
+ name: string;
1319
+ rules: {
1320
+ /** @enum {string} */
1321
+ match: "any" | "all";
1322
+ conditions: {
1323
+ /** @enum {string} */
1324
+ field: "title" | "description";
1325
+ /** @enum {string} */
1326
+ operator: "contains_any" | "contains_all" | "is_not";
1327
+ terms: string[];
1328
+ }[];
1329
+ }[];
1330
+ filters?: {
1331
+ countries?: string[];
1332
+ subdivisions?: string[];
1333
+ seniorities?: ("entry_level" | "associate" | "mid_level" | "senior" | "director" | "executive")[];
1334
+ employmentTypes?: ("full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other")[];
1335
+ workplaceTypes?: ("remote" | "hybrid" | "onsite")[];
1336
+ };
1337
+ };
1255
1338
  CreateBlogPostBody: {
1256
1339
  slug?: string;
1257
1340
  html?: string;
@@ -1260,8 +1343,8 @@ interface components {
1260
1343
  featured?: boolean;
1261
1344
  authorIds?: string[];
1262
1345
  tagIds?: string[];
1263
- coverStorageId?: string | null;
1264
- ogImageStorageId?: string | null;
1346
+ coverMediaId?: string | null;
1347
+ ogImageMediaId?: string | null;
1265
1348
  featureImageAlt?: string;
1266
1349
  featureImageCaption?: string;
1267
1350
  seoTitle?: string;
@@ -1346,21 +1429,6 @@ interface components {
1346
1429
  description?: string;
1347
1430
  sortOrder?: number;
1348
1431
  };
1349
- CreateFeatureBody: {
1350
- /** @description Stable feature key, e.g. jobs.max_active. */
1351
- key: string;
1352
- name: string;
1353
- /** @description Value data type, e.g. integer or string. */
1354
- dataType: string;
1355
- description?: string;
1356
- defaultValue?: string;
1357
- };
1358
- CreateForagerSubscriptionBody: {
1359
- name: string;
1360
- rules: components["schemas"]["ForagerRule"][];
1361
- filters?: components["schemas"]["ForagerFilters"];
1362
- description?: string | null;
1363
- };
1364
1432
  CreateInvitationBody: {
1365
1433
  /**
1366
1434
  * Format: email
@@ -1396,7 +1464,7 @@ interface components {
1396
1464
  type: "worldwide" | "world_region" | "continent" | "region" | "subregion" | "subdivision" | "country" | "custom";
1397
1465
  value: string;
1398
1466
  }[];
1399
- /** @description Where remote candidates must be timezone-compatible. Each entry mirrors the `remotePermits` shape (`world_region`, `continent`, `region`, `subregion`, `country`) plus `timezone` (specific IANA name with optional `plusMinus` ±N hours expansion) and `all` (every timezone equivalent of `worldwide` for permits). The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-timezones`. **When omitted on POST**, the server auto-derives this from `remotePermits` (or `[{all,all}]` if neither was provided). **PATCH never auto-re-derives** once set, only an explicit replacement updates the stored value, even when `remotePermits` changes. Pass `[]` to clear an existing constraint. */
1467
+ /** @description Where remote candidates must be timezone-compatible. Each entry mirrors the `remotePermits` shape (`world_region`, `continent`, `region`, `subregion`, `country`) plus `timezone` (specific IANA name with optional `plusMinus` ±N hours expansion) and `all` (every timezone: equivalent of `worldwide` for permits). The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-timezones`. **When omitted on POST**, the server auto-derives this from `remotePermits` (or `[{all,all}]` if neither was provided). **PATCH never auto-re-derives**: once set, only an explicit replacement updates the stored value, even when `remotePermits` changes. Pass `[]` to clear an existing constraint. */
1400
1468
  remoteTimezones?: {
1401
1469
  /** @enum {string} */
1402
1470
  type: "all" | "world_region" | "continent" | "region" | "subregion" | "country" | "timezone";
@@ -1453,7 +1521,7 @@ interface components {
1453
1521
  officeLocations?: components["schemas"]["JobOfficeLocationInput"][];
1454
1522
  /** @description An external identifier for the job from your own system, such as an ATS requisition ID. Use this value to look up the job later via `GET /v1/jobs?externalId=...` for deduplication. Scoped per-account: two different accounts may reuse the same `externalId` without collision. Up to 255 characters. */
1455
1523
  externalId?: string;
1456
- /** @description Board-defined custom-field values, keyed by the field `key` (definitions, including type and option keys, are published at `GET /v1/settings/job-form`). Writes are **additive**: on `PATCH` a key you send is set/overwritten and a key you omit is preserved (unsent keys are never cleared); on `POST` this initializes the bag. Send a key with an intentional-empty value `null`, `""`, or `[]` to **clear** it (`""`/`null` clear any type; `[]` clears a `multi_select`); `false` and `0` are kept as real values. Values must match the field type and `single_select`/`multi_select` must use defined option **keys** (not labels); a wrong-typed value is rejected (`custom_field_wrong_type`), never silently cleared. Unknown keys are ignored. The stored bag never contains `null`/empty values. */
1524
+ /** @description Board-defined custom-field values, keyed by the field `key` (definitions, including type and option keys, are published at `GET /v1/settings/job-form`). Writes are **additive**: on `PATCH` a key you send is set/overwritten and a key you omit is preserved (unsent keys are never cleared); on `POST` this initializes the bag. Send a key with an intentional-empty value (`null`, `""`, or `[]`) to **clear** it (`""`/`null` clear any type; `[]` clears a `multi_select`); `false` and `0` are kept as real values. Values must match the field type and `single_select`/`multi_select` must use defined option **keys** (not labels); a wrong-typed value is rejected (`custom_field_wrong_type`), never silently cleared. Unknown keys are ignored. The stored bag never contains `null`/empty values. */
1457
1525
  customFieldValues?: {
1458
1526
  [key: string]: string | string[] | boolean | number | unknown | unknown;
1459
1527
  };
@@ -1461,7 +1529,7 @@ interface components {
1461
1529
  title: string;
1462
1530
  company?: components["schemas"]["InlineCompanyInput"];
1463
1531
  /**
1464
- * @description Initial status of the job. Defaults to `draft`. Only `draft` and `published` are writable here. The system-set values `expired` and `archived` are not use the dedicated transitions (`POST /v1/jobs/:id/publish`, `/pause`, `/expire`) for status changes after create.
1532
+ * @description Initial status of the job. Defaults to `draft`. Only `draft` and `published` are writable here. The system-set values `expired` and `archived` are not. Use the dedicated transitions (`POST /v1/jobs/:id/publish`, `/pause`, `/expire`) for status changes after create.
1465
1533
  * @enum {string}
1466
1534
  */
1467
1535
  status?: "draft" | "published";
@@ -1592,7 +1660,7 @@ interface components {
1592
1660
  maxRedemptions?: number;
1593
1661
  /**
1594
1662
  * Format: date-time
1595
- * @description ISO-8601 expiry; converted to epoch seconds for Stripe.
1663
+ * @description ISO-8601 expiry for the promotion code.
1596
1664
  */
1597
1665
  expiresAt?: string;
1598
1666
  firstTimeTransaction?: boolean;
@@ -1610,6 +1678,20 @@ interface components {
1610
1678
  */
1611
1679
  statusCode: 301 | 302;
1612
1680
  };
1681
+ CreateSalesLedPlanBody: {
1682
+ name: string;
1683
+ description: string;
1684
+ priceText: string;
1685
+ ctaText: string;
1686
+ /** @description Email address or URL. Bare emails become mailto:; bare domains become https://. */
1687
+ ctaDestination: string;
1688
+ /** @description Up to five feature bullets shown on the pricing card. */
1689
+ featuredBullets: string[];
1690
+ /** @description Whether the plan is shown on the public employer pricing page. */
1691
+ isPublic: boolean;
1692
+ /** @description Sort order among active sales-led plans (lower first). */
1693
+ displayOrder: number;
1694
+ };
1613
1695
  CreateSkillBody: {
1614
1696
  name: string;
1615
1697
  slug?: string;
@@ -1899,7 +1981,7 @@ interface components {
1899
1981
  type: "worldwide" | "world_region" | "continent" | "region" | "subregion" | "subdivision" | "country" | "custom";
1900
1982
  value: string;
1901
1983
  }[];
1902
- /** @description Where remote candidates must be timezone-compatible. Each entry mirrors the `remotePermits` shape (`world_region`, `continent`, `region`, `subregion`, `country`) plus `timezone` (specific IANA name with optional `plusMinus` ±N hours expansion) and `all` (every timezone equivalent of `worldwide` for permits). The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-timezones`. **When omitted on POST**, the server auto-derives this from `remotePermits` (or `[{all,all}]` if neither was provided). **PATCH never auto-re-derives** once set, only an explicit replacement updates the stored value, even when `remotePermits` changes. Pass `[]` to clear an existing constraint. */
1984
+ /** @description Where remote candidates must be timezone-compatible. Each entry mirrors the `remotePermits` shape (`world_region`, `continent`, `region`, `subregion`, `country`) plus `timezone` (specific IANA name with optional `plusMinus` ±N hours expansion) and `all` (every timezone: equivalent of `worldwide` for permits). The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-timezones`. **When omitted on POST**, the server auto-derives this from `remotePermits` (or `[{all,all}]` if neither was provided). **PATCH never auto-re-derives**: once set, only an explicit replacement updates the stored value, even when `remotePermits` changes. Pass `[]` to clear an existing constraint. */
1903
1985
  remoteTimezones?: {
1904
1986
  /** @enum {string} */
1905
1987
  type: "all" | "world_region" | "continent" | "region" | "subregion" | "country" | "timezone";
@@ -1961,7 +2043,7 @@ interface components {
1961
2043
  type: string;
1962
2044
  value: string;
1963
2045
  }[];
1964
- /** @description Read-only derived from `remotePermits`. */
2046
+ /** @description Read-only: derived from `remotePermits`. */
1965
2047
  remoteWorldwide: boolean | null;
1966
2048
  /** @description Hierarchical timezone selection. The flat `remoteAllowedTzOffsets` below is the read-only derived projection. */
1967
2049
  remoteTimezones: {
@@ -1969,11 +2051,11 @@ interface components {
1969
2051
  value: string;
1970
2052
  plusMinus?: number;
1971
2053
  }[];
1972
- /** @description Read-only derived from `remoteTimezones`. UTC hour offsets. */
2054
+ /** @description Read-only: derived from `remoteTimezones`. UTC hour offsets. */
1973
2055
  remoteAllowedTzOffsets: number[];
1974
- /** @description Read-only derived from `remotePermits`. ISO 3166-1 alpha-2. */
2056
+ /** @description Read-only: derived from `remotePermits`. ISO 3166-1 alpha-2. */
1975
2057
  remoteWorkPermitCountryCodes: string[];
1976
- /** @description Read-only derived from `remotePermits`. ISO 3166-2. */
2058
+ /** @description Read-only: derived from `remotePermits`. ISO 3166-2. */
1977
2059
  remoteWorkPermitSubdivisionCodes: string[];
1978
2060
  /**
1979
2061
  * @description Whether the employer sponsors visas for remote candidates. One of `yes`, `no`, or `unknown`.
@@ -2131,6 +2213,20 @@ interface components {
2131
2213
  hidden: boolean;
2132
2214
  position: number;
2133
2215
  };
2216
+ EmployerProfileStats: {
2217
+ /** @enum {string} */
2218
+ object: "employer_profile_stats";
2219
+ /** @description Company profile-page views over the all-time window (tabs and bots excluded). */
2220
+ profileViews: number;
2221
+ };
2222
+ EmployerProfileViewsPoint: {
2223
+ /** @enum {string} */
2224
+ object: "employer_profile_views_point";
2225
+ /** @description The UTC day this bucket covers (`YYYY-MM-DD`). */
2226
+ date: string;
2227
+ /** @description Company profile-page views on this day. */
2228
+ views: number;
2229
+ };
2134
2230
  EmployerSubscription: {
2135
2231
  id: string;
2136
2232
  /** @enum {string} */
@@ -2146,10 +2242,7 @@ interface components {
2146
2242
  cancelAtPeriodEnd: boolean;
2147
2243
  /** @description ISO-8601 creation time. */
2148
2244
  createdAt: string;
2149
- stripeCustomerId: string | null;
2150
- stripeSubscriptionId: string | null;
2151
2245
  };
2152
- EmployerSubscriptionOrNull: components["schemas"]["EmployerSubscription"] | unknown | unknown;
2153
2246
  EmployerUpdateJobBody: {
2154
2247
  /** @description Long-form description of the role. Up to 25,000 characters. */
2155
2248
  description?: string;
@@ -2171,7 +2264,7 @@ interface components {
2171
2264
  type: "worldwide" | "world_region" | "continent" | "region" | "subregion" | "subdivision" | "country" | "custom";
2172
2265
  value: string;
2173
2266
  }[];
2174
- /** @description Where remote candidates must be timezone-compatible. Each entry mirrors the `remotePermits` shape (`world_region`, `continent`, `region`, `subregion`, `country`) plus `timezone` (specific IANA name with optional `plusMinus` ±N hours expansion) and `all` (every timezone equivalent of `worldwide` for permits). The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-timezones`. **When omitted on POST**, the server auto-derives this from `remotePermits` (or `[{all,all}]` if neither was provided). **PATCH never auto-re-derives** once set, only an explicit replacement updates the stored value, even when `remotePermits` changes. Pass `[]` to clear an existing constraint. */
2267
+ /** @description Where remote candidates must be timezone-compatible. Each entry mirrors the `remotePermits` shape (`world_region`, `continent`, `region`, `subregion`, `country`) plus `timezone` (specific IANA name with optional `plusMinus` ±N hours expansion) and `all` (every timezone: equivalent of `worldwide` for permits). The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-timezones`. **When omitted on POST**, the server auto-derives this from `remotePermits` (or `[{all,all}]` if neither was provided). **PATCH never auto-re-derives**: once set, only an explicit replacement updates the stored value, even when `remotePermits` changes. Pass `[]` to clear an existing constraint. */
2175
2268
  remoteTimezones?: {
2176
2269
  /** @enum {string} */
2177
2270
  type: "all" | "world_region" | "continent" | "region" | "subregion" | "country" | "timezone";
@@ -2223,16 +2316,18 @@ interface components {
2223
2316
  /** @description The job title. */
2224
2317
  title?: string;
2225
2318
  };
2226
- FeatureDefinition: {
2227
- id: string;
2228
- /** @enum {string} */
2229
- object: "feature";
2230
- key: string;
2231
- name: string;
2232
- description: string | null;
2233
- dataType: string;
2234
- defaultValue: string | null;
2235
- isSystem: boolean;
2319
+ /** @description The error envelope returned by every non-2xx response. */
2320
+ Error: {
2321
+ error: {
2322
+ /** @description Machine-readable error code, such as `validation_bad_request` or `jobs_not_found`. */
2323
+ code: string;
2324
+ /** @description Human-readable explanation. */
2325
+ message: string;
2326
+ /** @description Unique id for this request. Include it when contacting support. */
2327
+ requestId: string;
2328
+ /** @description Structured context for some errors, such as per-field validation issues. */
2329
+ details?: unknown;
2330
+ };
2236
2331
  };
2237
2332
  FindOrCreateCompanyBody: {
2238
2333
  /** @description The company's display name. */
@@ -2246,109 +2341,6 @@ interface components {
2246
2341
  /** @description If `true` (default), creates a new company when no match is found. Set to `false` to receive a `404 companies_not_found` response instead. */
2247
2342
  createIfMissing?: boolean;
2248
2343
  };
2249
- ForagerBackfillProgress: {
2250
- id: string;
2251
- /** @enum {string} */
2252
- object: "forager_backfill_progress";
2253
- backfillId: string;
2254
- status: string;
2255
- progress: {
2256
- jobsMatched: number;
2257
- jobsToEnhance: number;
2258
- jobsEnhanced: number;
2259
- jobsFailed: number;
2260
- };
2261
- errorMessage: string | null;
2262
- createdAt: string;
2263
- };
2264
- ForagerBatchResult: {
2265
- /** @enum {string} */
2266
- object: "forager_batch_result";
2267
- successCount: number;
2268
- failureCount: number;
2269
- };
2270
- ForagerCompany: {
2271
- /** @enum {string} */
2272
- object: "forager_company";
2273
- companyId: string;
2274
- companyUrl: string;
2275
- companyName: string;
2276
- slug: string;
2277
- about: string | null;
2278
- atsType: string | null;
2279
- atsIdentifier: string | null;
2280
- addedAt: string;
2281
- };
2282
- ForagerConfig: {
2283
- /** @enum {string} */
2284
- object: "forager_config";
2285
- configured: boolean;
2286
- isActive?: boolean;
2287
- foragerUserId?: string | null;
2288
- privateVerticalId?: string | null;
2289
- foragerPlan?: string | null;
2290
- autoExpireJobs?: boolean;
2291
- lastSyncedAt?: string | null;
2292
- hasApiKey?: boolean;
2293
- hasWebhookSecret?: boolean;
2294
- };
2295
- ForagerDescription: {
2296
- /** @enum {string} */
2297
- object: "forager_description";
2298
- description: string | null;
2299
- };
2300
- ForagerExclusion: {
2301
- id: string;
2302
- /** @enum {string} */
2303
- object: "forager_exclusion";
2304
- pattern: string;
2305
- type: string;
2306
- createdAt: string;
2307
- };
2308
- ForagerFilters: {
2309
- countries?: string[];
2310
- subdivisions?: string[];
2311
- seniorities?: string[];
2312
- employment_types?: string[];
2313
- workplace_types?: string[];
2314
- };
2315
- ForagerRule: {
2316
- /** @enum {string} */
2317
- field: "title" | "description" | "category_list";
2318
- query: {
2319
- [key: string]: unknown;
2320
- };
2321
- active?: boolean;
2322
- };
2323
- ForagerSubscription: {
2324
- /** @enum {string} */
2325
- object: "forager_subscription";
2326
- verticalKey: string;
2327
- verticalId: string;
2328
- /** @enum {string} */
2329
- kind: "role" | "company";
2330
- name: string;
2331
- active: boolean;
2332
- description: string | null;
2333
- filters?: unknown;
2334
- rules?: unknown;
2335
- backfillId?: string;
2336
- createdAt: string;
2337
- updatedAt: string;
2338
- };
2339
- ForagerSyncRun: {
2340
- id: string;
2341
- /** @enum {string} */
2342
- object: "forager_sync_run";
2343
- startedAt: string | null;
2344
- completedAt: string;
2345
- /** @enum {string} */
2346
- status: "completed";
2347
- jobsCreated: number;
2348
- jobsRepublished: number;
2349
- companiesCreated: number;
2350
- totalActive: number;
2351
- };
2352
2344
  HandleAvailability: {
2353
2345
  /** @enum {string} */
2354
2346
  object: "handle_availability";
@@ -2369,7 +2361,6 @@ interface components {
2369
2361
  updatedCount: number;
2370
2362
  skippedCount: number;
2371
2363
  errorCount: number;
2372
- mappingId: string | null;
2373
2364
  startedAt: string | null;
2374
2365
  completedAt: string | null;
2375
2366
  createdAt: string;
@@ -2393,39 +2384,36 @@ interface components {
2393
2384
  updatedCount: number;
2394
2385
  skippedCount: number;
2395
2386
  errorCount: number;
2396
- mappingId: string | null;
2397
2387
  startedAt: string | null;
2398
2388
  completedAt: string | null;
2399
2389
  createdAt: string;
2400
2390
  errors: components["schemas"]["ImportBatchError"][];
2401
- proposedMapping?: unknown;
2402
- };
2403
- ImportFieldMapping: {
2404
- sourceColumn: string;
2405
- targetField: string;
2406
- confidence: number;
2407
- notes?: string;
2408
- };
2409
- ImportMapping: {
2410
- id: string;
2411
- /** @enum {string} */
2412
- object: "import_mapping";
2413
- schemaFingerprint: string;
2414
- /** @enum {string} */
2415
- sourceFormat: "csv" | "xml";
2416
- fieldMappings: components["schemas"]["ImportFieldMapping"][];
2417
- valueTransforms: components["schemas"]["ImportValueTransform"][];
2418
- defaults: components["schemas"]["ImportMappingDefaults"];
2419
- importCount: number;
2420
- lastUsedAt: string;
2421
- createdByUserId: string | null;
2422
- createdAt: string;
2423
- };
2424
- ImportMappingDefaults: {
2425
- employmentType?: string;
2426
- remoteOption?: string;
2427
- currency?: string;
2428
- descriptionFormat?: string;
2391
+ /** @description Typed, operator-reviewable mapping state. Fingerprints, cache identity, AI provenance, and extraction machinery are private. */
2392
+ proposedMapping: {
2393
+ fieldMappings: {
2394
+ sourceColumn: string;
2395
+ targetField: string;
2396
+ confidence: number;
2397
+ notes?: string;
2398
+ }[];
2399
+ defaults: {
2400
+ employmentType?: string;
2401
+ remoteOption?: string;
2402
+ currency?: string;
2403
+ descriptionFormat?: string;
2404
+ };
2405
+ valueTransforms: {
2406
+ sourceColumn: string;
2407
+ targetField: string;
2408
+ map: {
2409
+ [key: string]: string;
2410
+ };
2411
+ fallback?: string;
2412
+ }[];
2413
+ unmappedSourceColumns: string[];
2414
+ missingRequiredTargets: string[];
2415
+ warnings: string[];
2416
+ } | null;
2429
2417
  };
2430
2418
  ImportQuota: {
2431
2419
  /** @enum {string} */
@@ -2435,14 +2423,6 @@ interface components {
2435
2423
  limit: number;
2436
2424
  resetAt: string;
2437
2425
  };
2438
- ImportValueTransform: {
2439
- sourceColumn: string;
2440
- targetField: string;
2441
- map: {
2442
- [key: string]: string;
2443
- };
2444
- fallback?: string;
2445
- };
2446
2426
  IndexingConfig: {
2447
2427
  /** @enum {string} */
2448
2428
  id: "indexing_config";
@@ -2516,24 +2496,24 @@ interface components {
2516
2496
  description: string | null;
2517
2497
  /** @description Where candidates apply, or `null` if not specified. An HTTPS URL or `mailto:` URI. */
2518
2498
  applicationUrl: string | null;
2519
- /** @description Hierarchical permit selection authored by the caller. Lossless round-trip with the input `[{type:"world_region",value:"EMEA"}]` goes in and comes out the same. The three `remoteWorkPermit*` and `remoteWorldwide` fields below are read-only derived projections of this list. */
2499
+ /** @description Hierarchical permit selection authored by the caller. Lossless round-trip with the input: `[{type:"world_region",value:"EMEA"}]` goes in and comes out the same. The three `remoteWorkPermit*` and `remoteWorldwide` fields below are read-only derived projections of this list. */
2520
2500
  remotePermits: {
2521
2501
  type: string;
2522
2502
  value: string;
2523
2503
  }[];
2524
- /** @description Read-only derived from `remotePermits`. `true` only when the authored selection is a single `{type:"worldwide"}` entry. */
2504
+ /** @description Read-only: derived from `remotePermits`. `true` only when the authored selection is a single `{type:"worldwide"}` entry. */
2525
2505
  remoteWorldwide: boolean | null;
2526
- /** @description Hierarchical timezone selection. Lossless round-trip with the authored input. When omitted on POST, the server auto-derives this from `remotePermits` (or `[{all,all}]` if neither was provided). PATCH never auto-re-derives once set, only an explicit replacement updates the stored value. The flat `remoteAllowedTzOffsets` field below is the read-only derived projection used by search. */
2506
+ /** @description Hierarchical timezone selection. Lossless round-trip with the authored input. When omitted on POST, the server auto-derives this from `remotePermits` (or `[{all,all}]` if neither was provided). PATCH never auto-re-derives: once set, only an explicit replacement updates the stored value. The flat `remoteAllowedTzOffsets` field below is the read-only derived projection used by search. */
2527
2507
  remoteTimezones: {
2528
2508
  type: string;
2529
2509
  value: string;
2530
2510
  plusMinus?: number;
2531
2511
  }[];
2532
- /** @description Read-only derived from `remoteTimezones` (per-country/per-region offset fan-out). UTC hour offsets used by the job-search index. */
2512
+ /** @description Read-only: derived from `remoteTimezones` (per-country/per-region offset fan-out). UTC hour offsets used by the job-search index. */
2533
2513
  remoteAllowedTzOffsets: number[];
2534
- /** @description Read-only derived from `remotePermits` (hierarchical groups fan out to alpha2 sets; subdivisions auto-add the parent country). ISO 3166-1 alpha-2 codes. */
2514
+ /** @description Read-only: derived from `remotePermits` (hierarchical groups fan out to alpha2 sets; subdivisions auto-add the parent country). ISO 3166-1 alpha-2 codes. */
2535
2515
  remoteWorkPermitCountryCodes: string[];
2536
- /** @description Read-only derived from `remotePermits` (subdivision entries only). ISO 3166-2 codes. */
2516
+ /** @description Read-only: derived from `remotePermits` (subdivision entries only). ISO 3166-2 codes. */
2537
2517
  remoteWorkPermitSubdivisionCodes: string[];
2538
2518
  /**
2539
2519
  * @description Whether the employer sponsors visas for remote candidates. One of `yes`, `no`, or `unknown`.
@@ -2788,7 +2768,7 @@ interface components {
2788
2768
  categories: string[];
2789
2769
  /** @description External identifier supplied by the caller on create, used for deduplication via `GET /v1/jobs?externalId=...`. `null` when no external identifier was set. */
2790
2770
  externalId: string | null;
2791
- /** @description Board-defined custom-field values for this job, keyed by the field `key` (the definitions are published at `GET /v1/settings/job-form`). Each value is returned as stored: a string (`short_text` / `long_text` / a `single_select` option key), a string array (`multi_select` option keys), a boolean, or a number. Always an object `{}` when the job has no custom-field values, never `null` or a missing field. Only real values are stored, so this never contains `null` or empty values. */
2771
+ /** @description Board-defined custom-field values for this job, keyed by the field `key` (the definitions are published at `GET /v1/settings/job-form`). Each value is returned as stored: a string (`short_text` / `long_text` / a `single_select` option key), a string array (`multi_select` option keys), a boolean, or a number. Always an object: `{}` when the job has no custom-field values, never `null` or a missing field. Only real values are stored, so this never contains `null` or empty values. */
2792
2772
  customFieldValues: {
2793
2773
  [key: string]: string | string[] | boolean | number;
2794
2774
  };
@@ -2801,7 +2781,7 @@ interface components {
2801
2781
  type: string;
2802
2782
  /** @description Page heading (H1), with `{{board_name}}` resolved. */
2803
2783
  title: string;
2804
- /** @description Owner-authored prose as portable HTML (transitional field, ADR-0039 the starter authors the layout). Empty string when the page has no text body. */
2784
+ /** @description Owner-authored prose as portable HTML (transitional field, ADR-0039: the starter authors the layout). Empty string when the page has no text body. */
2805
2785
  content: string;
2806
2786
  /** @enum {string} */
2807
2787
  contentFormat: "html";
@@ -2814,9 +2794,9 @@ interface components {
2814
2794
  LocationSalaryDetail: {
2815
2795
  /** @enum {string} */
2816
2796
  object: "location_salary_detail";
2817
- /** @description Immutable English source place slug the salary-stats key. */
2797
+ /** @description Immutable English source place slug: the salary-stats key. */
2818
2798
  sourceSlug: string;
2819
- /** @description Board-language canonical URL slug the starter 308 target. */
2799
+ /** @description Board-language canonical URL slug: the starter 308 target. */
2820
2800
  canonicalSlug: string;
2821
2801
  placeName: string;
2822
2802
  placeId: string;
@@ -2930,10 +2910,16 @@ interface components {
2930
2910
  sourceLocale: string | null;
2931
2911
  createdAt: string;
2932
2912
  };
2913
+ MatchBackfillCompanyBody: {
2914
+ /** @description Zero-based index into the short-lived candidates array from list (needs_match). Re-validated server-side. */
2915
+ candidateIndex: number;
2916
+ /** @description When true, start backfill after linking the match; when false, only record the match (available). */
2917
+ start: boolean;
2918
+ };
2933
2919
  MediaGet: components["schemas"]["MediaUpload"] & {
2934
2920
  /** @description Time at which the file was uploaded. ISO 8601 datetime. */
2935
2921
  uploadedAt: string;
2936
- /** @description Resources currently referencing this file. Currently always `[]` the resolver is not yet implemented. */
2922
+ /** @description Resources currently referencing this file. Currently always `[]`. The resolver is not yet implemented. */
2937
2923
  referencedBy: {
2938
2924
  /** @description Type of the resource referencing this file. */
2939
2925
  resourceType: string;
@@ -2988,16 +2974,6 @@ interface components {
2988
2974
  /** @description Whether the member is the account primary owner. */
2989
2975
  isPrimaryOwner: boolean;
2990
2976
  };
2991
- MemberPermissions: {
2992
- /** @enum {string} */
2993
- id: "members_me";
2994
- /** @enum {string} */
2995
- object: "member_permissions";
2996
- /** @description The acting member's role, or `null` if they are not a member. */
2997
- role: string | null;
2998
- /** @description The permission strings the acting member effectively holds. */
2999
- permissions: string[];
3000
- };
3001
2977
  Message: {
3002
2978
  id: string;
3003
2979
  /** @enum {string} */
@@ -3062,10 +3038,6 @@ interface components {
3062
3038
  code: string;
3063
3039
  /** @description Human-readable error message. */
3064
3040
  message: string;
3065
- /** @description Additional structured details about the error, when present. */
3066
- details?: unknown;
3067
- /** @description Identifier of the request that produced the error. Use this to correlate with platform logs. */
3068
- requestId?: string;
3069
3041
  } | null;
3070
3042
  /** @description Snapshot of the operation's progress, or `null` if the operation does not report progress. */
3071
3043
  OperationProgress: {
@@ -3086,18 +3058,17 @@ interface components {
3086
3058
  * @enum {string}
3087
3059
  */
3088
3060
  object: "operation";
3089
- /** @description Operation kind, identifying which workflow the operation runs. */
3090
- kind: string;
3061
+ /**
3062
+ * @description Operation kind, identifying which workflow the operation runs.
3063
+ * @enum {string}
3064
+ */
3065
+ kind: "domains.verify" | "imports.parse" | "imports.confirm" | "subscribers.export" | "subscribers.import" | "candidates.remove" | "employers.remove";
3091
3066
  /**
3092
3067
  * @description Current state of the operation.
3093
3068
  * @enum {string}
3094
3069
  */
3095
3070
  state: "pending" | "running" | "succeeded" | "failed" | "cancelled";
3096
- /** @description Identifier of the account the operation belongs to. */
3097
- accountId: string;
3098
3071
  progress: components["schemas"]["OperationProgress"];
3099
- /** @description Operation result, populated once the operation reaches `succeeded`. Shape varies by `kind`. */
3100
- result?: unknown;
3101
3072
  error: components["schemas"]["OperationErrorEnvelope"];
3102
3073
  /** @description Time at which the operation was created. ISO 8601 datetime. */
3103
3074
  createdAt: string;
@@ -3107,16 +3078,74 @@ interface components {
3107
3078
  completedAt: string | null;
3108
3079
  /** @description Whether cancellation of the operation has been requested. */
3109
3080
  cancelRequested: boolean;
3110
- /** @description Type of resource the operation acts on, or `null` for resource-less operations. */
3111
- resourceType: string | null;
3112
- /** @description Identifier of the resource the operation acts on, or `null` for resource-less operations. */
3113
- resourceId: string | null;
3114
- /** @description Identifier of the parent operation when this operation is a child of a fan-out, or `null` otherwise. */
3115
- parentOperationId: string | null;
3081
+ /** @description Stable product resource affected by the operation, or `null` when no public resource applies. */
3082
+ resource: {
3083
+ /** @enum {string} */
3084
+ object: "company" | "domain" | "import" | "employer" | "candidate";
3085
+ id: string;
3086
+ } | null;
3116
3087
  };
3117
- PatchForagerConfigBody: {
3118
- isActive?: boolean;
3119
- autoExpireJobs?: boolean;
3088
+ Operator: {
3089
+ /**
3090
+ * @description String representing the object's type. Objects of the same type share the same value.
3091
+ * @enum {string}
3092
+ */
3093
+ object: "operator";
3094
+ /** @description The Board the credential is bound to. */
3095
+ board: {
3096
+ /** @description Unique identifier for the Board (account). */
3097
+ id: string;
3098
+ /** @description URL slug of the Board. */
3099
+ slug: string;
3100
+ /** @description Display name of the Board. */
3101
+ name: string;
3102
+ };
3103
+ /** @description The authenticated principal. */
3104
+ actor: {
3105
+ /**
3106
+ * @description How this request authenticated.
3107
+ * @enum {string}
3108
+ */
3109
+ type: "api_key" | "oauth_token" | "user_session";
3110
+ /** @description Current live membership role. Always `null` for API keys (Board-owned service credentials). Null for OAuth/session only when no live membership remains. */
3111
+ role: string | null;
3112
+ /** @description Current effective product permissions. API keys use the key's explicit scopes; OAuth is the intersection of token scopes and the consenting member's live permissions; sessions use the member's live permissions. */
3113
+ permissions: string[];
3114
+ /** @description Credential scopes for API keys and OAuth tokens. Always `null` for user sessions. */
3115
+ scopes: string[] | null;
3116
+ };
3117
+ };
3118
+ OperatorSettingsConfig: {
3119
+ passwordProtectionEnabled?: boolean;
3120
+ jobAlertsEnabled?: boolean;
3121
+ candidatesEnabled?: boolean;
3122
+ employersEnabled?: boolean;
3123
+ blogEnabled?: boolean;
3124
+ impressumEnabled?: boolean;
3125
+ requireApprovalFreeJobs?: boolean;
3126
+ requireApprovalAggregatedJobs?: boolean;
3127
+ registrationWallEnabled?: boolean;
3128
+ nativeApplicationsEnabled?: boolean;
3129
+ applicantMessagingEnabled?: boolean;
3130
+ requireCookieConsent?: boolean;
3131
+ showCavunoBranding?: boolean;
3132
+ cookieBannerTitle?: string;
3133
+ cookieBannerDescription?: string;
3134
+ cookieBannerRejectLabel?: string;
3135
+ cookieBannerAcceptLabel?: string;
3136
+ cookieBannerManageLabel?: string;
3137
+ talentNavLabel?: string;
3138
+ contactEmail?: string | null;
3139
+ companyLegalName?: string | null;
3140
+ companyAddress?: string | null;
3141
+ companyWebsiteUrl?: string | null;
3142
+ companyXHandle?: string | null;
3143
+ companyFacebookUrl?: string | null;
3144
+ companyLinkedinUrl?: string | null;
3145
+ passwordProtectionMessage?: string | null;
3146
+ defaultJobDurationDays?: number;
3147
+ /** @enum {string} */
3148
+ talentDirectoryVisibility?: "off" | "public" | "employers_only";
3120
3149
  };
3121
3150
  PatchNotificationPreferencesBody: {
3122
3151
  backfillDigest?: boolean;
@@ -3134,10 +3163,10 @@ interface components {
3134
3163
  slug?: string;
3135
3164
  /** @description Identifier of the custom domain to use as the primary public URL. */
3136
3165
  primaryDomainId?: string;
3137
- /** @description Media storage ID returned by `POST /v1/media/upload` with `purpose=board_logo`. */
3138
- logoStorageId?: string;
3139
- /** @description Media storage ID returned by `POST /v1/media/upload` with `purpose=board_hero`. */
3140
- heroStorageId?: string;
3166
+ /** @description Cavuno media ID returned by `POST /v1/media/upload` with `purpose=board_logo`. */
3167
+ logoMediaId?: string;
3168
+ /** @description Cavuno media ID returned by `POST /v1/media/upload` with `purpose=board_hero`. */
3169
+ heroMediaId?: string;
3141
3170
  /** @description Whether the board sits behind a password gate. Use `POST /v1/settings/password-protection` to set the actual password before enabling. */
3142
3171
  passwordProtectionEnabled?: boolean;
3143
3172
  /** @description Whether candidates can subscribe to email alerts for new jobs. */
@@ -3152,11 +3181,11 @@ interface components {
3152
3181
  impressumEnabled?: boolean;
3153
3182
  /** @description Whether jobs posted by employers from the free tier require admin approval before they appear on the public board. */
3154
3183
  requireApprovalFreeJobs?: boolean;
3155
- /** @description Whether aggregated jobs (e.g. those scraped or imported from upstream sources) require admin approval before they appear on the public board. */
3184
+ /** @description Whether aggregated jobs (e.g. those sourced or imported from upstream sources) require admin approval before they appear on the public board. */
3156
3185
  requireApprovalAggregatedJobs?: boolean;
3157
3186
  /** @description Whether visitors must sign in to view jobs. */
3158
3187
  registrationWallEnabled?: boolean;
3159
- /** @description Whether the board's built-in ATS receives applications. When `false` (external-applications-only board), posting surfaces require an external `applicationUrl` and `POST /boards/:identifier/jobs/:jobSlug/apply` rejects with `applications_native_disabled`. Turning this off UNPUBLISHES every published native-apply job (those with no external `applicationUrl`) back to draft via an asynchronous batched drain expect published job counts to shrink over the following seconds. Nothing is deleted, and re-enabling does NOT republish the drafted jobs. Absent means `true`. */
3188
+ /** @description Whether the board's built-in ATS receives applications. When `false` (external-applications-only board), posting surfaces require an external `applicationUrl` and `POST /boards/:identifier/jobs/:jobSlug/apply` rejects with `applications_native_disabled`. Turning this off UNPUBLISHES every published native-apply job (those with no external `applicationUrl`) back to draft via an asynchronous batched drain. Expect published job counts to shrink over the following seconds. Nothing is deleted, and re-enabling does NOT republish the drafted jobs. Absent means `true`. */
3160
3189
  nativeApplicationsEnabled?: boolean;
3161
3190
  /** @description Whether applicant↔employer messaging is enabled. When `false`, the `me/conversations` route family rejects with `messaging_disabled` and new-message emails are suppressed. Absent means `true`. */
3162
3191
  applicantMessagingEnabled?: boolean;
@@ -3201,38 +3230,6 @@ interface components {
3201
3230
  talentNavLabel?: string;
3202
3231
  /** @description Custom copy displayed on the password gate. Up to 500 characters. Pass `null` to clear. */
3203
3232
  passwordProtectionMessage?: string | "" | unknown | unknown;
3204
- /** @description Free-form configuration object merged into the existing config. Reserved keys (e.g. `passwordProtectionEnabled`, `adsenseClientId`, `jobAccessPaywallEnabled`) cannot be set here — use the dedicated endpoints instead. */
3205
- config?: {
3206
- [key: string]: unknown;
3207
- };
3208
- };
3209
- PaywallGrantAdmin: {
3210
- id: string;
3211
- /** @enum {string} */
3212
- object: "paywall_grant";
3213
- boardUserId: string;
3214
- email: string;
3215
- displayName: string;
3216
- /** @enum {string} */
3217
- kind: "recurring" | "one_time";
3218
- offerKey: string;
3219
- status: string;
3220
- stripeCustomerId: string | null;
3221
- stripeSubscriptionId: string | null;
3222
- amountCents: number;
3223
- currency: string;
3224
- currentPeriodStart: string | null;
3225
- currentPeriodEnd: string | null;
3226
- cancelAtPeriodEnd: boolean;
3227
- activatedAt: string | null;
3228
- canceledAt: string | null;
3229
- createdAt: string;
3230
- };
3231
- PaywallGrantCount: {
3232
- /** @enum {string} */
3233
- object: "paywall_grant_count";
3234
- cancelableRecurring: number;
3235
- windingDownRecurring: number;
3236
3233
  };
3237
3234
  PaywallOffer: {
3238
3235
  /** @enum {string} */
@@ -3252,37 +3249,6 @@ interface components {
3252
3249
  intervalCount: number | null;
3253
3250
  isDefault: boolean;
3254
3251
  };
3255
- PaywallOfferAdmin: {
3256
- id: string;
3257
- /** @enum {string} */
3258
- object: "paywall_offer";
3259
- offerKey: string;
3260
- label: string | null;
3261
- billingLabel: string | null;
3262
- /** @enum {string} */
3263
- kind: "recurring" | "one_time";
3264
- intervalUnit: string | null;
3265
- intervalCount: number | null;
3266
- amountCents: number;
3267
- currency: string;
3268
- stripePriceId: string | null;
3269
- enabled: boolean;
3270
- isDefault: boolean;
3271
- displayOrder: number;
3272
- createdAt: string;
3273
- };
3274
- PaywallOfferAdminOrNull: components["schemas"]["PaywallOfferAdmin"] | unknown | unknown;
3275
- Permission: {
3276
- /** @description Unique identifier for the permission. */
3277
- id: string;
3278
- /**
3279
- * @description String representing the object's type.
3280
- * @enum {string}
3281
- */
3282
- object: "permission";
3283
- /** @description The permission string, e.g. `members.manage`. */
3284
- permission: string;
3285
- };
3286
3252
  Plan: {
3287
3253
  /** @enum {string} */
3288
3254
  object: "plan";
@@ -3321,14 +3287,17 @@ interface components {
3321
3287
  };
3322
3288
  };
3323
3289
  PlanFeature: {
3324
- /** @description Stable feature key, e.g. jobs.max_active. */
3325
- key: string;
3290
+ /**
3291
+ * @description Stable Cavuno plan capability key.
3292
+ * @enum {string}
3293
+ */
3294
+ key: "jobs.max_active" | "jobs.duration_days" | "jobs.featured_slots" | "jobs.feature_selection_mode" | "talent.profile_unlocks" | "talent.messages_sent";
3326
3295
  name: string | null;
3327
3296
  value: string | null;
3328
- dataType: string | null;
3329
3297
  };
3330
3298
  PlanFeatureValue: {
3331
- key: string;
3299
+ /** @enum {string} */
3300
+ key: "jobs.max_active" | "jobs.duration_days" | "jobs.featured_slots" | "jobs.feature_selection_mode" | "talent.profile_unlocks" | "talent.messages_sent";
3332
3301
  value: string;
3333
3302
  };
3334
3303
  /** @description The plan single active price, or null when no price has been set. */
@@ -3337,9 +3306,6 @@ interface components {
3337
3306
  currency: string;
3338
3307
  /** @description Unit amount in the smallest currency unit. */
3339
3308
  amountCents: number;
3340
- stripePriceId: string | null;
3341
- stripeProductId: string | null;
3342
- isActive: boolean;
3343
3309
  } | null;
3344
3310
  PromotionCode: {
3345
3311
  id: string;
@@ -3404,6 +3370,11 @@ interface components {
3404
3370
  cursor?: string | null;
3405
3371
  /** @description A limit on the number of objects to be returned. Limit can range between 1 and 50. */
3406
3372
  limit?: number;
3373
+ /**
3374
+ * @description The number of posts to skip — the search page offset. Takes precedence over `cursor`; pair with the response `count` to page in parallel. `offset + limit` may not exceed 10,000.
3375
+ * @example 0
3376
+ */
3377
+ offset?: number;
3407
3378
  };
3408
3379
  PublicBlogTag: components["schemas"]["PublicBlogTagEmbed"] & {
3409
3380
  /** @enum {string} */
@@ -3430,7 +3401,7 @@ interface components {
3430
3401
  primaryDomain: string | null;
3431
3402
  /** @description Whitelabel toggle (default `true`). Render the "Powered by Cavuno" badge unless `false`. */
3432
3403
  showCavunoBranding: boolean;
3433
- /** @description True ONLY for the platform sandbox fixture tenant the safe target for write probes (doctor tier 3); data is reset nightly. Every real tenant board is `false`. */
3404
+ /** @description True ONLY for the platform sandbox fixture tenant: the safe target for write probes (doctor tier 3); data is reset nightly. Every real tenant board is `false`. */
3434
3405
  sandbox: boolean;
3435
3406
  features: {
3436
3407
  jobAlerts: boolean;
@@ -3445,11 +3416,11 @@ interface components {
3445
3416
  impressum: boolean;
3446
3417
  /** @description Whether the board accepts native (on-board ATS) applications. `false` means external-applications-only: the server rejects native submissions to `POST /jobs/:jobSlug/apply` with `applications_native_disabled` (422). Clients should hide native apply UI and treat a job with no external `applicationUrl` as not-applyable. */
3447
3418
  nativeApplications: boolean;
3448
- /** @description Whether applicant↔employer messaging is enabled on the board. `false` means the `me/conversations` route family rejects with `messaging_disabled` (403) hide inbox/dock/Message CTAs. */
3419
+ /** @description Whether applicant↔employer messaging is enabled on the board. `false` means the `me/conversations` route family rejects with `messaging_disabled` (403). Hide inbox/dock/Message CTAs. */
3449
3420
  messaging: boolean;
3450
3421
  };
3451
3422
  /**
3452
- * @description The tri-state behind `features.talentDirectory` (which is `visibility === 'public'`). Link /talent whenever this is not `'off'` an employers-only directory renders a sign-in upsell for anonymous visitors, matching the hosted chrome.
3423
+ * @description The tri-state behind `features.talentDirectory` (which is `visibility === 'public'`). Link /talent whenever this is not `'off'`. An employers-only directory renders a sign-in upsell for anonymous visitors, matching the hosted chrome.
3453
3424
  * @enum {string}
3454
3425
  */
3455
3426
  talentDirectoryVisibility: "off" | "public" | "employers_only";
@@ -3476,9 +3447,9 @@ interface components {
3476
3447
  };
3477
3448
  };
3478
3449
  } | null;
3479
- /** @description Operator-defined custom job-field definitions (CAV-294), in display order. Board-wide; the frontend uses these to render and localize each job's opaque `customFieldValues`. Empty when the board defines none. Display-only not filterable or searchable in v1. */
3450
+ /** @description Operator-defined custom job-field definitions (CAV-294), in display order. Board-wide; the frontend uses these to render and localize each job's opaque `customFieldValues`. Empty when the board defines none. Display-only: not filterable or searchable in v1. */
3480
3451
  customFields: components["schemas"]["CustomFieldDefinition"][];
3481
- /** @description Stored operator label overrides by config group (`jobCardLabels`, `navLabels`, `breadcrumbsLabels`, …) plain-text chrome copy to merge over the `@cavuno/board` `uiCopy(language)` catalog via `uiCopy(language, labels)` (ADR-0059). Empty object when the board stores none. */
3452
+ /** @description Stored operator label overrides by config group (`jobCardLabels`, `navLabels`, `breadcrumbsLabels`, …): plain-text chrome copy to merge over the `@cavuno/board` `uiCopy(language)` catalog via `uiCopy(language, labels)` (ADR-0059). Empty object when the board stores none. */
3482
3453
  labels: {
3483
3454
  [key: string]: {
3484
3455
  [key: string]: string;
@@ -3486,7 +3457,7 @@ interface components {
3486
3457
  };
3487
3458
  /** @description Footer/brand data the hosted board footer renders (description, contact, website + social links, navigation order). The brand/social URLs (`websiteUrl`, `facebookUrl`, `linkedinUrl`, `xUrl`) are sanitized to absolute http(s); `customLinks[].url` is served verbatim (see its own note). */
3488
3459
  footer: {
3489
- /** @description Operator-written footer brand description. May carry a `{{board_name}}` placeholder resolve it before rendering. When null, fall back to the label catalog's `footer.defaultDescription` template. */
3460
+ /** @description Operator-written footer brand description. May carry a `{{board_name}}` placeholder. Resolve it before rendering. When null, fall back to the label catalog's `footer.defaultDescription` template. */
3490
3461
  description: string | null;
3491
3462
  /** @description Public contact email for the footer About column (render as `mailto:`). */
3492
3463
  contactEmail: string | null;
@@ -3495,9 +3466,9 @@ interface components {
3495
3466
  xUrl: string | null;
3496
3467
  facebookUrl: string | null;
3497
3468
  linkedinUrl: string | null;
3498
- /** @description Operator-configured navigation order: system item ids (`home`, `companies`, `pricing`, `blog`) and `custom:<id>` refs into `customLinks`. Empty when the operator never reordered render the system defaults. System items still gate on their feature flags (e.g. `blog` only when `features.blog`). */
3469
+ /** @description Operator-configured navigation order: system item ids (`home`, `companies`, `pricing`, `blog`) and `custom:<id>` refs into `customLinks`. Empty when the operator never reordered. Render the system defaults. System items still gate on their feature flags (e.g. `blog` only when `features.blog`). */
3499
3470
  navigationOrder: string[];
3500
- /** @description Operator-defined navigation links referenced from `navigationOrder` as `custom:<id>`; links not referenced there append after the system items (hosted-footer behavior). Each `url` is served verbatim (trimmed only) and may be a relative path (e.g. `/hub`) unlike the brand/social URLs it is NOT run through http(s) sanitization (matching the hosted footer, which supports relative links), so a consumer MUST sanitize it before binding to an anchor href. */
3471
+ /** @description Operator-defined navigation links referenced from `navigationOrder` as `custom:<id>`; links not referenced there append after the system items (hosted-footer behavior). Each `url` is served verbatim (trimmed only) and may be a relative path (e.g. `/hub`): unlike the brand/social URLs it is NOT run through http(s) sanitization (matching the hosted footer, which supports relative links), so a consumer MUST sanitize it before binding to an anchor href. */
3501
3472
  customLinks: {
3502
3473
  id: string;
3503
3474
  label: string;
@@ -3516,6 +3487,11 @@ interface components {
3516
3487
  cursor?: string | null;
3517
3488
  /** @description A limit on the number of objects to be returned. Limit can range between 1 and 100. */
3518
3489
  limit?: number;
3490
+ /**
3491
+ * @description The number of companies to skip — the company catalog page offset. Takes precedence over `cursor`; pair with the response `count` to page in parallel. `offset + limit` may not exceed 10,000.
3492
+ * @example 0
3493
+ */
3494
+ offset?: number;
3519
3495
  };
3520
3496
  /** @description Public-only links. The admin URL is intentionally omitted on public-board responses. */
3521
3497
  PublicCompanyLinks: {
@@ -3606,7 +3582,7 @@ interface components {
3606
3582
  type: string;
3607
3583
  value: string;
3608
3584
  }[];
3609
- /** @description Read-only derived from `remotePermits`. `true` only when the authored selection is a single `{type:"worldwide"}` entry. */
3585
+ /** @description Read-only: derived from `remotePermits`. `true` only when the authored selection is a single `{type:"worldwide"}` entry. */
3610
3586
  remoteWorldwide: boolean | null;
3611
3587
  /** @description Hierarchical timezone selection. The flat `remoteAllowedTzOffsets` field below is the read-only derived projection. */
3612
3588
  remoteTimezones: {
@@ -3614,11 +3590,11 @@ interface components {
3614
3590
  value: string;
3615
3591
  plusMinus?: number;
3616
3592
  }[];
3617
- /** @description Read-only derived from `remoteTimezones`. UTC hour offsets used by the job-search index. */
3593
+ /** @description Read-only: derived from `remoteTimezones`. UTC hour offsets used by the job-search index. */
3618
3594
  remoteAllowedTzOffsets: number[];
3619
- /** @description Read-only derived from `remotePermits` (hierarchical groups fan out to alpha2 sets; subdivisions auto-add the parent country). ISO 3166-1 alpha-2 codes. */
3595
+ /** @description Read-only: derived from `remotePermits` (hierarchical groups fan out to alpha2 sets; subdivisions auto-add the parent country). ISO 3166-1 alpha-2 codes. */
3620
3596
  remoteWorkPermitCountryCodes: string[];
3621
- /** @description Read-only derived from `remotePermits` (subdivision entries only). ISO 3166-2 codes. */
3597
+ /** @description Read-only: derived from `remotePermits` (subdivision entries only). ISO 3166-2 codes. */
3622
3598
  remoteWorkPermitSubdivisionCodes: string[];
3623
3599
  /**
3624
3600
  * @description Whether the employer sponsors visas for remote candidates. One of `yes`, `no`, or `unknown`.
@@ -3641,7 +3617,7 @@ interface components {
3641
3617
  company: components["schemas"]["JobCompany"];
3642
3618
  /** @description Physical office locations associated with the job. */
3643
3619
  officeLocations: components["schemas"]["JobOfficeLocation"][];
3644
- /** @description Resolved job categories (slug + board display name) same shape as the card; names joined server-side. */
3620
+ /** @description Resolved job categories (slug + board display name): same shape as the card; names joined server-side. */
3645
3621
  categories: {
3646
3622
  slug: string;
3647
3623
  name: string;
@@ -3656,7 +3632,7 @@ interface components {
3656
3632
  slug: string;
3657
3633
  name: string;
3658
3634
  }[];
3659
- /** @description Opaque, display-only custom-field values (CAV-294), keyed by each field's `key`. Values are the option `key`(s) for select fields, or the raw boolean/number/text otherwise resolve labels via the board's `customFields` definitions (see `GET /v1/boards/:identifier`). `{}` when the board defines no custom fields. Not filterable or searchable in v1. */
3635
+ /** @description Opaque, display-only custom-field values (CAV-294), keyed by each field's `key`. Values are the option `key`(s) for select fields, or the raw boolean/number/text otherwise. Resolve labels via the board's `customFields` definitions (see `GET /v1/boards/:identifier`). `{}` when the board defines no custom fields. Not filterable or searchable in v1. */
3660
3636
  customFieldValues: {
3661
3637
  [key: string]: string | string[] | boolean | number;
3662
3638
  };
@@ -3834,7 +3810,7 @@ interface components {
3834
3810
  */
3835
3811
  limit?: number;
3836
3812
  /**
3837
- * @description The number of jobs to skip the job catalog page offset. Takes precedence over `cursor`. `offset + limit` may not exceed 10,000.
3813
+ * @description The number of jobs to skip: the job catalog page offset. Takes precedence over `cursor`. `offset + limit` may not exceed 10,000.
3838
3814
  * @example 0
3839
3815
  */
3840
3816
  offset?: number;
@@ -3879,6 +3855,34 @@ interface components {
3879
3855
  */
3880
3856
  expiresAt?: string | null;
3881
3857
  };
3858
+ PutCandidatePaywallBody: {
3859
+ /** @enum {string} */
3860
+ object?: "candidate_paywall";
3861
+ enabled: boolean;
3862
+ previewCount: number;
3863
+ lockHeading: string;
3864
+ lockDescription: string;
3865
+ buttonText: string;
3866
+ disclaimerText: string;
3867
+ currency: string;
3868
+ perMonthLabel: string;
3869
+ savingsTemplate: string;
3870
+ offers: {
3871
+ /** @enum {string} */
3872
+ key: "daily" | "weekly" | "monthly" | "quarterly" | "yearly" | "lifetime";
3873
+ enabled: boolean;
3874
+ amountCents: number;
3875
+ isDefault: boolean;
3876
+ label?: string;
3877
+ billingLabel?: string;
3878
+ /** @enum {string} */
3879
+ kind?: "recurring" | "lifetime";
3880
+ displayOrder?: number;
3881
+ /** @enum {string|null} */
3882
+ intervalUnit?: "day" | "week" | "month" | "year" | null;
3883
+ intervalCount?: number | null;
3884
+ }[];
3885
+ };
3882
3886
  ReadReceipt: {
3883
3887
  /** @enum {string} */
3884
3888
  object: "read_receipt";
@@ -3951,9 +3955,6 @@ interface components {
3951
3955
  /** @description Human-readable display label. */
3952
3956
  label: string;
3953
3957
  };
3954
- RemoveForagerCompanyBody: {
3955
- companyUrl: string;
3956
- };
3957
3958
  RenameCouponBody: {
3958
3959
  name: string;
3959
3960
  };
@@ -3963,6 +3964,14 @@ interface components {
3963
3964
  /** @description Every stage id of the job, in the new order. */
3964
3965
  orderedStageIds: string[];
3965
3966
  };
3967
+ ReorderSalesLedPlansBody: {
3968
+ /** @description Complete active set: every non-archived plan id exactly once, with unique displayOrder values. */
3969
+ orders: {
3970
+ /** @description Cavuno sales-led plan ID from list/create. */
3971
+ id: string;
3972
+ displayOrder: number;
3973
+ }[];
3974
+ };
3966
3975
  ReplyBody: {
3967
3976
  body: string;
3968
3977
  };
@@ -3971,32 +3980,7 @@ interface components {
3971
3980
  reason: "spam" | "harassment" | "misrepresentation" | "other";
3972
3981
  freeText?: string;
3973
3982
  };
3974
- ReportSnapshot: {
3975
- /** @description Unique identifier for the snapshot. */
3976
- id: string;
3977
- /**
3978
- * @description String representing the object's type.
3979
- * @enum {string}
3980
- */
3981
- object: "report_snapshot";
3982
- /** @description The provider that produced the snapshot. */
3983
- provider: string;
3984
- /** @description The metric name. */
3985
- metric: string;
3986
- /** @description The segment (e.g. `global`, `country`). */
3987
- segment: string;
3988
- /** @description The aggregation interval (e.g. `1d`). */
3989
- interval: string;
3990
- /** @description ISO date string — inclusive start of the snapshot range. */
3991
- rangeStart: string;
3992
- /** @description ISO date string — inclusive end of the snapshot range. */
3993
- rangeEnd: string;
3994
- /** @description Provider-specific metric payload as collected. */
3995
- payload?: unknown;
3996
- };
3997
3983
  ReportingConnect: {
3998
- /** @description Provider-synthetic identifier for the connect. */
3999
- id: string;
4000
3984
  /**
4001
3985
  * @description String representing the object's type.
4002
3986
  * @enum {string}
@@ -4006,16 +3990,12 @@ interface components {
4006
3990
  provider: string;
4007
3991
  /** @description Whether the integration is already fully connected. */
4008
3992
  connected: boolean;
4009
- /** @description OAuth providers only the URL the user must visit to grant access. */
3993
+ /** @description OAuth providers only. The URL the user must visit to grant access. */
4010
3994
  authorizationUrl?: string;
4011
- /** @description Search Console only — the site-verification DNS token. */
4012
- verificationToken?: string;
4013
3995
  /** @description The board site URL the integration reports on. */
4014
3996
  siteUrl?: string;
4015
- /** @description Stripe only the Monetization settings deep link. */
3997
+ /** @description Stripe only: the Monetization settings deep link. */
4016
3998
  redirectUrl?: string;
4017
- /** @description Stripe only — why no OAuth URL is returned. */
4018
- reason?: string;
4019
3999
  };
4020
4000
  ReportingIntegration: {
4021
4001
  /** @description Unique identifier for the integration. */
@@ -4032,33 +4012,11 @@ interface components {
4032
4012
  provider: "search_console" | "adsense" | "tinybird" | "stripe" | "google_analytics";
4033
4013
  /** @description Whether collection is enabled for this integration. */
4034
4014
  enabled: boolean;
4015
+ /** @description Whether the connection has completed successfully. */
4016
+ connected: boolean;
4035
4017
  /** @description ISO-8601 timestamp of when the integration was connected. */
4036
4018
  connectedAt: string | null;
4037
- /** @description Provider-side identifier (e.g. the verified site URL). */
4038
- externalId: string | null;
4039
- /** @description OAuth scopes granted to the integration. */
4040
- scopes: string[];
4041
- settings: components["schemas"]["ReportingIntegrationSettings"];
4042
- /** @description ISO-8601 timestamp of the last successful collection. */
4043
- lastCollectedAt: string | null;
4044
- };
4045
- /** @description Provider-specific settings. The OAuth `refreshToken` and `oauthState` are always redacted. */
4046
- ReportingIntegrationSettings: {
4047
- type?: string;
4048
- siteUrl?: string;
4049
- domain?: string | null;
4050
- siteHostname?: string;
4051
- verificationToken?: string;
4052
- status?: string;
4053
- slug?: string;
4054
- inspectionUrl?: string;
4055
- lastSyncedAt?: string;
4056
- permissionLevel?: string;
4057
- platformSiteUrl?: string;
4058
- propertyUrl?: string;
4059
- adsenseAccountId?: string;
4060
- sitemapSubmitted?: boolean;
4061
- } | null;
4019
+ };
4062
4020
  ResourceLinks: {
4063
4021
  /**
4064
4022
  * Format: uri
@@ -4104,19 +4062,6 @@ interface components {
4104
4062
  /** @description OAuth client secret. May be supplied here or via HTTP Basic authentication. */
4105
4063
  client_secret?: string;
4106
4064
  };
4107
- Role: {
4108
- /** @description Unique identifier for the role. */
4109
- id: string;
4110
- /**
4111
- * @description String representing the object's type.
4112
- * @enum {string}
4113
- */
4114
- object: "role";
4115
- /** @description The role name: owner, admin, or member. */
4116
- role: string;
4117
- /** @description The permission strings granted to the role by default. */
4118
- permissions: string[];
4119
- };
4120
4065
  SalaryCompanyIndexItem: {
4121
4066
  /** @enum {string} */
4122
4067
  object: "salary_company";
@@ -4172,19 +4117,11 @@ interface components {
4172
4117
  /** @description Display price text, e.g. "Contact us". */
4173
4118
  priceText: string;
4174
4119
  ctaText: string;
4175
- /** @description The CTA target a URL, mailto:, or tel: link. */
4120
+ /** @description The CTA target: a URL, mailto:, or tel: link. */
4176
4121
  ctaDestination: string;
4177
4122
  featuredBullets: string[];
4178
4123
  displayOrder: number;
4179
4124
  };
4180
- SampleJobsBody: {
4181
- /** @description The board name. */
4182
- boardName: string;
4183
- /** @description Optional board description to tailor the sample jobs. */
4184
- boardDescription?: string;
4185
- /** @description How many sample jobs to generate (default 10, max 25). */
4186
- count?: number;
4187
- };
4188
4125
  SaveJobBody: {
4189
4126
  jobId: string;
4190
4127
  };
@@ -4193,7 +4130,7 @@ interface components {
4193
4130
  id: string;
4194
4131
  /** @enum {string} */
4195
4132
  object: "saved_job";
4196
- /** @description The saved job also the DELETE path key. */
4133
+ /** @description The saved job id. Also the DELETE path key. */
4197
4134
  jobId: string;
4198
4135
  /** Format: date-time */
4199
4136
  savedAt: string;
@@ -4267,9 +4204,10 @@ interface components {
4267
4204
  workEmail: string;
4268
4205
  };
4269
4206
  SetPlanFeaturesBody: {
4270
- /** @description Full replacement set of feature key/value pairs for the plan. */
4207
+ /** @description Full replacement set of typed Cavuno capability key/value pairs for the plan. */
4271
4208
  features: {
4272
- key: string;
4209
+ /** @enum {string} */
4210
+ key: "jobs.max_active" | "jobs.duration_days" | "jobs.featured_slots" | "jobs.feature_selection_mode" | "talent.profile_unlocks" | "talent.messages_sent";
4273
4211
  value: string;
4274
4212
  }[];
4275
4213
  };
@@ -4279,6 +4217,20 @@ interface components {
4279
4217
  /** @description Unit amount in the smallest currency unit. */
4280
4218
  amountCents: number;
4281
4219
  };
4220
+ Settings: {
4221
+ id: string;
4222
+ /** @enum {string} */
4223
+ object: "settings";
4224
+ accountId: string;
4225
+ name: string;
4226
+ slug: string;
4227
+ primaryDomainId: string | null;
4228
+ logoUrl: string | null;
4229
+ heroUrl: string | null;
4230
+ config: components["schemas"]["OperatorSettingsConfig"];
4231
+ createdAt: string;
4232
+ updatedAt: string;
4233
+ };
4282
4234
  SettingsAdsenseBody: {
4283
4235
  /** @description Whether AdSense placements are rendered on the public board. */
4284
4236
  adsenseEnabled?: boolean;
@@ -4309,30 +4261,6 @@ interface components {
4309
4261
  /** @description Plaintext password used to gate the public board. Must be at least 8 characters. Stored hashed and encrypted server-side. */
4310
4262
  password: string;
4311
4263
  };
4312
- SettingsPaywallBody: {
4313
- /** @description Whether the job-access paywall is enforced on the public board. */
4314
- jobAccessPaywallEnabled: boolean;
4315
- /** @description Number of jobs visible before the paywall locks the rest. Range 1–500. */
4316
- jobAccessPreviewCount?: number;
4317
- /** @description Heading shown on the paywall. Up to 120 characters. */
4318
- jobAccessLockHeading?: string;
4319
- /** @description Body copy shown on the paywall. Up to 600 characters. */
4320
- jobAccessLockDescription?: string;
4321
- /** @description Call-to-action label shown on the paywall. Up to 60 characters. */
4322
- jobAccessButtonText?: string;
4323
- /** @description Fine-print disclaimer shown beneath the call-to-action. Up to 200 characters. */
4324
- jobAccessDisclaimerText?: string;
4325
- /** @description Label appended to the monthly price (e.g. `/month`). Up to 60 characters. */
4326
- jobAccessPerMonthLabel?: string;
4327
- /** @description Template string used to render the savings line for annual plans. Up to 120 characters. */
4328
- jobAccessSavingsTemplate?: string;
4329
- /** @description Three-letter ISO 4217 currency code for paywall pricing. */
4330
- jobAccessCurrency?: string;
4331
- /** @description Stripe product ID associated with the paywall plan. Pass `null` to clear. */
4332
- jobAccessStripeProductId?: string | unknown | unknown;
4333
- /** @description Stripe billing-portal configuration ID used for self-serve plan management. Pass `null` to clear. */
4334
- jobAccessStripePortalConfigId?: string | unknown | unknown;
4335
- };
4336
4264
  Skill: {
4337
4265
  id: string;
4338
4266
  /** @enum {string} */
@@ -4422,9 +4350,9 @@ interface components {
4422
4350
  SkillSalaryDetail: {
4423
4351
  /** @enum {string} */
4424
4352
  object: "skill_salary_detail";
4425
- /** @description Immutable English source slug the salary-stats key. */
4353
+ /** @description Immutable English source slug: the salary-stats key. */
4426
4354
  sourceSlug: string;
4427
- /** @description Board-language canonical URL slug the starter 308 target. */
4355
+ /** @description Board-language canonical URL slug: the starter 308 target. */
4428
4356
  canonicalSlug: string;
4429
4357
  skillName: string;
4430
4358
  overallSalary: {
@@ -4603,7 +4531,7 @@ interface components {
4603
4531
  title: string;
4604
4532
  companyName: string;
4605
4533
  companyUrl: string | null;
4606
- /** @description Absolute logo URL for the company, resolved from `companyUrl` the same way the hosted profile renders it; `null` when the company has no usable website. Render a monogram/initials fallback when `null` (and on image error the URL 404s when the brand has no icon). */
4534
+ /** @description Absolute logo URL for the company, resolved from `companyUrl` the same way the hosted profile renders it; `null` when the company has no usable website. Render a monogram/initials fallback when `null` (and on image error: the URL 404s when the brand has no icon). */
4607
4535
  companyLogoUrl: string | null;
4608
4536
  location: string | null;
4609
4537
  employmentType: string | null;
@@ -4752,9 +4680,9 @@ interface components {
4752
4680
  TitleSalaryDetail: {
4753
4681
  /** @enum {string} */
4754
4682
  object: "title_salary_detail";
4755
- /** @description Immutable English source slug the salary-stats key. */
4683
+ /** @description Immutable English source slug: the salary-stats key. */
4756
4684
  sourceSlug: string;
4757
- /** @description Board-language canonical URL slug the starter 308 target. */
4685
+ /** @description Board-language canonical URL slug: the starter 308 target. */
4758
4686
  canonicalSlug: string;
4759
4687
  categoryName: string;
4760
4688
  overallSalary: {
@@ -4836,7 +4764,7 @@ interface components {
4836
4764
  client_id?: string;
4837
4765
  /** @description OAuth client secret. May be supplied here or via HTTP Basic authentication. */
4838
4766
  client_secret?: string;
4839
- /** @description Optional scope narrowing. Currently ignored issued tokens always carry the full scope registered for the client. */
4767
+ /** @description Optional scope narrowing. Currently ignored: issued tokens always carry the full scope registered for the client. */
4840
4768
  scope?: string;
4841
4769
  };
4842
4770
  TokenResponse: {
@@ -4864,7 +4792,7 @@ interface components {
4864
4792
  status: "paid" | "open" | "void" | "uncollectible";
4865
4793
  /** @enum {string} */
4866
4794
  method: "card" | "invoice";
4867
- /** @description Amount in Stripe minor units (cents for most currencies). */
4795
+ /** @description Amount in currency minor units (cents for most currencies). */
4868
4796
  amountCents: number;
4869
4797
  currency: string;
4870
4798
  description: string;
@@ -4874,7 +4802,6 @@ interface components {
4874
4802
  date: string;
4875
4803
  /** @description ISO-8601 invoice due date, or null. Past-due is client-derived from this field. */
4876
4804
  invoiceDueAt: string | null;
4877
- stripeInvoiceId: string | null;
4878
4805
  hostedInvoiceUrl: string | null;
4879
4806
  receiptUrl: string | null;
4880
4807
  methodBrand: string | null;
@@ -4882,10 +4809,6 @@ interface components {
4882
4809
  methodType: string | null;
4883
4810
  /** @enum {string|null} */
4884
4811
  publishTiming: "on_issue" | "on_payment" | null;
4885
- /** @description jobOrders id when this row is order-sourced. */
4886
- orderId: string | null;
4887
- /** @description employerSubscriptions id when this row is a subscription renewal. Cross-link: GET /v1/employer-subscriptions/:id. */
4888
- subscriptionId: string | null;
4889
4812
  };
4890
4813
  TransferOwnershipBody: {
4891
4814
  /** @description The user ID of the member who will become the primary owner. */
@@ -4929,8 +4852,8 @@ interface components {
4929
4852
  * @enum {string}
4930
4853
  */
4931
4854
  status?: "active" | "inactive";
4932
- /** @description Storage ID of an uploaded avatar image (from `POST /v1/media/upload`). Pass `null` to clear an existing avatar. */
4933
- avatarStorageId?: string | null;
4855
+ /** @description Cavuno media ID of an uploaded avatar image. Pass `null` to clear it. */
4856
+ avatarMediaId?: string | null;
4934
4857
  /** @description The author's personal website URL. Normalized to a canonical URL when stored. */
4935
4858
  websiteUrl?: string;
4936
4859
  /** @description The author's X (Twitter) profile URL. Stored as the canonical `https://x.com/<handle>` URL. */
@@ -4946,6 +4869,27 @@ interface components {
4946
4869
  /** @description The author's display name. */
4947
4870
  name?: string;
4948
4871
  };
4872
+ UpdateBackfillRuleBody: {
4873
+ name?: string;
4874
+ rules?: {
4875
+ /** @enum {string} */
4876
+ match: "any" | "all";
4877
+ conditions: {
4878
+ /** @enum {string} */
4879
+ field: "title" | "description";
4880
+ /** @enum {string} */
4881
+ operator: "contains_any" | "contains_all" | "is_not";
4882
+ terms: string[];
4883
+ }[];
4884
+ }[];
4885
+ filters?: {
4886
+ countries?: string[];
4887
+ subdivisions?: string[];
4888
+ seniorities?: ("entry_level" | "associate" | "mid_level" | "senior" | "director" | "executive")[];
4889
+ employmentTypes?: ("full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other")[];
4890
+ workplaceTypes?: ("remote" | "hybrid" | "onsite")[];
4891
+ };
4892
+ };
4949
4893
  UpdateBlogPostBody: {
4950
4894
  slug?: string;
4951
4895
  html?: string;
@@ -4954,8 +4898,8 @@ interface components {
4954
4898
  featured?: boolean;
4955
4899
  authorIds?: string[];
4956
4900
  tagIds?: string[];
4957
- coverStorageId?: string | null;
4958
- ogImageStorageId?: string | null;
4901
+ coverMediaId?: string | null;
4902
+ ogImageMediaId?: string | null;
4959
4903
  featureImageAlt?: string;
4960
4904
  featureImageCaption?: string;
4961
4905
  seoTitle?: string;
@@ -5042,16 +4986,6 @@ interface components {
5042
4986
  description?: string;
5043
4987
  sortOrder?: number;
5044
4988
  };
5045
- UpdateForagerDescriptionBody: {
5046
- description: string | null;
5047
- };
5048
- UpdateForagerSubscriptionBody: {
5049
- name?: string;
5050
- rules?: components["schemas"]["ForagerRule"][];
5051
- filters?: components["schemas"]["ForagerFilters"];
5052
- active?: boolean;
5053
- description?: string | null;
5054
- };
5055
4989
  UpdateInvitationBody: {
5056
4990
  /**
5057
4991
  * @description The new role for the pending invitation.
@@ -5082,7 +5016,7 @@ interface components {
5082
5016
  type: "worldwide" | "world_region" | "continent" | "region" | "subregion" | "subdivision" | "country" | "custom";
5083
5017
  value: string;
5084
5018
  }[];
5085
- /** @description Where remote candidates must be timezone-compatible. Each entry mirrors the `remotePermits` shape (`world_region`, `continent`, `region`, `subregion`, `country`) plus `timezone` (specific IANA name with optional `plusMinus` ±N hours expansion) and `all` (every timezone equivalent of `worldwide` for permits). The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-timezones`. **When omitted on POST**, the server auto-derives this from `remotePermits` (or `[{all,all}]` if neither was provided). **PATCH never auto-re-derives** once set, only an explicit replacement updates the stored value, even when `remotePermits` changes. Pass `[]` to clear an existing constraint. */
5019
+ /** @description Where remote candidates must be timezone-compatible. Each entry mirrors the `remotePermits` shape (`world_region`, `continent`, `region`, `subregion`, `country`) plus `timezone` (specific IANA name with optional `plusMinus` ±N hours expansion) and `all` (every timezone: equivalent of `worldwide` for permits). The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-timezones`. **When omitted on POST**, the server auto-derives this from `remotePermits` (or `[{all,all}]` if neither was provided). **PATCH never auto-re-derives**: once set, only an explicit replacement updates the stored value, even when `remotePermits` changes. Pass `[]` to clear an existing constraint. */
5086
5020
  remoteTimezones?: {
5087
5021
  /** @enum {string} */
5088
5022
  type: "all" | "world_region" | "continent" | "region" | "subregion" | "country" | "timezone";
@@ -5139,7 +5073,7 @@ interface components {
5139
5073
  officeLocations?: components["schemas"]["JobOfficeLocationInput"][];
5140
5074
  /** @description An external identifier for the job from your own system, such as an ATS requisition ID. Use this value to look up the job later via `GET /v1/jobs?externalId=...` for deduplication. Scoped per-account: two different accounts may reuse the same `externalId` without collision. Up to 255 characters. */
5141
5075
  externalId?: string;
5142
- /** @description Board-defined custom-field values, keyed by the field `key` (definitions, including type and option keys, are published at `GET /v1/settings/job-form`). Writes are **additive**: on `PATCH` a key you send is set/overwritten and a key you omit is preserved (unsent keys are never cleared); on `POST` this initializes the bag. Send a key with an intentional-empty value `null`, `""`, or `[]` to **clear** it (`""`/`null` clear any type; `[]` clears a `multi_select`); `false` and `0` are kept as real values. Values must match the field type and `single_select`/`multi_select` must use defined option **keys** (not labels); a wrong-typed value is rejected (`custom_field_wrong_type`), never silently cleared. Unknown keys are ignored. The stored bag never contains `null`/empty values. */
5076
+ /** @description Board-defined custom-field values, keyed by the field `key` (definitions, including type and option keys, are published at `GET /v1/settings/job-form`). Writes are **additive**: on `PATCH` a key you send is set/overwritten and a key you omit is preserved (unsent keys are never cleared); on `POST` this initializes the bag. Send a key with an intentional-empty value (`null`, `""`, or `[]`) to **clear** it (`""`/`null` clear any type; `[]` clears a `multi_select`); `false` and `0` are kept as real values. Values must match the field type and `single_select`/`multi_select` must use defined option **keys** (not labels); a wrong-typed value is rejected (`custom_field_wrong_type`), never silently cleared. Unknown keys are ignored. The stored bag never contains `null`/empty values. */
5143
5077
  customFieldValues?: {
5144
5078
  [key: string]: string | string[] | boolean | number | unknown | unknown;
5145
5079
  };
@@ -5169,16 +5103,6 @@ interface components {
5169
5103
  channel: "messageEmails" | "applicationEmails";
5170
5104
  subscribed: boolean;
5171
5105
  };
5172
- UpdatePaywallOfferBody: {
5173
- /** @description Enable or disable the offer. */
5174
- isEnabled?: boolean;
5175
- /** @description Alias of isEnabled (either is accepted). */
5176
- enabled?: boolean;
5177
- label?: string;
5178
- billingLabel?: string;
5179
- displayOrder?: number;
5180
- isDefault?: boolean;
5181
- };
5182
5106
  UpdatePipelineStageBody: {
5183
5107
  label?: string;
5184
5108
  hidden?: boolean;
@@ -5201,6 +5125,20 @@ interface components {
5201
5125
  /** @description HTTP status code. One of `301` or `302`. */
5202
5126
  statusCode?: 301 | 302;
5203
5127
  };
5128
+ UpdateSalesLedPlanBody: {
5129
+ name: string;
5130
+ description: string;
5131
+ priceText: string;
5132
+ ctaText: string;
5133
+ /** @description Email address or URL. Bare emails become mailto:; bare domains become https://. */
5134
+ ctaDestination: string;
5135
+ /** @description Up to five feature bullets shown on the pricing card. */
5136
+ featuredBullets: string[];
5137
+ /** @description Whether the plan is shown on the public employer pricing page. */
5138
+ isPublic: boolean;
5139
+ /** @description Sort order among active sales-led plans (lower first). */
5140
+ displayOrder: number;
5141
+ };
5204
5142
  UpdateSkillBody: {
5205
5143
  name?: string;
5206
5144
  slug?: string;
@@ -5227,21 +5165,26 @@ interface components {
5227
5165
  name?: string;
5228
5166
  };
5229
5167
  Usage: {
5230
- /** @description Unique identifier for the object. Equal to the account ID — usage is a per-account singleton. */
5231
- id: string;
5232
5168
  /**
5233
5169
  * @description String representing the object's type. Objects of the same type share the same value.
5234
5170
  * @enum {string}
5235
5171
  */
5236
5172
  object: "usage";
5237
- /** @description Number of jobs currently in `published` status. */
5238
- activeJobs: number;
5239
- /** @description Plan-enforced cap on the number of published jobs. */
5240
- activeJobsLimit: number;
5241
- /** @description Number of additional jobs the account may publish before hitting the limit. */
5242
- available: number;
5243
- /** @description Slug of the account's current plan. */
5244
- plan: string;
5173
+ /** @description Typed product capacities for active jobs, confirmed subscribers, and team seats. */
5174
+ capacities: components["schemas"]["UsageCapacity"][];
5175
+ };
5176
+ UsageCapacity: {
5177
+ /**
5178
+ * @description Stable capacity key matching the dashboard: active_jobs, confirmed_subscribers, or team_seats.
5179
+ * @enum {string}
5180
+ */
5181
+ key: "active_jobs" | "confirmed_subscribers" | "team_seats";
5182
+ /** @description Current usage for this capacity. Never negative. */
5183
+ used: number;
5184
+ /** @description Effective plan or override cap. Null when the capacity is unlimited. */
5185
+ limit: number | null;
5186
+ /** @description Slots remaining before the limit. Null when unlimited; never negative when finite. */
5187
+ remaining: number | null;
5245
5188
  };
5246
5189
  VerifyEmailOtpBody: {
5247
5190
  code: string;