@cavuno/board 1.38.0 → 1.40.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.
Files changed (45) hide show
  1. package/README.md +7 -0
  2. package/dist/{jobs-DMH3Ytoq.d.mts → _spec-DRbgPIlN.d.mts} +404 -96
  3. package/dist/{jobs-DMH3Ytoq.d.ts → _spec-DRbgPIlN.d.ts} +404 -96
  4. package/dist/bin.mjs +242 -18
  5. package/dist/{board-CBry4f7H.d.mts → board-BxPUtrOl.d.ts} +1 -1
  6. package/dist/{board-tV-zcaHs.d.ts → board-DCiNpgFf.d.mts} +1 -1
  7. package/dist/doctor.js +238 -14
  8. package/dist/doctor.mjs +238 -14
  9. package/dist/filters.d.mts +18 -4
  10. package/dist/filters.d.ts +18 -4
  11. package/dist/filters.js +17 -0
  12. package/dist/filters.mjs +17 -0
  13. package/dist/format.d.mts +3 -2
  14. package/dist/format.d.ts +3 -2
  15. package/dist/index.d.mts +62 -73
  16. package/dist/index.d.ts +62 -73
  17. package/dist/index.js +71 -1
  18. package/dist/index.mjs +71 -1
  19. package/dist/jobs-DAGAVHQL.d.ts +105 -0
  20. package/dist/jobs-DhePKSRe.d.mts +105 -0
  21. package/dist/{salaries-CaGlcCC6.d.ts → salaries-D6SUVMmt.d.mts} +2 -1
  22. package/dist/{salaries-01g4wK8y.d.mts → salaries-cqb78kg0.d.ts} +2 -1
  23. package/dist/search-BalPAS0P.d.ts +81 -0
  24. package/dist/search-DYUQzCq_.d.mts +81 -0
  25. package/dist/seo.d.mts +4 -3
  26. package/dist/seo.d.ts +4 -3
  27. package/dist/server.d.mts +56 -4
  28. package/dist/server.d.ts +56 -4
  29. package/dist/server.js +41 -0
  30. package/dist/server.mjs +41 -0
  31. package/dist/sitemap.d.mts +5 -3
  32. package/dist/sitemap.d.ts +5 -3
  33. package/dist/suggest.d.mts +70 -0
  34. package/dist/suggest.d.ts +70 -0
  35. package/dist/suggest.js +165 -0
  36. package/dist/suggest.mjs +144 -0
  37. package/dist/theme.d.mts +49 -1
  38. package/dist/theme.d.ts +49 -1
  39. package/dist/theme.js +60 -26
  40. package/dist/theme.mjs +60 -26
  41. package/package.json +11 -1
  42. package/skills/cavuno-board-filters/SKILL.md +11 -4
  43. package/skills/cavuno-board-jobs/SKILL.md +18 -2
  44. package/skills/cavuno-board-suggest/SKILL.md +119 -0
  45. package/skills/manifest.json +9 -2
