@cavuno/board 4.51.0 → 4.53.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 (44) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/dist/{_spec-Pr6ZvyW_.d.mts → _spec-B4TxcV4W.d.mts} +83 -0
  3. package/dist/{_spec-Pr6ZvyW_.d.ts → _spec-B4TxcV4W.d.ts} +83 -0
  4. package/dist/{blog-D-MQEaMU.d.mts → blog-BYuzCPFi.d.mts} +1 -1
  5. package/dist/{blog-BBBiKhsA.d.ts → blog-C1nsaLmM.d.ts} +1 -1
  6. package/dist/{board-C6PEXL7n.d.mts → board-BtipyMwh.d.ts} +8 -2
  7. package/dist/{board-CaZu8nEl.d.ts → board-j0KFqNBp.d.mts} +8 -2
  8. package/dist/{breadcrumbs-WcxTd2Ka.d.mts → breadcrumbs-BCEsjVMn.d.mts} +4 -3
  9. package/dist/{breadcrumbs-DIIA4MaX.d.ts → breadcrumbs-BKpfMLqi.d.ts} +4 -3
  10. package/dist/browser/cavuno-board.global.min.js +1 -1
  11. package/dist/{chunk-JTFUOGWE.mjs → chunk-P4DNSVGM.mjs} +1 -1
  12. package/dist/filters.d.mts +2 -2
  13. package/dist/filters.d.ts +2 -2
  14. package/dist/format.d.mts +4 -4
  15. package/dist/format.d.ts +4 -4
  16. package/dist/format.mjs +1 -1
  17. package/dist/index.d.mts +56 -12
  18. package/dist/index.d.ts +56 -12
  19. package/dist/index.js +52 -9
  20. package/dist/index.mjs +52 -9
  21. package/dist/{jobs-CeB5FVGG.d.mts → jobs-BMJHIKTi.d.ts} +18 -4
  22. package/dist/{jobs-DN0ePjTg.d.ts → jobs-DKo4rx45.d.mts} +18 -4
  23. package/dist/{search-Kgs7ubkH.d.mts → search-DJQkMA5T.d.mts} +1 -1
  24. package/dist/{search-CDl4MJV4.d.ts → search-DVSEJ5aj.d.ts} +1 -1
  25. package/dist/{seo-BhHH3OMM.d.ts → seo-CIOAZCuc.d.ts} +1 -1
  26. package/dist/{seo-CPX54V1D.d.mts → seo-D2oDCBT0.d.mts} +1 -1
  27. package/dist/seo-files.d.mts +2 -2
  28. package/dist/seo-files.d.ts +2 -2
  29. package/dist/seo.d.mts +6 -6
  30. package/dist/seo.d.ts +6 -6
  31. package/dist/seo.js +1 -1
  32. package/dist/seo.mjs +1 -1
  33. package/dist/server.d.mts +6 -6
  34. package/dist/server.d.ts +6 -6
  35. package/dist/sitemap.d.mts +6 -6
  36. package/dist/sitemap.d.ts +6 -6
  37. package/dist/suggest.d.mts +2 -2
  38. package/dist/suggest.d.ts +2 -2
  39. package/package.json +1 -1
  40. package/skills/cavuno-board-companies/SKILL.md +13 -0
  41. package/skills/cavuno-board-jobs/SKILL.md +15 -0
  42. package/skills/cavuno-board-paywall/SKILL.md +8 -2
  43. package/skills/cavuno-board-talent-access/SKILL.md +6 -2
  44. package/skills/manifest.json +1 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,76 @@
3
3
  This changelog records changes that affect Board API compatibility, exported
4
4
  types, runtime behavior, or supported integration patterns.
5
5
 