package/README.md CHANGED
@@ -39,6 +39,13 @@ const board = createBoardClient({
39
39
  const { name, theme, features } = await board.context();
40
40
  const page = await board.jobs.list({ limit: 20 });
41
41
  const job = await board.jobs.retrieve('senior-chef');
42
+
43
+ // Federated search-dropdown suggestions (companies + taxonomy terms).
44
+ const { items } = await board.search.suggest({ q: 'acme', limit: 10 });
45
+ // Or the headless controller (debounce / abort / stale-drop built in):
46
+ // import { createSuggestController } from '@cavuno/board/suggest';
47
+ // const suggest = createSuggestController(board);
48
+ // suggest.setQuery('acme');
42
49
  ```
43
50
 
44
51
  Every method accepts trailing `FetchOptions` — `signal`, `headers`, and
@@ -86,6 +86,31 @@ interface components {
86
86
  */
87
87
  admin: string;
88
88
  };
89
+ AdminPlan: {
90
+ /** @description Unique identifier for the plan. */
91
+ id: string;
92
+ /** @enum {string} */
93
+ object: "plan";
94
+ name: string;
95
+ description: string | null;
96
+ kind: string;
97
+ /**
98
+ * @description Subscription billing interval. Required for kind=subscription.
99
+ * @enum {string|null}
100
+ */
101
+ billingInterval: "month" | "year" | null;
102
+ /**
103
+ * @description Whether the plan grants job-posting or talent-access entitlement.
104
+ * @enum {string}
105
+ */
106
+ purpose: "job_posting" | "talent_access";
107
+ isPublic: boolean;
108
+ isRecommended: boolean;
109
+ isArchived: boolean;
110
+ displayOrder: number | null;
111
+ price: components["schemas"]["PlanPrice"];
112
+ features: components["schemas"]["PlanFeature"][];
113
+ };
89
114
  AiUsage: {
90
115
  id: string;
91
116
  /** @enum {string} */
@@ -276,6 +301,37 @@ interface components {
276
301
  resourceId: string;
277
302
  })[];
278
303
  };
304
+ BillingCheckout: {
305
+ /** @enum {string} */
306
+ object: "billing_checkout";
307
+ funding: components["schemas"]["BillingHostedCheckoutFunding"];
308
+ /**
309
+ * Format: uri
310
+ * @description Hosted Stripe Checkout Session URL.
311
+ */
312
+ url: string;
313
+ /** @description Stripe Checkout Session id (cs_…). */
314
+ sessionId: string;
315
+ /**
316
+ * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
317
+ * @enum {string}
318
+ */
319
+ planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
320
+ /** @enum {string} */
321
+ interval: "monthly" | "annual";
322
+ };
323
+ BillingCheckoutBody: {
324
+ /**
325
+ * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
326
+ * @enum {string}
327
+ */
328
+ planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
329
+ /**
330
+ * @description Billing interval. Defaults to monthly when omitted.
331
+ * @enum {string}
332
+ */
333
+ interval?: "monthly" | "annual";
334
+ };
279
335
  BillingConnect: {
280
336
  /** @enum {string} */
281
337
  object: "billing_connect";
@@ -314,6 +370,14 @@ interface components {
314
370
  canRemoveBranding: boolean;
315
371
  apiAccess: boolean;
316
372
  };
373
+ BillingHostedCheckoutFunding: {
374
+ /** @enum {string} */
375
+ type: "hosted_checkout";
376
+ };
377
+ BillingSavedPmFunding: {
378
+ /** @enum {string} */
379
+ type: "saved_pm";
380
+ };
317
381
  BillingSubscription: {
318
382
  /** @enum {string} */
319
383
  object: "billing_subscription";
@@ -331,6 +395,47 @@ interface components {
331
395
  stripePriceId: string;
332
396
  quantity: number;
333
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";
410
+ };
411
+ BillingUpgradeCheckoutRequired: {
412
+ /** @enum {string} */
413
+ object: "billing_upgrade";
414
+ funding: components["schemas"]["BillingHostedCheckoutFunding"];
415
+ /** @enum {string} */
416
+ status: "checkout_required";
417
+ /** Format: uri */
418
+ url: string;
419
+ sessionId: string;
420
+ /**
421
+ * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
422
+ * @enum {string}
423
+ */
424
+ planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
425
+ };
426
+ BillingUpgradeSavedPm: {
427
+ /** @enum {string} */
428
+ object: "billing_upgrade";
429
+ funding: components["schemas"]["BillingSavedPmFunding"];
430
+ /** @enum {string} */
431
+ status: "upgraded";
432
+ /**
433
+ * @description Self-serve plan key. enterprise is not self-serve and returns plan_not_self_serve.
434
+ * @enum {string}
435
+ */
436
+ planKey: "starter" | "basic" | "grow" | "advanced" | "enterprise";
437
+ stripeSubscriptionId: string;
438
+ };
334
439
  Block: {
335
440
  /** @enum {string} */
336
441
  object: "block";
@@ -962,6 +1067,25 @@ interface components {
962
1067
  boardP75Max: number | null;
963
1068
  currency: string;
964
1069
  };
1070
+ CompanySuggestion: {
1071
+ /** @enum {string} */
1072
+ object: "suggestion";
1073
+ /**
1074
+ * @description discriminator enum property added by openapi-typescript
1075
+ * @enum {string}
1076
+ */
1077
+ type: "company";
1078
+ /** @description Stable company identity. */
1079
+ id: string;
1080
+ /** @description Public company URL slug. */
1081
+ slug: string;
1082
+ /** @description Company display name. */
1083
+ name: string;
1084
+ /** @description Company logo URL, or `null` when none is set. */
1085
+ logoUrl: string | null;
1086
+ /** @description Live published-job count for this company on the board. */
1087
+ jobCount: number;
1088
+ };
965
1089
  CompanySummary: {
966
1090
  /** @description Unique identifier for the object. Use this value as the `{id}` path parameter for the company endpoints (e.g. `GET /v1/companies/{id}`). */
967
1091
  id: string;
@@ -1071,6 +1195,21 @@ interface components {
1071
1195
  object: "conversation_ref";
1072
1196
  conversationId: string | null;
1073
1197
  };
1198
+ Coupon: {
1199
+ id: string;
1200
+ /** @enum {string} */
1201
+ object: "coupon";
1202
+ name: string | null;
1203
+ percentOff: number | null;
1204
+ amountOff: number | null;
1205
+ currency: string | null;
1206
+ duration: string;
1207
+ durationInMonths: number | null;
1208
+ valid: boolean;
1209
+ appliesTo: string[] | null;
1210
+ timesRedeemed: number;
1211
+ created: string;
1212
+ };
1074
1213
  CreateAuthorBody: {
1075
1214
  /** @description URL-friendly slug for the author. Auto-generated from `name` when omitted. */
1076
1215
  slug?: string;
@@ -1152,6 +1291,20 @@ interface components {
1152
1291
  /** @description URL-friendly slug for the company. Auto-generated from `name` when omitted. */
1153
1292
  slug?: string;
1154
1293
  };
1294
+ CreateCouponBody: {
1295
+ name: string;
1296
+ percentOff?: number | null;
1297
+ /** @description Fixed discount in the currency major unit (e.g. 10 for $10, 1000 for ¥1000). Required with `currency` when there is no percentOff. */
1298
+ amountOff?: number | null;
1299
+ currency?: string | null;
1300
+ /** @enum {string} */
1301
+ duration: "once" | "forever" | "repeating";
1302
+ durationInMonths?: number;
1303
+ maxRedemptions?: number;
1304
+ /** @description Unix ms deadline after which the coupon cannot be redeemed. */
1305
+ redeemBy?: number;
1306
+ appliesToPlanIds?: string[];
1307
+ };
1155
1308
  CreateDomainBody: {
1156
1309
  /** @description Hostname to bind to this board, for example jobs.acme.com. Labels may contain letters, numbers, and hyphens, and may not start or end with a hyphen. The API normalizes accepted hostnames to lowercase before writing. */
1157
1310
  domain: string;
@@ -1183,6 +1336,15 @@ interface components {
1183
1336
  description?: string;
1184
1337
  sortOrder?: number;
1185
1338
  };
1339
+ CreateFeatureBody: {
1340
+ /** @description Stable feature key, e.g. jobs.max_active. */
1341
+ key: string;
1342
+ name: string;
1343
+ /** @description Value data type, e.g. integer or string. */
1344
+ dataType: string;
1345
+ description?: string;
1346
+ defaultValue?: string;
1347
+ };
1186
1348
  CreateForagerSubscriptionBody: {
1187
1349
  name: string;
1188
1350
  rules: components["schemas"]["ForagerRule"][];
@@ -1390,6 +1552,43 @@ interface components {
1390
1552
  /** @description The stage label. */
1391
1553
  label: string;
1392
1554
  };
1555
+ CreatePlanBody: {
1556
+ /** @description Display name for the plan. */
1557
+ name: string;
1558
+ /** @description Optional plan description. */
1559
+ description?: string;
1560
+ /**
1561
+ * @description Plan billing kind.
1562
+ * @enum {string}
1563
+ */
1564
+ kind: "free" | "one_time" | "bundle" | "subscription";
1565
+ /**
1566
+ * @description Subscription billing interval. Required for kind=subscription.
1567
+ * @enum {string}
1568
+ */
1569
+ billingInterval?: "month" | "year";
1570
+ /**
1571
+ * @description Whether the plan grants job-posting or talent-access entitlement.
1572
+ * @enum {string}
1573
+ */
1574
+ purpose?: "job_posting" | "talent_access";
1575
+ /** @description Whether the plan is publicly listed. Defaults to false. */
1576
+ isPublic?: boolean;
1577
+ isRecommended?: boolean;
1578
+ displayOrder?: number;
1579
+ };
1580
+ CreatePromotionCodeBody: {
1581
+ code: string;
1582
+ maxRedemptions?: number;
1583
+ /**
1584
+ * Format: date-time
1585
+ * @description ISO-8601 expiry; converted to epoch seconds for Stripe.
1586
+ */
1587
+ expiresAt?: string;
1588
+ firstTimeTransaction?: boolean;
1589
+ minimumAmount?: number;
1590
+ minimumAmountCurrency?: string;
1591
+ };
1393
1592
  CreateRedirectBody: {
1394
1593
  /** @description Source path to match, for example `/old-careers`. */
1395
1594
  fromPath: string;
@@ -1900,6 +2099,25 @@ interface components {
1900
2099
  hidden: boolean;
1901
2100
  position: number;
1902
2101
  };
2102
+ EmployerSubscription: {
2103
+ id: string;
2104
+ /** @enum {string} */
2105
+ object: "employer_subscription";
2106
+ employerEmail: string;
2107
+ companyId: string | null;
2108
+ companyName: string | null;
2109
+ planId: string | null;
2110
+ planName: string | null;
2111
+ status: string;
2112
+ /** @description ISO-8601 period end, or null. */
2113
+ currentPeriodEnd: string | null;
2114
+ cancelAtPeriodEnd: boolean;
2115
+ /** @description ISO-8601 creation time. */
2116
+ createdAt: string;
2117
+ stripeCustomerId: string | null;
2118
+ stripeSubscriptionId: string | null;
2119
+ };
2120
+ EmployerSubscriptionOrNull: components["schemas"]["EmployerSubscription"] | unknown | unknown;
1903
2121
  EmployerUpdateJobBody: {
1904
2122
  /** @description Long-form description of the role. Up to 25,000 characters. */
1905
2123
  description?: string;
@@ -1973,6 +2191,17 @@ interface components {
1973
2191
  /** @description The job title. */
1974
2192
  title?: string;
1975
2193
  };
2194
+ FeatureDefinition: {
2195
+ id: string;
2196
+ /** @enum {string} */
2197
+ object: "feature";
2198
+ key: string;
2199
+ name: string;
2200
+ description: string | null;
2201
+ dataType: string;
2202
+ defaultValue: string | null;
2203
+ isSystem: boolean;
2204
+ };
1976
2205
  FindOrCreateCompanyBody: {
1977
2206
  /** @description The company's display name. */
1978
2207
  name: string;
@@ -2891,6 +3120,10 @@ interface components {
2891
3120
  requireApprovalAggregatedJobs?: boolean;
2892
3121
  /** @description Whether visitors must sign in to view jobs. */
2893
3122
  registrationWallEnabled?: boolean;
3123
+ /** @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`. */
3124
+ nativeApplicationsEnabled?: boolean;
3125
+ /** @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`. */
3126
+ applicantMessagingEnabled?: boolean;
2894
3127
  /** @description Legacy shorthand for the talent directory. `true` maps to `talentDirectoryVisibility: "public"`; `false` maps to `"off"`. Prefer the tri-state field. Providing both with conflicting values returns `settings_conflicting_fields`. */
2895
3128
  talentDirectoryEnabled?: boolean;
2896
3129
  /**
@@ -2937,6 +3170,34 @@ interface components {
2937
3170
  [key: string]: unknown;
2938
3171
  };
2939
3172
  };
3173
+ PaywallGrantAdmin: {
3174
+ id: string;
3175
+ /** @enum {string} */
3176
+ object: "paywall_grant";
3177
+ boardUserId: string;
3178
+ email: string;
3179
+ displayName: string;
3180
+ /** @enum {string} */
3181
+ kind: "recurring" | "one_time";
3182
+ offerKey: string;
3183
+ status: string;
3184
+ stripeCustomerId: string | null;
3185
+ stripeSubscriptionId: string | null;
3186
+ amountCents: number;
3187
+ currency: string;
3188
+ currentPeriodStart: string | null;
3189
+ currentPeriodEnd: string | null;
3190
+ cancelAtPeriodEnd: boolean;
3191
+ activatedAt: string | null;
3192
+ canceledAt: string | null;
3193
+ createdAt: string;
3194
+ };
3195
+ PaywallGrantCount: {
3196
+ /** @enum {string} */
3197
+ object: "paywall_grant_count";
3198
+ cancelableRecurring: number;
3199
+ windingDownRecurring: number;
3200
+ };
2940
3201
  PaywallOffer: {
2941
3202
  /** @enum {string} */
2942
3203
  object: "paywall_offer";
@@ -2955,6 +3216,26 @@ interface components {
2955
3216
  intervalCount: number | null;
2956
3217
  isDefault: boolean;
2957
3218
  };
3219
+ PaywallOfferAdmin: {
3220
+ id: string;
3221
+ /** @enum {string} */
3222
+ object: "paywall_offer";
3223
+ offerKey: string;
3224
+ label: string | null;
3225
+ billingLabel: string | null;
3226
+ /** @enum {string} */
3227
+ kind: "recurring" | "one_time";
3228
+ intervalUnit: string | null;
3229
+ intervalCount: number | null;
3230
+ amountCents: number;
3231
+ currency: string;
3232
+ stripePriceId: string | null;
3233
+ enabled: boolean;
3234
+ isDefault: boolean;
3235
+ displayOrder: number;
3236
+ createdAt: string;
3237
+ };
3238
+ PaywallOfferAdminOrNull: components["schemas"]["PaywallOfferAdmin"] | unknown | unknown;
2958
3239
  Permission: {
2959
3240
  /** @description Unique identifier for the permission. */
2960
3241
  id: string;
@@ -3003,6 +3284,36 @@ interface components {
3003
3284
  messagesPerPeriod: string;
3004
3285
  };
3005
3286
  };
3287
+ PlanFeature: {
3288
+ /** @description Stable feature key, e.g. jobs.max_active. */
3289
+ key: string;
3290
+ name: string | null;
3291
+ value: string | null;
3292
+ dataType: string | null;
3293
+ };
3294
+ PlanFeatureValue: {
3295
+ key: string;
3296
+ value: string;
3297
+ };
3298
+ /** @description The plan single active price, or null when no price has been set. */
3299
+ PlanPrice: {
3300
+ /** @description ISO 4217 currency code, lowercase. */
3301
+ currency: string;
3302
+ /** @description Unit amount in the smallest currency unit. */
3303
+ amountCents: number;
3304
+ stripePriceId: string | null;
3305
+ stripeProductId: string | null;
3306
+ isActive: boolean;
3307
+ } | null;
3308
+ PromotionCode: {
3309
+ id: string;
3310
+ /** @enum {string} */
3311
+ object: "promotion_code";
3312
+ code: string;
3313
+ couponId: string;
3314
+ active: boolean;
3315
+ created: string;
3316
+ };
3006
3317
  PublicBlogAdjacentPosts: {
3007
3318
  /** @enum {string} */
3008
3319
  object: "blog_adjacent_posts";
@@ -3096,6 +3407,10 @@ interface components {
3096
3407
  publicJobSubmission: boolean;
3097
3408
  candidatePaywall: boolean;
3098
3409
  impressum: boolean;
3410
+ /** @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. */
3411
+ nativeApplications: boolean;
3412
+ /** @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. */
3413
+ messaging: boolean;
3099
3414
  };
3100
3415
  /**
3101
3416
  * @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.
@@ -3449,6 +3764,8 @@ interface components {
3449
3764
  filters?: {
3450
3765
  /** @description Only return jobs at any of the given company IDs. Up to 10 values. */
3451
3766
  companyId?: string[];
3767
+ /** @description Company slugs (the public URL identity). Up to 10. Resolved server-side; unknown slugs are dropped. Combined with `companyId` as a union. If the provided company filter resolves to no known companies, the result is empty. */
3768
+ companySlug?: string[];
3452
3769
  /** @description Only return jobs with any of the given remote-work options. Up to 10 values. */
3453
3770
  remoteOption?: ("on_site" | "hybrid" | "remote")[];
3454
3771
  /** @description Only return jobs with any of the given employment types. Up to 10 values. */
@@ -3601,6 +3918,9 @@ interface components {
3601
3918
  RemoveForagerCompanyBody: {
3602
3919
  companyUrl: string;
3603
3920
  };
3921
+ RenameCouponBody: {
3922
+ name: string;
3923
+ };
3604
3924
  ReorderPipelineStagesBody: {
3605
3925
  /** @description The job whose stages are reordered. */
3606
3926
  jobId: string;
@@ -3910,6 +4230,19 @@ interface components {
3910
4230
  /** Format: email */
3911
4231
  workEmail: string;
3912
4232
  };
4233
+ SetPlanFeaturesBody: {
4234
+ /** @description Full replacement set of feature key/value pairs for the plan. */
4235
+ features: {
4236
+ key: string;
4237
+ value: string;
4238
+ }[];
4239
+ };
4240
+ SetPlanPriceBody: {
4241
+ /** @description ISO 4217 currency code (e.g. usd). */
4242
+ currency: string;
4243
+ /** @description Unit amount in the smallest currency unit. */
4244
+ amountCents: number;
4245
+ };
3913
4246
  SettingsAdsenseBody: {
3914
4247
  /** @description Whether AdSense placements are rendered on the public board. */
3915
4248
  adsenseEnabled?: boolean;
@@ -4120,6 +4453,9 @@ interface components {
4120
4453
  StartConversationBody: {
4121
4454
  candidateBoardUserId: string;
4122
4455
  body: string;
4456
+ } | {
4457
+ candidateHandle: string;
4458
+ body: string;
4123
4459
  };
4124
4460
  Subscriber: {
4125
4461
  /** @description Unique identifier for the subscriber. */
@@ -4172,6 +4508,27 @@ interface components {
4172
4508
  createdAt: string;
4173
4509
  })[];
4174
4510
  };
4511
+ SuggestResult: {
4512
+ /** @enum {string} */
4513
+ object: "suggest_result";
4514
+ /** @description The trimmed query string that produced these suggestions. */
4515
+ query: string;
4516
+ /** @description Interleaved company + taxonomy-term suggestions. Order is server-ranked; clients must not re-sort. */
4517
+ items: components["schemas"]["SuggestionItem"][];
4518
+ };
4519
+ SuggestionItem: components["schemas"]["CompanySuggestion"] | components["schemas"]["TermSuggestion"];
4520
+ TalentAccess: {
4521
+ /** @enum {string} */
4522
+ object: "talent_access";
4523
+ /** @description Whether the viewer has an approved company membership on this board. */
4524
+ isEmployer: boolean;
4525
+ /** @description Whether this board sells talent access (a public `talent_access` plan exists). When `false` the talent surfaces are not credit-gated for employers. */
4526
+ paywallActive: boolean;
4527
+ /** @description The CTA answer: the viewer is an approved employer AND either the board has no talent paywall or one of their companies holds an active talent_access subscription or a succeeded credit pack. Always `false` for candidates; anonymous viewers get 401. */
4528
+ hasTalentAccess: boolean;
4529
+ /** @description True when any active talent_access subscription carries the unlimited profile-unlock sentinel on its feature snapshot. */
4530
+ hasUnlimitedUnlocks: boolean;
4531
+ };
4175
4532
  TalentDirectoryEntry: {
4176
4533
  /** @enum {string} */
4177
4534
  object: "talent_directory_entry";
@@ -4210,6 +4567,8 @@ interface components {
4210
4567
  title: string;
4211
4568
  companyName: string;
4212
4569
  companyUrl: string | null;
4570
+ /** @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). */
4571
+ companyLogoUrl: string | null;
4213
4572
  location: string | null;
4214
4573
  employmentType: string | null;
4215
4574
  locationType: string | null;
@@ -4225,6 +4584,8 @@ interface components {
4225
4584
  education: {
4226
4585
  institutionName: string;
4227
4586
  institutionUrl: string | null;
4587
+ /** @description Absolute logo URL for the institution, resolved from `institutionUrl` the same way the hosted profile renders it; `null` when the institution has no usable website. Render a monogram/initials fallback when `null` (and on image error). */
4588
+ institutionLogoUrl: string | null;
4228
4589
  degree: string | null;
4229
4590
  fieldOfStudy: string | null;
4230
4591
  grade: string | null;
@@ -4254,6 +4615,28 @@ interface components {
4254
4615
  locality: string | null;
4255
4616
  placeType: string | null;
4256
4617
  } | null;
4618
+ TermSuggestion: {
4619
+ /** @enum {string} */
4620
+ object: "suggestion";
4621
+ /**
4622
+ * @description discriminator enum property added by openapi-typescript
4623
+ * @enum {string}
4624
+ */
4625
+ type: "term";
4626
+ /**
4627
+ * @description Whether this taxonomy term is a category or a skill.
4628
+ * @enum {string}
4629
+ */
4630
+ termType: "category" | "skill";
4631
+ /** @description Stable taxonomy entity ID. */
4632
+ id: string;
4633
+ /** @description Current source-locale slug used by job search; old slugs may remain aliases. */
4634
+ sourceSlug: string;
4635
+ /** @description Board-language canonical URL slug. */
4636
+ canonicalSlug: string;
4637
+ /** @description Board-language name with source-name fallback. */
4638
+ displayName: string;
4639
+ };
4257
4640
  TitleLocationSalary: {
4258
4641
  /** @enum {string} */
4259
4642
  object: "title_location_salary";
@@ -4717,10 +5100,30 @@ interface components {
4717
5100
  channel: "messageEmails" | "applicationEmails";
4718
5101
  subscribed: boolean;
4719
5102
  };
5103
+ UpdatePaywallOfferBody: {
5104
+ /** @description Enable or disable the offer. */
5105
+ isEnabled?: boolean;
5106
+ /** @description Alias of isEnabled (either is accepted). */
5107
+ enabled?: boolean;
5108
+ label?: string;
5109
+ billingLabel?: string;
5110
+ displayOrder?: number;
5111
+ isDefault?: boolean;
5112
+ };
4720
5113
  UpdatePipelineStageBody: {
4721
5114
  label?: string;
4722
5115
  hidden?: boolean;
4723
5116
  };
5117
+ UpdatePlanBody: {
5118
+ name?: string;
5119
+ description?: string;
5120
+ /** @description Publish/unpublish the plan. */
5121
+ isPublic?: boolean;
5122
+ isRecommended?: boolean;
5123
+ /** @description Archive the plan (soft-delete). There is no hard DELETE. */
5124
+ isArchived?: boolean;
5125
+ displayOrder?: number;
5126
+ };
4724
5127
  UpdateRedirectBody: {
4725
5128
  /** @description Source path to match, for example `/old-careers`. */
4726
5129
  fromPath?: string;
@@ -4784,99 +5187,4 @@ interface components {
4784
5187
 
4785
5188
  type Schemas = components['schemas'];
4786
5189
 
4787
- /**
4788
- * Stripe-shaped success envelopes (`01-conventions.md` §5.1). The
4789
- * server MAY add top-level fields; consumers MUST ignore unknown
4790
- * fields.
4791
- */
4792
- /**
4793
- * Optional offset-pagination metadata generated from the Board API contract.
4794
- * `nextCursor` is preserved alongside for forward cursor iteration.
4795
- */
4796
- type OffsetPagination = Schemas['OffsetPagination'];
4797
- /** @deprecated Use `OffsetPagination`. */
4798
- type StorefrontPagination = OffsetPagination;
4799
- /** @deprecated Use `OffsetPagination`. */
4800
- type JobCatalogPagination = OffsetPagination;
4801
- type ListEnvelope<T> = OffsetPagination & {
4802
- object: 'list';
4803
- url: string;
4804
- hasMore: boolean;
4805
- /** `null` when `hasMore` is false — always present, never undefined. */
4806
- nextCursor: string | null;
4807
- data: T[];
4808
- };
4809
- type SearchEnvelope<T> = OffsetPagination & {
4810
- object: 'search_result';
4811
- url: string;
4812
- hasMore: boolean;
4813
- nextCursor: string | null;
4814
- data: T[];
4815
- };
4816
-
4817
- type PublicJob = Schemas['PublicJob'];
4818
- type PublicJobCard = Schemas['PublicJobCard'];
4819
- /**
4820
- * A job's opaque, display-only custom-field values (CAV-294), keyed by each
4821
- * field's `key`. Resolve labels via the board's `CustomFieldDefinition`s
4822
- * (`board.context().customFields`).
4823
- */
4824
- type CustomFieldValues = PublicJob['customFieldValues'];
4825
- type CustomFieldValue = CustomFieldValues[string];
4826
- type JobCompany = Schemas['JobCompany'];
4827
- type OfficeLocation = Schemas['JobOfficeLocation'];
4828
- type RemoteOption = NonNullable<PublicJob['remoteOption']>;
4829
- type EmploymentType = NonNullable<PublicJob['employmentType']>;
4830
- type Seniority = NonNullable<PublicJob['seniority']>;
4831
- /** Candidate-facing result ordering (ADR-0048); `relevance` is the default. */
4832
- type JobSort = NonNullable<Schemas['PublicSearchJobsBody']['sort']>;
4833
- type EducationRequirement = PublicJob['educationRequirements'][number];
4834
- type RemotePermit = PublicJob['remotePermits'][number];
4835
- type RemoteTimezone = PublicJob['remoteTimezones'][number];
4836
- /**
4837
- * Derived suggestion on a browse list (ADR-0037 §8): jobs surface `category`
4838
- * and `skill` terms; the companies list surfaces `market` terms.
4839
- */
4840
- interface RelatedSearch {
4841
- type: 'category' | 'skill' | 'market';
4842
- slug: string;
4843
- term: string;
4844
- count: number;
4845
- }
4846
- /** The browse list envelope — `PublicJobCard`s + job catalog pagination + `relatedSearches`. */
4847
- type JobCardListEnvelope = ListEnvelope<PublicJobCard> & {
4848
- relatedSearches?: RelatedSearch[];
4849
- };
4850
- /** The search envelope — `PublicJobCard`s + job catalog pagination. */
4851
- type JobCardSearchEnvelope = SearchEnvelope<PublicJobCard>;
4852
- type JobsListQuery = {
4853
- cursor?: string;
4854
- /** 1–100. */
4855
- limit?: number;
4856
- /** Job catalog page offset; takes precedence over `cursor`. `offset + limit` ≤ 10,000. */
4857
- offset?: number;
4858
- /** Repeated param (up to 10) — OR-matched. Repeat `companyId` per value. */
4859
- companyId?: string[];
4860
- remoteOption?: RemoteOption[];
4861
- employmentType?: EmploymentType[];
4862
- seniority?: Seniority[];
4863
- /** Result ordering (ADR-0048). Absent ⇒ `relevance` (the featured-ranked browse). */
4864
- sort?: JobSort;
4865
- /** Place slug for a geo radius search; unresolvable slugs are ignored. */
4866
- location?: string;
4867
- /** Radius in km around `location` (10–250; default 50). */
4868
- radius?: number;
4869
- /** Category slug seed (the `/jobs/[keyword]` page) — server resolves it to the English source name; unresolvable → 404. */
4870
- category?: string;
4871
- /** Skill slug seed (the `/jobs/skills/[skill]` page) — server-resolved; unresolvable → 404. */
4872
- skill?: string;
4873
- /** Sparse fieldset (Medusa-style `+field`). Only `'+description'` is supported — adds `description` to each card. */
4874
- fields?: string;
4875
- };
4876
- type JobsSimilarQuery = {
4877
- /** How many similar jobs to return (1–20; default 5). */
4878
- limit?: number;
4879
- };
4880
- type JobsSearchBody = Schemas['PublicSearchJobsBody'];
4881
-
4882
- export type { CustomFieldValues as C, EmploymentType as E, JobSort as J, ListEnvelope as L, OfficeLocation as O, PublicJob as P, RemoteOption as R, Seniority as S, PublicJobCard as a, Schemas as b, components as c, JobsListQuery as d, JobCardListEnvelope as e, JobsSearchBody as f, JobCardSearchEnvelope as g, JobsSimilarQuery as h, SearchEnvelope as i, CustomFieldValue as j, EducationRequirement as k, JobCatalogPagination as l, JobCompany as m, OffsetPagination as n, RelatedSearch as o, RemotePermit as p, RemoteTimezone as q, StorefrontPagination as r };
5190
+ export type { Schemas as S, components as c };