6
+ ## 4.53.0 — 2026-10-21
7
+
8
+ - Sponsored jobs (`isSponsored: true`) are being restricted to callers that
9
+ send the `apply-gateway-v1` capability, the opt-in for starters that send
10
+ candidates through the Apply gateway; send it on every job read now.
11
+ Without it, the job lists
12
+ (`jobs.list`, `jobs.similar`, `jobs.search`, `companies.listJobs`,
13
+ `embed.jobs` and `me.recommendedJobs.list`) leave Sponsored jobs out, with
14
+ `count` and pagination covering only the jobs returned, and
15
+ `jobs.retrieve` returns 404 `jobs_not_found` for a Sponsored job.
16
+ - `JobsListQuery`, `JobsSimilarQuery`, `CompanyJobsListQuery` and
17
+ `EmbedJobsQuery` accept `capabilities: ['apply-gateway-v1']`, sent as the
18
+ `capabilities` query parameter so the response stays shared-cacheable
19
+ (prefer it to the header on these reads: a shared cache keys by URL).
20
+ `jobs.search` and `me.recommendedJobs.list` take the
21
+ `x-cavuno-board-capabilities: apply-gateway-v1` header in
22
+ `options.headers`.
23
+ - A place resolution (`board.taxonomy.places.resolve()`) has an optional
24
+ `defaultRadiusKm`: the distance the jobs search applies around the place
25
+ when no `radius` is passed (with `defaultRadius: true` for the board's own
26
+ places; always for a suggested place). It is absent for regions, countries
27
+ and places without coordinates. Show it as the selected distance when the
28
+ visitor has not picked one.
29
+
30
+ ## 4.52.0 — 2026-10-20
31
+
32
+ - Every salary page response has an `indexable` boolean: title, skill and
33
+ location details, title and skill by location, the four by-location and
34
+ by-place lists, and company and company-by-title salaries. When it is
35
+ `false`, render `<meta name="robots" content="noindex, follow">`; the page
36
+ still renders and its links stay followable. The board sitemap lists only
37
+ indexable salary pages.
38
+ - Items in the salary lists (`SalaryCompany`, `SalaryTitle`, `SalarySkill`,
39
+ `SalaryLocation`, and the rows of the by-location and by-place lists) carry
40
+ `indexable` for the page they link to. Index a salary hub such as
41
+ `/salaries/titles` when at least one item it lists is indexable.
42
+ - The generated API types include the company plan operations
43
+ (`/v1/companies/{id}/plan-assignments` and
44
+ `/v1/companies/{id}/plan-invoices`): list, create and revoke a company's
45
+ plan assignments, and list, create and cancel its plan invoices.
46
+ - Operator API errors caused by the board's plan can carry an `upgrade` object
47
+ (`PlanUpgradeHint`) naming the blocking capability, the cheapest plan that
48
+ unlocks it, and the hosted checkout and plan-change endpoints. Board API
49
+ errors never carry it.
50
+ - `GET` and `PATCH /v1/settings` carry the board's analytics tracking IDs
51
+ (`ga4MeasurementId`, `gtmContainerId`, `metaPixelId`, `linkedinPartnerId`
52
+ and the LinkedIn conversion IDs); `null` or an empty string clears one.
53
+ - Board checkout status (job seeker access, talent access and membership)
54
+ can return `paymentStatus`, `'paid'` or `'processing'`, on a complete
55
+ session. On `'processing'` (a bank debit or transfer still clearing), stop
56
+ polling for access and tell the visitor their payment is processing.
57
+ - The employer job read (`GET /me/companies/:slug/jobs/:id`) can return
58
+ `paymentProcessing: true` while a draft's delayed payment is still clearing.
59
+ - The generated API types include the `/v1/job-feeds` operations
60
+ (`listJobFeeds`, `createJobFeed`, `getJobFeed`, `updateJobFeed`,
61
+ `deleteJobFeed`, `redetectJobFeedMapping`, `listJobFeedRuns`) to connect and
62
+ manage recurring XML job feeds.
63
+ - A place slug that resolves to a suggested place
64
+ (`board.taxonomy.places.suggest()`) returns `suggested: true` and
65
+ `ancestors` (`PublicPlaceAncestor[]`: country, region and, for a
66
+ neighbourhood, city). Render them as the breadcrumb, linking an ancestor only
67
+ when its `canonicalSlug` is not `null`. Index a suggested place's page only
68
+ when it lists at least 5 on-site or hybrid jobs: read `count` from
69
+ `GET /jobs?location={slug}&remoteOption=on_site&remoteOption=hybrid&limit=1`.
70
+ - Place suggestions come only from countries where the board has published
71
+ on-site or hybrid jobs, and each one's `regionCode` is its ISO 3166-2 region
72
+ code when it has one.
73
+ - `createBreadcrumbJsonLd` leaves out an earlier crumb with no `href`,
74
+ since schema.org needs an `item` URL on every crumb but the last.
75
+
6
76
  ## 4.51.0 — 2026-10-19
7
77
 
8
78
  - A category or location page can carry its own intro. Taxonomy resolutions
@@ -33,6 +33,11 @@ interface components {
33
33
  /** @enum {string} */
34
34
  status: "open" | "complete" | "expired";
35
35
  clientSecret: string | null;
36
+ /**
37
+ * @description Present only when `status` is `complete`. `paid`: the payment has arrived (or none was due); the purchase is granted once the payment webhook lands, so a short poll of the entitlement read sees it. `processing`: the buyer paid with a delayed method (SEPA / Bacs / ACH debit, bank transfer) that has not cleared yet. Nothing is granted until it clears, usually within a few business days, so stop polling and tell the buyer their payment is processing; read the session again later (for example on their next visit) to see whether it cleared or failed. `failed`: that delayed payment did not go through. Nothing was granted; the buyer can start a new checkout.
38
+ * @enum {string}
39
+ */
40
+ paymentStatus?: "paid" | "processing" | "failed";
36
41
  };
37
42
  AccessGrant: {
38
43
  /** @enum {string} */
@@ -661,6 +666,8 @@ interface components {
661
666
  boardCategoryP25Min: number | null;
662
667
  boardCategoryP75Max: number | null;
663
668
  currency: string;
669
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
670
+ indexable: boolean;
664
671
  };
665
672
  CompanyMarket: {
666
673
  /** @enum {string} */
@@ -851,6 +858,8 @@ interface components {
851
858
  boardP25Max: number | null;
852
859
  boardP75Max: number | null;
853
860
  currency: string;
861
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
862
+ indexable: boolean;
854
863
  };
855
864
  CompanySalarySummary: {
856
865
  /** @enum {string} */
@@ -1574,6 +1583,8 @@ interface components {
1574
1583
  [key: string]: string[];
1575
1584
  };
1576
1585
  links: components["schemas"]["EmployerJobLinks"];
1586
+ /** @description Returned by `GET …/jobs` (each job) and `GET …/jobs/:id`. `true` when the employer paid for this job with a delayed method (SEPA / Bacs / ACH debit, bank transfer) that has not cleared yet. The job stays a `draft` until the payment clears (usually within a few business days), then the paid listing goes through; a new checkout for the job is refused meanwhile. Show it as "payment processing" rather than an unpaid draft. */
1587
+ paymentProcessing?: boolean;
1577
1588
  };
1578
1589
  EmployerPipeline: {
1579
1590
  /** @enum {string} */
@@ -1728,6 +1739,7 @@ interface components {
1728
1739
  requestId: string;
1729
1740
  /** @description Structured context for some errors, such as per-field validation issues. */
1730
1741
  details?: unknown;
1742
+ upgrade?: components["schemas"]["PlanUpgradeHint"];
1731
1743
  };
1732
1744
  };
1733
1745
  /**
@@ -1996,6 +2008,8 @@ interface components {
1996
2008
  boardOverallAvgMin: number | null;
1997
2009
  boardOverallAvgMax: number | null;
1998
2010
  currency: string;
2011
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
2012
+ indexable: boolean;
1999
2013
  };
2000
2014
  LocationSkillsIndex: {
2001
2015
  /** @enum {string} */
@@ -2011,7 +2025,11 @@ interface components {
2011
2025
  jobCount: number;
2012
2026
  /** @description ISO 4217 code of the amounts: the board's salary currency (USD unless the board set another). */
2013
2027
  currency?: string;
2028
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
2029
+ indexable: boolean;
2014
2030
  }[];
2031
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
2032
+ indexable: boolean;
2015
2033
  };
2016
2034
  LocationTitlesIndex: {
2017
2035
  /** @enum {string} */
@@ -2027,7 +2045,11 @@ interface components {
2027
2045
  jobCount: number;
2028
2046
  /** @description ISO 4217 code of the amounts: the board's salary currency (USD unless the board set another). */
2029
2047
  currency?: string;
2048
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
2049
+ indexable: boolean;
2030
2050
  }[];
2051
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
2052
+ indexable: boolean;
2031
2053
  };
2032
2054
  MarketSuggestion: {
2033
2055
  /** @enum {string} */
@@ -2202,6 +2224,33 @@ interface components {
2202
2224
  };
2203
2225
  };
2204
2226
  };
2227
+ /** @description Present only on Operator API errors caused by the board's Cavuno plan. Read `GET /v1/billing/subscription` to choose between `checkout` and `changePlan`, call it with `{ "planKey": requiredPlan }`, and give the returned `url` to a person to confirm. Each `path` is relative to the API origin, not to a `/v1` base URL. Both endpoints need `billing.manage`. Board API errors never include it. */
2228
+ PlanUpgradeHint: {
2229
+ /**
2230
+ * @description The plan capability that blocked the request, named as in `GET /v1/billing/subscription` `capabilities`.
2231
+ * @enum {string}
2232
+ */
2233
+ capability: "activeJobsLimit" | "teamSeatLimit" | "canBePublic" | "canRemoveBranding" | "apiAccess";
2234
+ /**
2235
+ * @description The cheapest self-serve plan that unlocks the action. Pass it as `planKey`. Omitted when it cannot be told without more information; read `GET /v1/billing/subscription` and pick a higher plan.
2236
+ * @enum {string}
2237
+ */
2238
+ requiredPlan?: "starter" | "basic" | "grow" | "advanced" | "scale";
2239
+ /** @description Starts a hosted checkout when the board has no active subscription (for example during a trial). */
2240
+ checkout: {
2241
+ /** @enum {string} */
2242
+ method: "POST";
2243
+ /** @enum {string} */
2244
+ path: "/v1/billing/checkout";
2245
+ };
2246
+ /** @description Starts a hosted plan change when the board already has an active subscription. */
2247
+ changePlan: {
2248
+ /** @enum {string} */
2249
+ method: "POST";
2250
+ /** @enum {string} */
2251
+ path: "/v1/billing/upgrade";
2252
+ };
2253
+ };
2205
2254
  PostSuggestion: {
2206
2255
  /** @enum {string} */
2207
2256
  object: "suggestion";
@@ -2913,6 +2962,14 @@ interface components {
2913
2962
  /** @description Live published-job count for this place. */
2914
2963
  jobCount: number;
2915
2964
  };
2965
+ PublicPlaceAncestor: {
2966
+ /** @description Name in the board's language. */
2967
+ displayName: string;
2968
+ /** @enum {string} */
2969
+ placeType: "country" | "region" | "city";
2970
+ /** @description The board's location page slug for this place (`/jobs/locations/:canonicalSlug`) when the board has the place among its places (`GET /boards/{identifier}/places`); `null` when it does not: show the name without a link. */
2971
+ canonicalSlug: string | null;
2972
+ };
2916
2973
  PublicProfileFields: {
2917
2974
  definitions: components["schemas"]["ProfileCustomFieldDefinition"][];
2918
2975
  referenceDefinitions: components["schemas"]["ProfileObjectReferenceDefinition"][];
@@ -3020,6 +3077,12 @@ interface components {
3020
3077
  geo: components["schemas"]["TaxonomyGeo"];
3021
3078
  /** @description The board's intro for this category or location page, as sanitized HTML. Absent when the page has none. Show it on page 1 with no filters. */
3022
3079
  introHtml?: string;
3080
+ /** @description Present, and `true`, when a place slug resolved to a place from `GET /boards/{identifier}/places/suggest` instead of one of the board's places; absent for every other resolution. Its location page lists the jobs within the place's own default distance (pass the slug as the jobs `location` with no `radius`). Index that page only when it lists at least 5 on-site or hybrid jobs: read `count` from `GET /boards/{identifier}/jobs?location={slug}&remoteOption=on_site&remoteOption=hybrid&limit=1`, in parallel with the page's own job read, and emit `noindex, follow` below 5. Remote jobs still list on the page and count in its headline; they only do not count toward indexing. A view with an explicit `radius` stays `noindex, follow`. Only suggested places need this read. */
3081
+ suggested?: boolean;
3082
+ /** @description The breadcrumb above a suggested place, country first: its country, its region and, for a neighbourhood or suburb (`geo.placeType` `locality`), its city. Present when `suggested` is `true`, absent otherwise. Render Jobs > each ancestor > the place (`displayName`), with the same BreadcrumbList JSON-LD as for the board's own places; link an ancestor to `/jobs/locations/:canonicalSlug` only when its `canonicalSlug` is not `null`. */
3083
+ ancestors?: components["schemas"]["PublicPlaceAncestor"][];
3084
+ /** @description The distance in kilometres the jobs search applies around this place when no `radius` is passed: a city or locality with coordinates gets the market default (25 miles, 40.2336 km, in the US, GB, LR and MM; 50 km elsewhere), applied with `defaultRadius=true`; a suggested place gets its own default for its size, with or without `defaultRadius`. Absent for regions, countries, places without coordinates, and categories and skills. Show it as the selected distance when the visitor has not picked one. */
3085
+ defaultRadiusKm?: number;
3023
3086
  };
3024
3087
  PublicTaxonomyTerm: {
3025
3088
  /** @enum {string} */
@@ -3292,6 +3355,8 @@ interface components {
3292
3355
  avgSalaryMax: number;
3293
3356
  jobCount: number;
3294
3357
  currency: string;
3358
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. Index a salary hub (`/salaries/companies`, `/salaries/titles`, `/salaries/skills`, `/salaries/locations`) when at least one item it lists is indexable, and the `/salaries` overview when any item in these hub lists is indexable; otherwise render the hub with `noindex, follow`. A page that has its own `indexable` field uses that instead. */
3359
+ indexable: boolean;
3295
3360
  };
3296
3361
  SalaryLocationIndexItem: {
3297
3362
  /** @enum {string} */
@@ -3307,6 +3372,8 @@ interface components {
3307
3372
  jobCount: number;
3308
3373
  /** @description ISO 4217 code of the amounts: the board's salary currency (USD unless the board set another). */
3309
3374
  currency?: string;
3375
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. Index a salary hub (`/salaries/companies`, `/salaries/titles`, `/salaries/skills`, `/salaries/locations`) when at least one item it lists is indexable, and the `/salaries` overview when any item in these hub lists is indexable; otherwise render the hub with `noindex, follow`. A page that has its own `indexable` field uses that instead. */
3376
+ indexable: boolean;
3310
3377
  };
3311
3378
  SalarySkillIndexItem: {
3312
3379
  /** @enum {string} */
@@ -3319,6 +3386,8 @@ interface components {
3319
3386
  p75SalaryMax: number;
3320
3387
  jobCount: number;
3321
3388
  currency: string;
3389
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. Index a salary hub (`/salaries/companies`, `/salaries/titles`, `/salaries/skills`, `/salaries/locations`) when at least one item it lists is indexable, and the `/salaries` overview when any item in these hub lists is indexable; otherwise render the hub with `noindex, follow`. A page that has its own `indexable` field uses that instead. */
3390
+ indexable: boolean;
3322
3391
  };
3323
3392
  SalaryTitleIndexItem: {
3324
3393
  /** @enum {string} */
@@ -3331,6 +3400,8 @@ interface components {
3331
3400
  p75SalaryMax: number;
3332
3401
  jobCount: number;
3333
3402
  currency: string;
3403
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. Index a salary hub (`/salaries/companies`, `/salaries/titles`, `/salaries/skills`, `/salaries/locations`) when at least one item it lists is indexable, and the `/salaries` overview when any item in these hub lists is indexable; otherwise render the hub with `noindex, follow`. A page that has its own `indexable` field uses that instead. */
3404
+ indexable: boolean;
3334
3405
  };
3335
3406
  /** @description Deprecated. Prefer public plans with purpose employer_service and pricingMode contact. */
3336
3407
  SalesLedPlan: {
@@ -3449,6 +3520,8 @@ interface components {
3449
3520
  boardSkillAvgMin: number | null;
3450
3521
  boardSkillAvgMax: number | null;
3451
3522
  currency: string;
3523
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
3524
+ indexable: boolean;
3452
3525
  };
3453
3526
  SkillLocationsIndex: {
3454
3527
  /** @enum {string} */
@@ -3458,6 +3531,8 @@ interface components {
3458
3531
  skillName: string;
3459
3532
  currency: string;
3460
3533
  locations: components["schemas"]["SalaryLocationIndexItem"][];
3534
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
3535
+ indexable: boolean;
3461
3536
  };
3462
3537
  SkillSalaryDetail: {
3463
3538
  /** @enum {string} */
@@ -3523,6 +3598,8 @@ interface components {
3523
3598
  boardMedianMin: number | null;
3524
3599
  boardMedianMax: number | null;
3525
3600
  currency: string;
3601
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
3602
+ indexable: boolean;
3526
3603
  };
3527
3604
  SourcedCandidate: {
3528
3605
  id: string;
@@ -3898,6 +3975,8 @@ interface components {
3898
3975
  boardCategoryAvgMin: number | null;
3899
3976
  boardCategoryAvgMax: number | null;
3900
3977
  currency: string;
3978
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
3979
+ indexable: boolean;
3901
3980
  };
3902
3981
  TitleLocationsIndex: {
3903
3982
  /** @enum {string} */
@@ -3907,6 +3986,8 @@ interface components {
3907
3986
  categoryName: string;
3908
3987
  currency: string;
3909
3988
  locations: components["schemas"]["SalaryLocationIndexItem"][];
3989
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
3990
+ indexable: boolean;
3910
3991
  };
3911
3992
  TitleSalaryDetail: {
3912
3993
  /** @enum {string} */
@@ -3978,6 +4059,8 @@ interface components {
3978
4059
  boardP25Min: number | null;
3979
4060
  boardP75Max: number | null;
3980
4061
  currency: string;
4062
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
4063
+ indexable: boolean;
3981
4064
  };
3982
4065
  UnreadCount: {
3983
4066
  /** @enum {string} */
@@ -33,6 +33,11 @@ interface components {
33
33
  /** @enum {string} */
34
34
  status: "open" | "complete" | "expired";
35
35
  clientSecret: string | null;
36
+ /**
37
+ * @description Present only when `status` is `complete`. `paid`: the payment has arrived (or none was due); the purchase is granted once the payment webhook lands, so a short poll of the entitlement read sees it. `processing`: the buyer paid with a delayed method (SEPA / Bacs / ACH debit, bank transfer) that has not cleared yet. Nothing is granted until it clears, usually within a few business days, so stop polling and tell the buyer their payment is processing; read the session again later (for example on their next visit) to see whether it cleared or failed. `failed`: that delayed payment did not go through. Nothing was granted; the buyer can start a new checkout.
38
+ * @enum {string}
39
+ */
40
+ paymentStatus?: "paid" | "processing" | "failed";
36
41
  };
37
42
  AccessGrant: {
38
43
  /** @enum {string} */
@@ -661,6 +666,8 @@ interface components {
661
666
  boardCategoryP25Min: number | null;
662
667
  boardCategoryP75Max: number | null;
663
668
  currency: string;
669
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
670
+ indexable: boolean;
664
671
  };
665
672
  CompanyMarket: {
666
673
  /** @enum {string} */
@@ -851,6 +858,8 @@ interface components {
851
858
  boardP25Max: number | null;
852
859
  boardP75Max: number | null;
853
860
  currency: string;
861
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
862
+ indexable: boolean;
854
863
  };
855
864
  CompanySalarySummary: {
856
865
  /** @enum {string} */
@@ -1574,6 +1583,8 @@ interface components {
1574
1583
  [key: string]: string[];
1575
1584
  };
1576
1585
  links: components["schemas"]["EmployerJobLinks"];
1586
+ /** @description Returned by `GET …/jobs` (each job) and `GET …/jobs/:id`. `true` when the employer paid for this job with a delayed method (SEPA / Bacs / ACH debit, bank transfer) that has not cleared yet. The job stays a `draft` until the payment clears (usually within a few business days), then the paid listing goes through; a new checkout for the job is refused meanwhile. Show it as "payment processing" rather than an unpaid draft. */
1587
+ paymentProcessing?: boolean;
1577
1588
  };
1578
1589
  EmployerPipeline: {
1579
1590
  /** @enum {string} */
@@ -1728,6 +1739,7 @@ interface components {
1728
1739
  requestId: string;
1729
1740
  /** @description Structured context for some errors, such as per-field validation issues. */
1730
1741
  details?: unknown;
1742
+ upgrade?: components["schemas"]["PlanUpgradeHint"];
1731
1743
  };
1732
1744
  };
1733
1745
  /**
@@ -1996,6 +2008,8 @@ interface components {
1996
2008
  boardOverallAvgMin: number | null;
1997
2009
  boardOverallAvgMax: number | null;
1998
2010
  currency: string;
2011
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
2012
+ indexable: boolean;
1999
2013
  };
2000
2014
  LocationSkillsIndex: {
2001
2015
  /** @enum {string} */
@@ -2011,7 +2025,11 @@ interface components {
2011
2025
  jobCount: number;
2012
2026
  /** @description ISO 4217 code of the amounts: the board's salary currency (USD unless the board set another). */
2013
2027
  currency?: string;
2028
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
2029
+ indexable: boolean;
2014
2030
  }[];
2031
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
2032
+ indexable: boolean;
2015
2033
  };
2016
2034
  LocationTitlesIndex: {
2017
2035
  /** @enum {string} */
@@ -2027,7 +2045,11 @@ interface components {
2027
2045
  jobCount: number;
2028
2046
  /** @description ISO 4217 code of the amounts: the board's salary currency (USD unless the board set another). */
2029
2047
  currency?: string;
2048
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. */
2049
+ indexable: boolean;
2030
2050
  }[];
2051
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
2052
+ indexable: boolean;
2031
2053
  };
2032
2054
  MarketSuggestion: {
2033
2055
  /** @enum {string} */
@@ -2202,6 +2224,33 @@ interface components {
2202
2224
  };
2203
2225
  };
2204
2226
  };
2227
+ /** @description Present only on Operator API errors caused by the board's Cavuno plan. Read `GET /v1/billing/subscription` to choose between `checkout` and `changePlan`, call it with `{ "planKey": requiredPlan }`, and give the returned `url` to a person to confirm. Each `path` is relative to the API origin, not to a `/v1` base URL. Both endpoints need `billing.manage`. Board API errors never include it. */
2228
+ PlanUpgradeHint: {
2229
+ /**
2230
+ * @description The plan capability that blocked the request, named as in `GET /v1/billing/subscription` `capabilities`.
2231
+ * @enum {string}
2232
+ */
2233
+ capability: "activeJobsLimit" | "teamSeatLimit" | "canBePublic" | "canRemoveBranding" | "apiAccess";
2234
+ /**
2235
+ * @description The cheapest self-serve plan that unlocks the action. Pass it as `planKey`. Omitted when it cannot be told without more information; read `GET /v1/billing/subscription` and pick a higher plan.
2236
+ * @enum {string}
2237
+ */
2238
+ requiredPlan?: "starter" | "basic" | "grow" | "advanced" | "scale";
2239
+ /** @description Starts a hosted checkout when the board has no active subscription (for example during a trial). */
2240
+ checkout: {
2241
+ /** @enum {string} */
2242
+ method: "POST";
2243
+ /** @enum {string} */
2244
+ path: "/v1/billing/checkout";
2245
+ };
2246
+ /** @description Starts a hosted plan change when the board already has an active subscription. */
2247
+ changePlan: {
2248
+ /** @enum {string} */
2249
+ method: "POST";
2250
+ /** @enum {string} */
2251
+ path: "/v1/billing/upgrade";
2252
+ };
2253
+ };
2205
2254
  PostSuggestion: {
2206
2255
  /** @enum {string} */
2207
2256
  object: "suggestion";
@@ -2913,6 +2962,14 @@ interface components {
2913
2962
  /** @description Live published-job count for this place. */
2914
2963
  jobCount: number;
2915
2964
  };
2965
+ PublicPlaceAncestor: {
2966
+ /** @description Name in the board's language. */
2967
+ displayName: string;
2968
+ /** @enum {string} */
2969
+ placeType: "country" | "region" | "city";
2970
+ /** @description The board's location page slug for this place (`/jobs/locations/:canonicalSlug`) when the board has the place among its places (`GET /boards/{identifier}/places`); `null` when it does not: show the name without a link. */
2971
+ canonicalSlug: string | null;
2972
+ };
2916
2973
  PublicProfileFields: {
2917
2974
  definitions: components["schemas"]["ProfileCustomFieldDefinition"][];
2918
2975
  referenceDefinitions: components["schemas"]["ProfileObjectReferenceDefinition"][];
@@ -3020,6 +3077,12 @@ interface components {
3020
3077
  geo: components["schemas"]["TaxonomyGeo"];
3021
3078
  /** @description The board's intro for this category or location page, as sanitized HTML. Absent when the page has none. Show it on page 1 with no filters. */
3022
3079
  introHtml?: string;
3080
+ /** @description Present, and `true`, when a place slug resolved to a place from `GET /boards/{identifier}/places/suggest` instead of one of the board's places; absent for every other resolution. Its location page lists the jobs within the place's own default distance (pass the slug as the jobs `location` with no `radius`). Index that page only when it lists at least 5 on-site or hybrid jobs: read `count` from `GET /boards/{identifier}/jobs?location={slug}&remoteOption=on_site&remoteOption=hybrid&limit=1`, in parallel with the page's own job read, and emit `noindex, follow` below 5. Remote jobs still list on the page and count in its headline; they only do not count toward indexing. A view with an explicit `radius` stays `noindex, follow`. Only suggested places need this read. */
3081
+ suggested?: boolean;
3082
+ /** @description The breadcrumb above a suggested place, country first: its country, its region and, for a neighbourhood or suburb (`geo.placeType` `locality`), its city. Present when `suggested` is `true`, absent otherwise. Render Jobs > each ancestor > the place (`displayName`), with the same BreadcrumbList JSON-LD as for the board's own places; link an ancestor to `/jobs/locations/:canonicalSlug` only when its `canonicalSlug` is not `null`. */
3083
+ ancestors?: components["schemas"]["PublicPlaceAncestor"][];
3084
+ /** @description The distance in kilometres the jobs search applies around this place when no `radius` is passed: a city or locality with coordinates gets the market default (25 miles, 40.2336 km, in the US, GB, LR and MM; 50 km elsewhere), applied with `defaultRadius=true`; a suggested place gets its own default for its size, with or without `defaultRadius`. Absent for regions, countries, places without coordinates, and categories and skills. Show it as the selected distance when the visitor has not picked one. */
3085
+ defaultRadiusKm?: number;
3023
3086
  };
3024
3087
  PublicTaxonomyTerm: {
3025
3088
  /** @enum {string} */
@@ -3292,6 +3355,8 @@ interface components {
3292
3355
  avgSalaryMax: number;
3293
3356
  jobCount: number;
3294
3357
  currency: string;
3358
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. Index a salary hub (`/salaries/companies`, `/salaries/titles`, `/salaries/skills`, `/salaries/locations`) when at least one item it lists is indexable, and the `/salaries` overview when any item in these hub lists is indexable; otherwise render the hub with `noindex, follow`. A page that has its own `indexable` field uses that instead. */
3359
+ indexable: boolean;
3295
3360
  };
3296
3361
  SalaryLocationIndexItem: {
3297
3362
  /** @enum {string} */
@@ -3307,6 +3372,8 @@ interface components {
3307
3372
  jobCount: number;
3308
3373
  /** @description ISO 4217 code of the amounts: the board's salary currency (USD unless the board set another). */
3309
3374
  currency?: string;
3375
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. Index a salary hub (`/salaries/companies`, `/salaries/titles`, `/salaries/skills`, `/salaries/locations`) when at least one item it lists is indexable, and the `/salaries` overview when any item in these hub lists is indexable; otherwise render the hub with `noindex, follow`. A page that has its own `indexable` field uses that instead. */
3376
+ indexable: boolean;
3310
3377
  };
3311
3378
  SalarySkillIndexItem: {
3312
3379
  /** @enum {string} */
@@ -3319,6 +3386,8 @@ interface components {
3319
3386
  p75SalaryMax: number;
3320
3387
  jobCount: number;
3321
3388
  currency: string;
3389
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. Index a salary hub (`/salaries/companies`, `/salaries/titles`, `/salaries/skills`, `/salaries/locations`) when at least one item it lists is indexable, and the `/salaries` overview when any item in these hub lists is indexable; otherwise render the hub with `noindex, follow`. A page that has its own `indexable` field uses that instead. */
3390
+ indexable: boolean;
3322
3391
  };
3323
3392
  SalaryTitleIndexItem: {
3324
3393
  /** @enum {string} */
@@ -3331,6 +3400,8 @@ interface components {
3331
3400
  p75SalaryMax: number;
3332
3401
  jobCount: number;
3333
3402
  currency: string;
3403
+ /** @description Whether the salary page this item links to is worth indexing. When `false`, that page renders `<meta name="robots" content="noindex, follow">` and is left out of the board sitemap. Index a salary hub (`/salaries/companies`, `/salaries/titles`, `/salaries/skills`, `/salaries/locations`) when at least one item it lists is indexable, and the `/salaries` overview when any item in these hub lists is indexable; otherwise render the hub with `noindex, follow`. A page that has its own `indexable` field uses that instead. */
3404
+ indexable: boolean;
3334
3405
  };
3335
3406
  /** @description Deprecated. Prefer public plans with purpose employer_service and pricingMode contact. */
3336
3407
  SalesLedPlan: {
@@ -3449,6 +3520,8 @@ interface components {
3449
3520
  boardSkillAvgMin: number | null;
3450
3521
  boardSkillAvgMax: number | null;
3451
3522
  currency: string;
3523
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
3524
+ indexable: boolean;
3452
3525
  };
3453
3526
  SkillLocationsIndex: {
3454
3527
  /** @enum {string} */
@@ -3458,6 +3531,8 @@ interface components {
3458
3531
  skillName: string;
3459
3532
  currency: string;
3460
3533
  locations: components["schemas"]["SalaryLocationIndexItem"][];
3534
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
3535
+ indexable: boolean;
3461
3536
  };
3462
3537
  SkillSalaryDetail: {
3463
3538
  /** @enum {string} */
@@ -3523,6 +3598,8 @@ interface components {
3523
3598
  boardMedianMin: number | null;
3524
3599
  boardMedianMax: number | null;
3525
3600
  currency: string;
3601
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
3602
+ indexable: boolean;
3526
3603
  };
3527
3604
  SourcedCandidate: {
3528
3605
  id: string;
@@ -3898,6 +3975,8 @@ interface components {
3898
3975
  boardCategoryAvgMin: number | null;
3899
3976
  boardCategoryAvgMax: number | null;
3900
3977
  currency: string;
3978
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
3979
+ indexable: boolean;
3901
3980
  };
3902
3981
  TitleLocationsIndex: {
3903
3982
  /** @enum {string} */
@@ -3907,6 +3986,8 @@ interface components {
3907
3986
  categoryName: string;
3908
3987
  currency: string;
3909
3988
  locations: components["schemas"]["SalaryLocationIndexItem"][];
3989
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
3990
+ indexable: boolean;
3910
3991
  };
3911
3992
  TitleSalaryDetail: {
3912
3993
  /** @enum {string} */
@@ -3978,6 +4059,8 @@ interface components {
3978
4059
  boardP25Min: number | null;
3979
4060
  boardP75Max: number | null;
3980
4061
  currency: string;
4062
+ /** @description Whether this salary page is worth indexing. When `false`, render `<meta name="robots" content="noindex, follow">`; the page still renders and its links stay followable. The board sitemap lists only indexable salary pages. */
4063
+ indexable: boolean;
3981
4064
  };
3982
4065
  UnreadCount: {
3983
4066
  /** @enum {string} */
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Pr6ZvyW_.mjs';
1
+ import { S as Schemas } from './_spec-B4TxcV4W.mjs';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-Pr6ZvyW_.js';
1
+ import { S as Schemas } from './_spec-B4TxcV4W.js';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-Pr6ZvyW_.mjs';
2
- import { L as ListEnvelope, v as RelatedSearch, a as CustomFieldFilter, O as ObjectReferenceFilter } from './jobs-CeB5FVGG.mjs';
1
+ import { S as Schemas } from './_spec-B4TxcV4W.js';
2
+ import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-BMJHIKTi.js';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -58,6 +58,12 @@ type CompanyJobsListQuery = {
58
58
  cursor?: string;
59
59
  /** 1–100. */
60
60
  limit?: number;
61
+ /**
62
+ * Capability opt-ins, sent as the `capabilities` query parameter.
63
+ * `apply-gateway-v1` includes Sponsored jobs, which are left out without
64
+ * it; counts and pagination cover only the jobs returned.
65
+ */
66
+ capabilities?: JobCapability[];
61
67
  };
62
68
  type CompanySimilarQuery = {
63
69
  /** 1–20, default 6. */
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-Pr6ZvyW_.js';
2
- import { L as ListEnvelope, v as RelatedSearch, a as CustomFieldFilter, O as ObjectReferenceFilter } from './jobs-DN0ePjTg.js';
1
+ import { S as Schemas } from './_spec-B4TxcV4W.mjs';
2
+ import { L as ListEnvelope, v as RelatedSearch, b as CustomFieldFilter, O as ObjectReferenceFilter, a as JobCapability } from './jobs-DKo4rx45.mjs';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -58,6 +58,12 @@ type CompanyJobsListQuery = {
58
58
  cursor?: string;
59
59
  /** 1–100. */
60
60
  limit?: number;
61
+ /**
62
+ * Capability opt-ins, sent as the `capabilities` query parameter.
63
+ * `apply-gateway-v1` includes Sponsored jobs, which are left out without
64
+ * it; counts and pagination cover only the jobs returned.
65
+ */
66
+ capabilities?: JobCapability[];
61
67
  };
62
68
  type CompanySimilarQuery = {
63
69
  /** 1–20, default 6. */
@@ -1,5 +1,5 @@
1
- import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-C6PEXL7n.mjs';
2
- import { P as PublicJob } from './jobs-CeB5FVGG.mjs';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-j0KFqNBp.mjs';
2
+ import { P as PublicJob } from './jobs-DKo4rx45.mjs';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
@@ -348,7 +348,8 @@ interface BreadcrumbItemInput {
348
348
  /**
349
349
  * Build a `BreadcrumbList`, hosted semantics: labels are trimmed and empty
350
350
  * items dropped; fewer than 2 surviving items → `null` (a single crumb is
351
- * not a trail); the current page (no `href`) omits `item` per schema.org.
351
+ * not a trail); the current page (no `href`) omits `item` per schema.org,
352
+ * and an earlier item without `href` is left out.
352
353
  * Relative hrefs resolve against `options.origin`; without an origin a
353
354
  * relative item is omitted (never emit a relative `item` URL).
354
355
  */
@@ -1,5 +1,5 @@
1
- import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-CaZu8nEl.js';
2
- import { P as PublicJob } from './jobs-DN0ePjTg.js';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BtipyMwh.js';
2
+ import { P as PublicJob } from './jobs-BMJHIKTi.js';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
@@ -348,7 +348,8 @@ interface BreadcrumbItemInput {
348
348
  /**
349
349
  * Build a `BreadcrumbList`, hosted semantics: labels are trimmed and empty
350
350
  * items dropped; fewer than 2 surviving items → `null` (a single crumb is
351
- * not a trail); the current page (no `href`) omits `item` per schema.org.
351
+ * not a trail); the current page (no `href`) omits `item` per schema.org,
352
+ * and an earlier item without `href` is left out.
352
353
  * Relative hrefs resolve against `options.origin`; without an origin a
353
354
  * relative item is omitted (never emit a relative `item` URL).
354
355
  */