@cavuno/board 4.26.0 → 4.28.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 (53) hide show
  1. package/CHANGELOG.md +134 -0
  2. package/dist/{_spec-EgN7VmAI.d.mts → _spec-DQvmsp5o.d.mts} +589 -67
  3. package/dist/{_spec-EgN7VmAI.d.ts → _spec-DQvmsp5o.d.ts} +589 -67
  4. package/dist/bin.mjs +7989 -10
  5. package/dist/{blog-BIjFcNcm.d.ts → blog-CUkvhn3c.d.ts} +1 -1
  6. package/dist/{blog-T7gQ0ciz.d.mts → blog-CvuObn9O.d.mts} +1 -1
  7. package/dist/{board-CsEAgsKh.d.ts → board-CCG1pO6r.d.ts} +25 -4
  8. package/dist/{board-q0svBKW3.d.mts → board-D6xOidUX.d.mts} +25 -4
  9. package/dist/{breadcrumbs-CFcCjuG7.d.mts → breadcrumbs-BBvJ5gq-.d.mts} +2 -2
  10. package/dist/{breadcrumbs-xuDid8BS.d.ts → breadcrumbs-D2Cwrju4.d.ts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/{chunk-DP2ZZZEO.mjs → chunk-EHSB2VAJ.mjs} +5 -0
  13. package/dist/doctor.js +7989 -10
  14. package/dist/doctor.mjs +7989 -10
  15. package/dist/filters.d.mts +19 -3
  16. package/dist/filters.d.ts +19 -3
  17. package/dist/filters.js +10 -1
  18. package/dist/filters.mjs +10 -1
  19. package/dist/format.d.mts +4 -4
  20. package/dist/format.d.ts +4 -4
  21. package/dist/index.d.mts +251 -14
  22. package/dist/index.d.ts +251 -14
  23. package/dist/index.js +218 -26
  24. package/dist/index.mjs +214 -27
  25. package/dist/{jobs-ub3gywNQ.d.ts → jobs-CEIuahbz.d.ts} +26 -2
  26. package/dist/{jobs-CfrxlDMU.d.mts → jobs-DjMcghv6.d.mts} +26 -2
  27. package/dist/{search-DKS7OIn2.d.mts → search-C0LiPXVb.d.mts} +1 -1
  28. package/dist/{search-Dx1TiAZk.d.ts → search-D-EjtZH3.d.ts} +1 -1
  29. package/dist/{seo-BbG2Ujyo.d.ts → seo-CjNGqZZH.d.ts} +1 -1
  30. package/dist/{seo-CI3wLKUW.d.mts → seo-DCQp8V1c.d.mts} +1 -1
  31. package/dist/seo-files.d.mts +2 -2
  32. package/dist/seo-files.d.ts +2 -2
  33. package/dist/seo.d.mts +6 -6
  34. package/dist/seo.d.ts +6 -6
  35. package/dist/server.d.mts +6 -6
  36. package/dist/server.d.ts +6 -6
  37. package/dist/server.mjs +1 -1
  38. package/dist/sitemap.d.mts +6 -6
  39. package/dist/sitemap.d.ts +6 -6
  40. package/dist/sitemap.mjs +1 -1
  41. package/dist/suggest.d.mts +2 -2
  42. package/dist/suggest.d.ts +2 -2
  43. package/package.json +2 -1
  44. package/skills/cavuno-board-account/SKILL.md +122 -1
  45. package/skills/cavuno-board-collections/SKILL.md +148 -0
  46. package/skills/cavuno-board-companies/SKILL.md +43 -1
  47. package/skills/cavuno-board-errors/SKILL.md +1 -1
  48. package/skills/cavuno-board-filters/SKILL.md +160 -1
  49. package/skills/cavuno-board-format/SKILL.md +52 -0
  50. package/skills/cavuno-board-paywall/SKILL.md +5 -2
  51. package/skills/cavuno-board-post-a-job/SKILL.md +88 -0
  52. package/skills/cavuno-board-salaries/SKILL.md +7 -0
  53. package/skills/manifest.json +11 -4
@@ -4,11 +4,8 @@ interface components {
4
4
  token: string;
5
5
  };
6
6
  AccessCheckoutBody: {
7
- /**
8
- * @description The offer tier to purchase (from `GET /paywall/offers/enabled`).
9
- * @enum {string}
10
- */
11
- offerKey: "daily" | "weekly" | "monthly" | "quarterly" | "yearly" | "lifetime";
7
+ /** @description The opaque offer key returned by `GET /paywall/offers/enabled` (a plan ID or legacy tier key). */
8
+ offerKey: string;
12
9
  /** @description Relative path Stripe returns the buyer to on completion; `session_id` is appended. */
13
10
  returnPath: string;
14
11
  /** @enum {string} */
@@ -276,6 +273,89 @@ interface components {
276
273
  BoardAuthVerifyEmailBody: {
277
274
  token: string;
278
275
  };
276
+ BoardFormBuiltinField: {
277
+ /**
278
+ * @description discriminator enum property added by openapi-typescript
279
+ * @enum {string}
280
+ */
281
+ kind: "builtin";
282
+ /** @description The built-in field, rendered by your own control for that key. Job: `employmentType`, `seniority`, `title`, `workArrangement`, `location`, `remoteEligibility`, `description`, `salary`, `applyMethod`, `company`. Company: `name`, `website`, `summary`, `xUrl`, `linkedinUrl`, `facebookUrl`, `logo`, `description`. Talent: `name`, `email`, `avatar`, `headline`, `location`, `jobSearchStatus`, `bio`, `experience`, `education`, `skills`, `languages`. New built-ins may be added; skip keys you do not recognise. */
283
+ key: string;
284
+ /** @description Whether the form shows this field. Omit hidden fields from the form entirely; any value already stored on a record is kept. */
285
+ visible: boolean;
286
+ /** @description Whether a submission must fill this field. Always `false` for a hidden field. Validate it in the form before submitting. */
287
+ required: boolean;
288
+ /** @description A locked built-in is always shown and required: render it wherever it sits in the order, without a way to skip it. */
289
+ locked: boolean;
290
+ lockReason: components["schemas"]["FormFieldLockReason"];
291
+ };
292
+ /** @description The operator's job, company and talent forms (Settings → Job form, Company profile, Talent profile) as ordered field lists. Render each list in order: built-ins by `key` with your own controls, custom and collection fields from the inlined `definition`. Skip entries with `visible: false`. Every field the board has appears exactly once, so a new custom field shows up at its position without code changes. */
293
+ BoardForms: {
294
+ /** @description The job posting form, in the order to render it. */
295
+ job: components["schemas"]["BoardJobFormField"][];
296
+ /** @description The company profile form, in the order to render it. Public profile fields only. */
297
+ company: components["schemas"]["BoardProfileFormField"][];
298
+ /** @description The candidate profile form, in the order to render it. Public profile fields only. */
299
+ talent: components["schemas"]["BoardProfileFormField"][];
300
+ };
301
+ BoardJobFormCollectionField: {
302
+ /**
303
+ * @description discriminator enum property added by openapi-typescript
304
+ * @enum {string}
305
+ */
306
+ kind: "collection";
307
+ /** @description The collection field key used in `collectionValues`. Fetch choices from /boards/{identifier}/job-fields/{fieldKey}/choices. */
308
+ key: string;
309
+ /** @description Whether the form shows this field. Omit hidden fields from the form entirely; any value already stored on a record is kept. */
310
+ visible: boolean;
311
+ /** @description Whether a submission must fill this field. Always `false` for a hidden field. Validate it in the form before submitting. */
312
+ required: boolean;
313
+ definition: components["schemas"]["JobCollectionFieldDefinition"];
314
+ };
315
+ BoardJobFormCustomField: {
316
+ /**
317
+ * @description discriminator enum property added by openapi-typescript
318
+ * @enum {string}
319
+ */
320
+ kind: "custom";
321
+ /** @description The custom field key used in `customFieldValues`. */
322
+ key: string;
323
+ /** @description Whether the form shows this field. Omit hidden fields from the form entirely; any value already stored on a record is kept. */
324
+ visible: boolean;
325
+ /** @description Whether a submission must fill this field. Always `false` for a hidden field. Validate it in the form before submitting. */
326
+ required: boolean;
327
+ definition: components["schemas"]["CustomFieldDefinition"];
328
+ };
329
+ BoardJobFormField: components["schemas"]["BoardFormBuiltinField"] | components["schemas"]["BoardJobFormCustomField"] | components["schemas"]["BoardJobFormCollectionField"];
330
+ BoardProfileFormCollectionField: {
331
+ /**
332
+ * @description discriminator enum property added by openapi-typescript
333
+ * @enum {string}
334
+ */
335
+ kind: "collection";
336
+ /** @description The catalog field key. Fetch choices from /boards/{identifier}/profile-fields/{entity}/{fieldKey}/choices, or the signed-in owner choices endpoint. */
337
+ key: string;
338
+ /** @description Whether the form shows this field. Omit hidden fields from the form entirely; any value already stored on a record is kept. */
339
+ visible: boolean;
340
+ /** @description Whether a submission must fill this field. Always `false` for a hidden field. Validate it in the form before submitting. */
341
+ required: boolean;
342
+ definition: components["schemas"]["ProfileObjectReferenceDefinition"];
343
+ };
344
+ BoardProfileFormCustomField: {
345
+ /**
346
+ * @description discriminator enum property added by openapi-typescript
347
+ * @enum {string}
348
+ */
349
+ kind: "custom";
350
+ /** @description The profile custom field key. */
351
+ key: string;
352
+ /** @description Whether the form shows this field. Omit hidden fields from the form entirely; any value already stored on a record is kept. */
353
+ visible: boolean;
354
+ /** @description Whether a submission must fill this field. Always `false` for a hidden field. Validate it in the form before submitting. */
355
+ required: boolean;
356
+ definition: components["schemas"]["ProfileCustomFieldDefinition"];
357
+ };
358
+ BoardProfileFormField: components["schemas"]["BoardFormBuiltinField"] | components["schemas"]["BoardProfileFormCustomField"] | components["schemas"]["BoardProfileFormCollectionField"];
279
359
  BoardSeo: {
280
360
  /** @enum {string} */
281
361
  object: "board_seo";
@@ -548,6 +628,12 @@ interface components {
548
628
  /** @description Number of jobs that contribute to this company's salary aggregates on the board (the salary sample size). `0` when there is no usable salary data — prefer this over fetching the full company-salary document just to decide whether to show a Salaries tab. Not the same as `publishedJobCount` (open roles without pay data stay at 0 here). */
549
629
  salarySampleCount: number;
550
630
  membership: components["schemas"]["PublicCompanyMembership"];
631
+ /** @description Values for public company custom fields, keyed by field key. Private and unknown fields are omitted. */
632
+ customFieldValues: {
633
+ [key: string]: string | number | boolean | string[];
634
+ };
635
+ /** @description Resolved public object references attached to this company. Private references are omitted. */
636
+ objectReferences: components["schemas"]["ResolvedProfileObjectReference"][];
551
637
  links: components["schemas"]["PublicCompanyLinks"];
552
638
  };
553
639
  CompanyPublicDetail: components["schemas"]["CompanyPublic"] & {
@@ -708,18 +794,18 @@ interface components {
708
794
  sessionKey: string;
709
795
  };
710
796
  CreateCompanyBody: {
711
- /** @description Public company website URL. Normalized to a canonical apex domain when stored. */
712
- website?: string;
713
- /** @description One-line summary of the company. Up to 280 characters. */
714
- summary?: string;
715
- /** @description Long-form description of the company. Up to 25,000 characters. */
716
- description?: string;
717
- /** @description X (Twitter) profile URL or handle. Stored as the canonical handle. */
718
- xUrl?: string;
719
- /** @description LinkedIn company page URL. */
720
- linkedinUrl?: string;
721
- /** @description Facebook company page URL. */
722
- facebookUrl?: string;
797
+ /** @description Public company website URL. Normalized to a canonical apex domain when stored. `null` or `""` means not set. */
798
+ website?: string | null;
799
+ /** @description One-line summary of the company. Up to 280 characters. `null` or `""` means not set. */
800
+ summary?: string | null;
801
+ /** @description Long-form description of the company, as HTML. Up to 25,000 characters. The HTML is sanitized on write: tags and attributes outside the supported formatting set (paragraphs, headings, lists, links, inline emphasis) are removed. Plain text without HTML tags is converted to paragraphs. `null` or `""` means not set. */
802
+ description?: string | null;
803
+ /** @description X (Twitter) profile URL or handle. Stored as the canonical handle. `null` or `""` means not set. */
804
+ xUrl?: string | null;
805
+ /** @description LinkedIn company page URL. `null` or `""` means not set. */
806
+ linkedinUrl?: string | null;
807
+ /** @description Facebook company page URL. `null` or `""` means not set. */
808
+ facebookUrl?: string | null;
723
809
  /** @description Canonical market slugs assigned to the company. Pass an empty array to clear all markets. */
724
810
  markets?: string[];
725
811
  /** @description The company's display name. */
@@ -767,10 +853,19 @@ interface components {
767
853
  employmentType: string;
768
854
  remoteOption: string;
769
855
  officeLocations: {
770
- /** @enum {string} */
856
+ /**
857
+ * @deprecated
858
+ * @description Deprecated — send `locationId` instead (an `id` from `GET /locations/search` or `GET /places`). Still accepted.
859
+ * @enum {string}
860
+ */
771
861
  provider?: "mapbox";
862
+ /**
863
+ * @deprecated
864
+ * @description Deprecated — send `locationId` instead (an `id` from `GET /locations/search` or `GET /places`). Still accepted.
865
+ */
772
866
  providerPlaceId?: string;
773
- displayName: string;
867
+ /** @description Display text for the location. Required unless `locationId` is sent; with `locationId` it defaults to the location's full name (locality, city, region, country), e.g. `Lyon, Auvergne-Rhône-Alpes, France`. */
868
+ displayName?: string;
774
869
  countryCode?: string;
775
870
  region?: string;
776
871
  locality?: string;
@@ -778,6 +873,10 @@ interface components {
778
873
  latitude?: number;
779
874
  longitude?: number;
780
875
  boundingBox?: number[];
876
+ /**
877
+ * @deprecated
878
+ * @description Deprecated — send `locationId` instead (an `id` from `GET /locations/search` or `GET /places`). Still accepted.
879
+ */
781
880
  raw?: {
782
881
  suggestion?: {
783
882
  [key: string]: unknown;
@@ -786,6 +885,8 @@ interface components {
786
885
  [key: string]: unknown;
787
886
  };
788
887
  };
888
+ /** @description Opaque location id from `GET /locations/search` or `GET /places` (`id`) — the preferred way to send a location. Resolved server-side to the full place; the other fields are then ignored except `displayName`. An unknown id returns `400 locations_invalid_id`. If the lookup is temporarily unavailable the entry is kept with `displayName` alone, or the request fails with `503 locations_unavailable` when there is none. */
889
+ locationId?: string;
789
890
  }[];
790
891
  inOfficePeriod?: string;
791
892
  inOfficeFrequency?: number;
@@ -866,11 +967,13 @@ interface components {
866
967
  key: string;
867
968
  /** @description Authoring-default label; the localized public string lives in the board template. */
868
969
  label: string;
970
+ /** @description Optional guidance displayed beside the field. */
971
+ helpText?: string;
869
972
  /**
870
- * @description Field type, which dictates the value: `short_text`/`long_text` → string; `single_select` → one option key; `multi_select` → array of option keys; `boolean` → boolean; `number` → number.
973
+ * @description Field type, which dictates the value: `short_text`/`long_text` → plain string; `rich_text` → sanitized basic HTML; `single_select` → one option key; `multi_select` → array of option keys; `boolean` → boolean; `number` → number.
871
974
  * @enum {string}
872
975
  */
873
- type: "short_text" | "long_text" | "single_select" | "multi_select" | "boolean" | "number";
976
+ type: "short_text" | "long_text" | "rich_text" | "single_select" | "multi_select" | "boolean" | "number";
874
977
  /** @description Present only for `single_select`/`multi_select`. A stored value is one (or, for multi, several) of these option `key`s — never a label. */
875
978
  options?: components["schemas"]["CustomFieldOption"][];
876
979
  /** @description When true, the value cannot be cleared or left empty on a write (rejected with `custom_field_required`). */
@@ -956,7 +1059,7 @@ interface components {
956
1059
  /** @enum {string} */
957
1060
  object: "employer_checkout";
958
1061
  /** @enum {string} */
959
- status: "checkout" | "published" | "invoice_sent";
1062
+ status: "checkout" | "published" | "pending_approval" | "invoice_sent";
960
1063
  /** @description The Stripe Checkout / hosted-invoice URL, or `null`. */
961
1064
  checkoutUrl: string | null;
962
1065
  jobId: string;
@@ -1038,7 +1141,7 @@ interface components {
1038
1141
  deletionEnabled: boolean;
1039
1142
  };
1040
1143
  EmployerCreateJobBody: {
1041
- /** @description Long-form description of the role. Up to 25,000 characters. */
1144
+ /** @description Long-form description of the role, as HTML. Up to 25,000 characters. The HTML is sanitized on write: tags and attributes outside the supported formatting set (paragraphs, headings, lists, links, inline emphasis) are removed. Plain text without HTML tags is converted to paragraphs. */
1042
1145
  description: string;
1043
1146
  /** @description URL-friendly slug for the job. Auto-generated from `title` when omitted. */
1044
1147
  slug?: string;
@@ -1048,10 +1151,10 @@ interface components {
1048
1151
  */
1049
1152
  employmentType?: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other";
1050
1153
  /**
1051
- * @description Whether the role is on-site, hybrid, or fully remote. **Never valid on its own:** `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST). Sending it alone returns `400`.
1154
+ * @description **Required.** Whether the role is on-site, hybrid, or fully remote: one of `on_site`, `hybrid`, `remote`. Omitting it or sending `null` returns `400`. It is not valid on its own either: `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST).
1052
1155
  * @enum {string}
1053
1156
  */
1054
- remoteOption?: "on_site" | "hybrid" | "remote";
1157
+ remoteOption: "on_site" | "hybrid" | "remote";
1055
1158
  /** @description Where remote candidates must hold work authorization. Each entry is the smallest relevant scope: `worldwide`, a `world_region` (EMEA / LATAM / NA / APAC), a `continent`, a `region`, a `subregion`, a `custom` group (e.g. `EU`), a `country` (ISO 3166-1 alpha-2), or a `subdivision` (ISO 3166-2). Subdivisions auto-imply their parent country in the derived `remoteWorkPermitCountryCodes` output. Worldwide is mutually exclusive with all other entries. The canonical `{type, value}` set is published at `GET /v1/taxonomies/remote-permits`. Pass `[]` to clear an existing constraint. */
1056
1159
  remotePermits?: {
1057
1160
  /** @enum {string} */
@@ -1075,19 +1178,19 @@ interface components {
1075
1178
  * @enum {string}
1076
1179
  */
1077
1180
  seniority?: "entry_level" | "associate" | "mid_level" | "senior" | "lead" | "principal" | "director" | "executive";
1078
- /** @description Where candidates apply. Accepts an HTTPS URL, a `mailto:` URI, or a bare email address (normalized to `mailto:` form). Omit to collect applications on the board (built-in applications). */
1079
- applicationUrl?: string;
1080
- /** @description Minimum salary, in `salaryCurrency` units. */
1081
- salaryMin?: number;
1082
- /** @description Maximum salary, in `salaryCurrency` units. */
1083
- salaryMax?: number;
1084
- /** @description Three-letter ISO 4217 currency code for `salaryMin` and `salaryMax`. */
1085
- salaryCurrency?: string;
1086
- /**
1087
- * @description Period the `salaryMin` and `salaryMax` figures are quoted against.
1088
- * @enum {string}
1181
+ /** @description Where candidates apply. Accepts an HTTPS URL, a `mailto:` URI, or a bare email address (normalized to `mailto:` form). Omit it or pass `null` to collect applications on the board (built-in applications). */
1182
+ applicationUrl?: string | null;
1183
+ /** @description Minimum salary, in `salaryCurrency` units. `null` means not set. When `salaryMin` or `salaryMax` is set, `salaryCurrency` and `salaryTimeframe` are both required; otherwise `400`. */
1184
+ salaryMin?: number | null;
1185
+ /** @description Maximum salary, in `salaryCurrency` units. `null` means not set. When `salaryMin` or `salaryMax` is set, `salaryCurrency` and `salaryTimeframe` are both required; otherwise `400`. */
1186
+ salaryMax?: number | null;
1187
+ /** @description Three-letter ISO 4217 currency code for `salaryMin` and `salaryMax`. `null` means not set. Required when `salaryMin` or `salaryMax` is set; optional otherwise. */
1188
+ salaryCurrency?: string | null;
1189
+ /**
1190
+ * @description Period the `salaryMin` and `salaryMax` figures are quoted against. `null` means not set. Required when `salaryMin` or `salaryMax` is set; optional otherwise.
1191
+ * @enum {string|null}
1089
1192
  */
1090
- salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour";
1193
+ salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour" | null;
1091
1194
  /** @description Up to 100 canonical skill slugs from `GET /v1/taxonomies/skills`. Every slug must exist in this account. */
1092
1195
  skills?: string[];
1093
1196
  /** @description Up to 100 canonical category slugs from `GET /v1/taxonomies/categories`. Every slug must exist in this account. */
@@ -1105,12 +1208,23 @@ interface components {
1105
1208
  inOfficePeriod?: "per_week" | "per_month" | "per_year";
1106
1209
  /** @description How often the candidate must be in-office over `inOfficePeriod`. */
1107
1210
  inOfficeFrequency?: number;
1108
- /** @description Physical office locations associated with the job. Prefer `{query: "City, Country"}` for free-form input; `{city, country, region?, locality?}` is also accepted when you already have structured fields. Each entry is resolved server-side; a country mismatch returns `400 jobs_unresolvable_location`. */
1109
- officeLocations?: components["schemas"]["JobOfficeLocationInput"][];
1211
+ /** @description Physical office locations associated with the job. Prefer `{locationId}` with an `id` from `GET /locations/search` (what a location picker returns); `{query: "City, Country"}` for free-form text and `{city, country, region?, locality?}` are also accepted and geocoded server-side (a country mismatch returns `400 jobs_unresolvable_location`). A location outside the board's job-form `allowedCountries` returns `400 jobs_constraint_violation`. */
1212
+ officeLocations?: components["schemas"]["EmployerJobOfficeLocationInput"][];
1213
+ /** @description Collection-reference selections keyed by the configured job collection field key. Values are arrays of record IDs, including for single-select fields. On PATCH omitted keys are preserved; send null or an empty array to clear a field. */
1214
+ collectionValues?: {
1215
+ [key: string]: string[] | unknown;
1216
+ };
1217
+ /** @description Per-job wording for selected collection entries, only on fields whose definition has `allowOverrides`. At most one item per selected entry; an item for an entry that is not selected on the job is rejected with `400 jobs_constraint_violation`. The list replaces the job's stored overrides: on PATCH omit it to keep them and send `[]` to clear them all. Deselecting an entry through `collectionValues` drops its override. */
1218
+ collectionOverrides?: components["schemas"]["JobCollectionOverride"][];
1110
1219
  /** @description The job title. */
1111
1220
  title: string;
1221
+ /** @description Board-defined custom-field values, keyed by the field `key` (definitions, including type, option keys and whether the field is required, are published on the public board context at `GET /v1/boards/:identifier` under `customFields.job`). Writes are **additive**: on `PATCH` a key you send is set/overwritten and a key you omit is preserved; on `POST` this initializes the bag. Send a key with an intentional-empty value (`null`, `""`, or `[]`) to **clear** it; `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 required field left empty, a wrong-typed value or an undefined option is rejected with `400 jobs_constraint_violation`. On `POST`, the required-field check runs only when this property is present (an empty object counts as present); a request that omits it is not rejected for a custom field it did not send. Unknown keys are ignored. */
1222
+ customFieldValues?: {
1223
+ [key: string]: string | string[] | boolean | number | unknown;
1224
+ };
1112
1225
  };
1113
1226
  EmployerJob: components["schemas"]["EmployerJobSummary"] & {
1227
+ resolvedCollectionFields: components["schemas"]["ResolvedJobCollectionField"][];
1114
1228
  /** @description Long-form description of the role, or `null` if not specified. */
1115
1229
  description: string | null;
1116
1230
  /** @description Where candidates apply, or `null` if not specified. An HTTPS URL or `mailto:` URI. */
@@ -1164,6 +1278,24 @@ interface components {
1164
1278
  */
1165
1279
  public: string | null;
1166
1280
  };
1281
+ EmployerJobOfficeLocationInput: {
1282
+ /** @description Opaque location id from `GET /locations/search` or `GET /places` (`id`). Resolved server-side to the full place (country, region, city, locality). An unknown id returns `400 locations_invalid_id`; `503 locations_unavailable` while the lookup is temporarily down. */
1283
+ locationId: string;
1284
+ /** @description Display text for the location. Defaults to the location's full name (locality, city, region, country), e.g. `Lyon, Auvergne-Rhône-Alpes, France`. */
1285
+ displayName?: string;
1286
+ } | {
1287
+ /** @description Free-form location string (e.g. `"Berlin, Germany"`, `"Utrecht, Netherlands"`, `"Mountain View, California, USA"`). Resolved server-side; rejected when no high-confidence match is found. */
1288
+ query: string;
1289
+ } | {
1290
+ /** @description Neighborhood or sub-locality. */
1291
+ locality?: string;
1292
+ /** @description City. */
1293
+ city: string;
1294
+ /** @description Region, state, or province. */
1295
+ region?: string;
1296
+ /** @description ISO 3166-1 alpha-2 country code OR recognized country name/alias. Aliases are normalized to canonical alpha-2 server-side (e.g. `US`, `USA`, `United States` → `US`; `UK`, `GB`, `United Kingdom` → `GB`). */
1297
+ country: string;
1298
+ };
1167
1299
  EmployerJobStat: {
1168
1300
  /** @enum {string} */
1169
1301
  object: "employer_job_stat";
@@ -1211,7 +1343,7 @@ interface components {
1211
1343
  */
1212
1344
  employmentType: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other" | null;
1213
1345
  /**
1214
- * @description Whether the role is on-site, hybrid, or fully remote, or `null` if not specified.
1346
+ * @description Whether the role is on-site, hybrid, or fully remote. `null` only on older jobs saved without one; create requires it and `PATCH` cannot clear it.
1215
1347
  * @enum {string|null}
1216
1348
  */
1217
1349
  remoteOption: "on_site" | "hybrid" | "remote" | null;
@@ -1235,12 +1367,20 @@ interface components {
1235
1367
  isFeatured: boolean;
1236
1368
  /** @description Time at which the job was first published, or `null` if not yet published. ISO 8601 datetime. */
1237
1369
  publishedAt: string | null;
1238
- /** @description Time at which the job expires, or `null` if no expiry is set. ISO 8601 datetime. */
1370
+ /** @description Time at which the job expires as an ISO 8601 datetime. `null` can appear when the expiry requirement does not apply, including for drafts and sponsored jobs; ordinary published jobs always have an expiry. */
1239
1371
  expiresAt: string | null;
1240
1372
  /** @description Time at which the job was created. ISO 8601 datetime. */
1241
1373
  createdAt: string;
1242
1374
  /** @description Time at which the job was last updated. ISO 8601 datetime. */
1243
1375
  updatedAt: string;
1376
+ /** @description Board-defined custom-field values for this job, keyed by the field `key`. The definitions (label, type, option keys, required) are published on the public board context at `GET /v1/boards/:identifier` under `customFields.job`. 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. */
1377
+ customFieldValues: {
1378
+ [key: string]: string | string[] | boolean | number;
1379
+ };
1380
+ /** @description Collection record IDs keyed by configured job collection field. */
1381
+ collectionValues: {
1382
+ [key: string]: string[];
1383
+ };
1244
1384
  links: components["schemas"]["EmployerJobLinks"];
1245
1385
  };
1246
1386
  EmployerPipeline: {
@@ -1296,7 +1436,7 @@ interface components {
1296
1436
  views: number;
1297
1437
  };
1298
1438
  EmployerUpdateJobBody: {
1299
- /** @description Long-form description of the role. Up to 25,000 characters. */
1439
+ /** @description Long-form description of the role, as HTML. Up to 25,000 characters. The HTML is sanitized on write: tags and attributes outside the supported formatting set (paragraphs, headings, lists, links, inline emphasis) are removed. Plain text without HTML tags is converted to paragraphs. */
1300
1440
  description?: string;
1301
1441
  /** @description URL-friendly slug for the job. Auto-generated from `title` when omitted. */
1302
1442
  slug?: string;
@@ -1306,7 +1446,7 @@ interface components {
1306
1446
  */
1307
1447
  employmentType?: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other";
1308
1448
  /**
1309
- * @description Whether the role is on-site, hybrid, or fully remote. **Never valid on its own:** `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST). Sending it alone returns `400`.
1449
+ * @description Whether the role is on-site, hybrid, or fully remote. Omitted means unchanged; `null` returns `400` because a job's workplace type can be changed but not cleared. **Never valid on its own:** `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST). Sending it alone returns `400`.
1310
1450
  * @enum {string}
1311
1451
  */
1312
1452
  remoteOption?: "on_site" | "hybrid" | "remote";
@@ -1335,14 +1475,14 @@ interface components {
1335
1475
  seniority?: "entry_level" | "associate" | "mid_level" | "senior" | "lead" | "principal" | "director" | "executive";
1336
1476
  /** @description Where candidates apply. Accepts an HTTPS URL, a `mailto:` URI, or a bare email address (normalized to `mailto:` form). Pass `null` to clear the stored value and switch the job to on-board (built-in) applications. Omitted means unchanged. */
1337
1477
  applicationUrl?: string | null;
1338
- /** @description Minimum salary, in `salaryCurrency` units. Pass `null` to clear the stored value; omitted means unchanged. */
1478
+ /** @description Minimum salary, in `salaryCurrency` units. Pass `null` to clear the stored value; omitted means unchanged. When a request sends any salary field, the resulting salary (sent values over stored ones) must have `salaryCurrency` and `salaryTimeframe` whenever `salaryMin` or `salaryMax` is set; otherwise `400`. Requests that send no salary field are not checked. */
1339
1479
  salaryMin?: number | null;
1340
- /** @description Maximum salary, in `salaryCurrency` units. Pass `null` to clear the stored value; omitted means unchanged. */
1480
+ /** @description Maximum salary, in `salaryCurrency` units. Pass `null` to clear the stored value; omitted means unchanged. When a request sends any salary field, the resulting salary (sent values over stored ones) must have `salaryCurrency` and `salaryTimeframe` whenever `salaryMin` or `salaryMax` is set; otherwise `400`. Requests that send no salary field are not checked. */
1341
1481
  salaryMax?: number | null;
1342
- /** @description Three-letter ISO 4217 currency code for `salaryMin` and `salaryMax`. Pass `null` to clear the stored value; omitted means unchanged. */
1482
+ /** @description Three-letter ISO 4217 currency code for `salaryMin` and `salaryMax`. Pass `null` to clear the stored value; omitted means unchanged. When a request sends any salary field, the resulting salary (sent values over stored ones) must have `salaryCurrency` and `salaryTimeframe` whenever `salaryMin` or `salaryMax` is set; otherwise `400`. Requests that send no salary field are not checked. */
1343
1483
  salaryCurrency?: string | null;
1344
1484
  /**
1345
- * @description Period the `salaryMin` and `salaryMax` figures are quoted against. Pass `null` to clear the stored value; omitted means unchanged.
1485
+ * @description Period the `salaryMin` and `salaryMax` figures are quoted against. Pass `null` to clear the stored value; omitted means unchanged. When a request sends any salary field, the resulting salary (sent values over stored ones) must have `salaryCurrency` and `salaryTimeframe` whenever `salaryMin` or `salaryMax` is set; otherwise `400`. Requests that send no salary field are not checked.
1346
1486
  * @enum {string|null}
1347
1487
  */
1348
1488
  salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour" | null;
@@ -1363,10 +1503,20 @@ interface components {
1363
1503
  inOfficePeriod?: "per_week" | "per_month" | "per_year";
1364
1504
  /** @description How often the candidate must be in-office over `inOfficePeriod`. */
1365
1505
  inOfficeFrequency?: number;
1366
- /** @description Physical office locations associated with the job. Prefer `{query: "City, Country"}` for free-form input; `{city, country, region?, locality?}` is also accepted when you already have structured fields. Each entry is resolved server-side; a country mismatch returns `400 jobs_unresolvable_location`. */
1367
- officeLocations?: components["schemas"]["JobOfficeLocationInput"][];
1506
+ /** @description Physical office locations associated with the job. Prefer `{locationId}` with an `id` from `GET /locations/search` (what a location picker returns); `{query: "City, Country"}` for free-form text and `{city, country, region?, locality?}` are also accepted and geocoded server-side (a country mismatch returns `400 jobs_unresolvable_location`). A location outside the board's job-form `allowedCountries` returns `400 jobs_constraint_violation`. */
1507
+ officeLocations?: components["schemas"]["EmployerJobOfficeLocationInput"][];
1508
+ /** @description Collection-reference selections keyed by the configured job collection field key. Values are arrays of record IDs, including for single-select fields. On PATCH omitted keys are preserved; send null or an empty array to clear a field. */
1509
+ collectionValues?: {
1510
+ [key: string]: string[] | unknown;
1511
+ };
1512
+ /** @description Per-job wording for selected collection entries, only on fields whose definition has `allowOverrides`. At most one item per selected entry; an item for an entry that is not selected on the job is rejected with `400 jobs_constraint_violation`. The list replaces the job's stored overrides: on PATCH omit it to keep them and send `[]` to clear them all. Deselecting an entry through `collectionValues` drops its override. */
1513
+ collectionOverrides?: components["schemas"]["JobCollectionOverride"][];
1368
1514
  /** @description The job title. */
1369
1515
  title?: string;
1516
+ /** @description Board-defined custom-field values, keyed by the field `key` (definitions, including type, option keys and whether the field is required, are published on the public board context at `GET /v1/boards/:identifier` under `customFields.job`). Writes are **additive**: on `PATCH` a key you send is set/overwritten and a key you omit is preserved; on `POST` this initializes the bag. Send a key with an intentional-empty value (`null`, `""`, or `[]`) to **clear** it; `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 required field left empty, a wrong-typed value or an undefined option is rejected with `400 jobs_constraint_violation`. On `POST`, the required-field check runs only when this property is present (an empty object counts as present); a request that omits it is not rejected for a custom field it did not send. Unknown keys are ignored. */
1517
+ customFieldValues?: {
1518
+ [key: string]: string | string[] | boolean | number | unknown;
1519
+ };
1370
1520
  };
1371
1521
  /** @description The error envelope returned by every non-2xx response. */
1372
1522
  Error: {
@@ -1381,12 +1531,51 @@ interface components {
1381
1531
  details?: unknown;
1382
1532
  };
1383
1533
  };
1534
+ /**
1535
+ * @description Why the field is locked, or `null` when it is not.
1536
+ * @enum {string|null}
1537
+ */
1538
+ FormFieldLockReason: "google_required" | "google_hiring_organization" | "google_work_arrangement" | "google_job_location" | "google_remote_eligibility" | "posting" | "identity" | null;
1384
1539
  HandleAvailability: {
1385
1540
  /** @enum {string} */
1386
1541
  object: "handle_availability";
1387
1542
  handle: string;
1388
1543
  available: boolean;
1389
1544
  };
1545
+ JobCollectionChoiceList: {
1546
+ data: {
1547
+ id: string;
1548
+ name: string;
1549
+ /** @description URL-safe identifier, unique within the collection. Changing it keeps the previous value reserved. */
1550
+ slug?: string;
1551
+ /** @description The entry's logo: the image in the collection's logo field, or a legacy logo URL on older entries. Absent when the entry has neither. */
1552
+ logoUrl?: string;
1553
+ }[];
1554
+ nextCursor: string | null;
1555
+ };
1556
+ JobCollectionFieldDefinition: {
1557
+ key: string;
1558
+ label: string;
1559
+ typeId: string;
1560
+ multiple: boolean;
1561
+ required: boolean;
1562
+ /** @description Operator-set maximum number of entries a poster can select. Only meaningful when `multiple` is true; absent means the system ceiling of 100. */
1563
+ maxSelections?: number;
1564
+ /** @description Whether each job can replace a selected entry's title and description through `collectionOverrides`. Absent means false. */
1565
+ allowOverrides?: boolean;
1566
+ /** @description Key of the collection's short, long or rich text field whose value is a selected entry's default description. When that field is rich text, an entry's `description` is sanitised HTML. Absent means entries have no default description. */
1567
+ descriptionFieldKey?: string;
1568
+ };
1569
+ JobCollectionOverride: {
1570
+ /** @description The collection field key used in `collectionValues`. */
1571
+ fieldKey: string;
1572
+ /** @description A record ID selected for that field on this job. */
1573
+ recordId: string;
1574
+ /** @description The entry's title on this job, up to 160 characters. Omit or send a blank string to use the entry name. */
1575
+ title?: string;
1576
+ /** @description The entry's description on this job, up to 2000 characters of plain text. When the default description field is rich text, the entry's `description` returns it escaped as HTML. Omit or send a blank string to use the default description. */
1577
+ description?: string;
1578
+ };
1390
1579
  /** @description Embedded company resource for the job, or `null` if no company is attached. */
1391
1580
  JobCompany: {
1392
1581
  /** @description Unique identifier for the company. */
@@ -1418,19 +1607,6 @@ interface components {
1418
1607
  /** @description Pre-formatted display name for the location, or `null` if not resolved. */
1419
1608
  displayName: string | null;
1420
1609
  };
1421
- JobOfficeLocationInput: {
1422
- /** @description Free-form location string (e.g. `"Berlin, Germany"`, `"Utrecht, Netherlands"`, `"Mountain View, California, USA"`). Resolved server-side; rejected when no high-confidence match is found. */
1423
- query: string;
1424
- } | {
1425
- /** @description Neighborhood or sub-locality. */
1426
- locality?: string;
1427
- /** @description City. */
1428
- city: string;
1429
- /** @description Region, state, or province. */
1430
- region?: string;
1431
- /** @description ISO 3166-1 alpha-2 country code OR recognized country name/alias. Aliases are normalized to canonical alpha-2 server-side (e.g. `US`, `USA`, `United States` → `US`; `UK`, `GB`, `United Kingdom` → `GB`). */
1432
- country: string;
1433
- };
1434
1610
  JobPostingBillingOptions: {
1435
1611
  /** @enum {string} */
1436
1612
  object: "job_posting_billing_options";
@@ -1524,6 +1700,12 @@ interface components {
1524
1700
  /** Format: email */
1525
1701
  email: string;
1526
1702
  };
1703
+ LocationResolveInput: {
1704
+ /** @description Opaque id returned by location search. */
1705
+ locationId: string;
1706
+ /** @description The same opaque session id used for the search interaction that returned this location. */
1707
+ session: string;
1708
+ };
1527
1709
  LocationSalaryDetail: {
1528
1710
  /** @enum {string} */
1529
1711
  object: "location_salary_detail";
@@ -1546,6 +1728,8 @@ interface components {
1546
1728
  } | null;
1547
1729
  childLocations: {
1548
1730
  placeName: string;
1731
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
1732
+ placeLabel: string;
1549
1733
  placeSlug: string;
1550
1734
  countryCode: string;
1551
1735
  avgSalaryMin: number;
@@ -1562,6 +1746,8 @@ interface components {
1562
1746
  regionSlug: string;
1563
1747
  cities: {
1564
1748
  placeName: string;
1749
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
1750
+ placeLabel: string;
1565
1751
  placeSlug: string;
1566
1752
  countryCode: string;
1567
1753
  avgSalaryMin: number;
@@ -1590,6 +1776,8 @@ interface components {
1590
1776
  }[];
1591
1777
  siblingLocations: {
1592
1778
  placeName: string;
1779
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
1780
+ placeLabel: string;
1593
1781
  placeSlug: string;
1594
1782
  countryCode: string;
1595
1783
  avgSalaryMin: number;
@@ -1717,7 +1905,7 @@ interface components {
1717
1905
  PaywallOffer: {
1718
1906
  /** @enum {string} */
1719
1907
  object: "paywall_offer";
1720
- /** @description The tier key posted to checkout (e.g. `monthly`, `lifetime`). */
1908
+ /** @description The opaque key posted unchanged to checkout (a plan ID or legacy tier key). */
1721
1909
  offerKey: string;
1722
1910
  label: string;
1723
1911
  billingLabel: string;
@@ -1815,6 +2003,80 @@ interface components {
1815
2003
  /** @description Post title. */
1816
2004
  title: string;
1817
2005
  };
2006
+ ProfileChoiceList: {
2007
+ data: {
2008
+ id: string;
2009
+ name: string;
2010
+ /** @description URL-safe identifier, unique within the collection. Changing it keeps the previous value reserved. */
2011
+ slug?: string;
2012
+ logoUrl?: string;
2013
+ }[];
2014
+ nextCursor: string | null;
2015
+ };
2016
+ ProfileCustomFieldDefinition: {
2017
+ key: string;
2018
+ label: string;
2019
+ helpText?: string;
2020
+ /** @enum {string} */
2021
+ type: "short_text" | "long_text" | "rich_text" | "single_select" | "multi_select" | "boolean" | "number" | "date" | "url" | "email" | "phone" | "image_gallery" | "file";
2022
+ required: boolean;
2023
+ /** @enum {string} */
2024
+ visibility: "private" | "public";
2025
+ editableByOwner: boolean;
2026
+ options?: {
2027
+ key: string;
2028
+ label: string;
2029
+ }[];
2030
+ min?: number;
2031
+ max?: number;
2032
+ };
2033
+ ProfileFieldValuesBody: {
2034
+ values: {
2035
+ [key: string]: string | number | boolean | string[] | unknown;
2036
+ };
2037
+ };
2038
+ ProfileFieldValuesResponse: {
2039
+ definitions: components["schemas"]["ProfileCustomFieldDefinition"][];
2040
+ values: {
2041
+ [key: string]: string | number | boolean | string[];
2042
+ };
2043
+ };
2044
+ ProfileObjectReferenceDefinition: {
2045
+ key: string;
2046
+ label: string;
2047
+ typeId: string;
2048
+ multiple: boolean;
2049
+ /** @description Operator-set maximum number of entries a profile can select. Only meaningful when `multiple` is true; absent means the system ceiling of 100. */
2050
+ maxSelections?: number;
2051
+ /** @description Whether a profile must select at least one entry when this field is shown. */
2052
+ required?: boolean;
2053
+ /** @enum {string} */
2054
+ visibility: "private" | "public";
2055
+ editableByOwner: boolean;
2056
+ allowOverrides: boolean;
2057
+ descriptionFieldKey?: string;
2058
+ valueDefinitions?: components["schemas"]["ScalarProfileCustomFieldDefinition"][];
2059
+ entryDefinitions?: components["schemas"]["ScalarProfileCustomFieldDefinition"][];
2060
+ };
2061
+ ProfileObjectReferenceSelectionWrite: {
2062
+ fieldKey: string;
2063
+ recordId: string;
2064
+ titleOverride?: string | null;
2065
+ descriptionOverride?: string | null;
2066
+ values?: {
2067
+ [key: string]: string | number | boolean | string[];
2068
+ };
2069
+ entries?: {
2070
+ key: string;
2071
+ values: {
2072
+ [key: string]: string | number | boolean | string[];
2073
+ };
2074
+ }[];
2075
+ };
2076
+ ProfileObjectReferencesResult: {
2077
+ definitions: components["schemas"]["ProfileObjectReferenceDefinition"][];
2078
+ selections: components["schemas"]["ResolvedProfileObjectReference"][];
2079
+ };
1818
2080
  PublicBlogAdjacentPosts: {
1819
2081
  /** @enum {string} */
1820
2082
  object: "blog_adjacent_posts";
@@ -1972,10 +2234,12 @@ interface components {
1972
2234
  /** @description Default Google-issued ad unit id (10 digits). Resolves the enabled jobs:list.footer slot first, then the first enabled valid slot in alphabetical placement-key order. Null when advertising is off, the publisher id is invalid, or no enabled valid slot exists. Frontends may override it per ad unit. */
1973
2235
  defaultSlotId: string | null;
1974
2236
  };
1975
- /** @description Operator-defined custom field definitions keyed by model (currently only `job`). Each key holds that model's definitions in display order. Company and talent keys are added when those models ship. The frontend uses these to render and localize each record's opaque `customFieldValues`. Display-only: not filterable or searchable in v1. */
2237
+ /** @description Operator-defined custom field definitions keyed by model (currently only `job`). Each key holds that model's definitions in display order. The frontend uses these to render and localize each record's opaque `customFieldValues`. Supports exact-value custom-field filters in job search. Profile definitions are discovered through the profile-fields endpoint. */
1976
2238
  customFields: {
1977
2239
  /** @description This model's custom-field definitions in display order. Empty when the board defines none for the model. */
1978
2240
  job: components["schemas"]["CustomFieldDefinition"][];
2241
+ /** @description Collection-reference job field definitions in display order. Fetch choices from /boards/{identifier}/job-fields/{fieldKey}/choices. */
2242
+ jobCollections: components["schemas"]["JobCollectionFieldDefinition"][];
1979
2243
  };
1980
2244
  /** @description Built-in job-form field configuration from Settings → Job form (custom fields live on `customFields.job`). The platform ENFORCES these constraints when a job is created — a violation is a 400 — so a posting form that ignores them offers options the server will reject and the employer only finds out on submit. */
1981
2245
  jobForm: {
@@ -2018,6 +2282,7 @@ interface components {
2018
2282
  allowedOptions: string[];
2019
2283
  };
2020
2284
  };
2285
+ forms: components["schemas"]["BoardForms"];
2021
2286
  /** @description Operator-authored contact and social identity (settings › Contact & company details). Extracted from the former `footer` group in 4.0.0: contact is identity data, not layout. Brand/social URLs are sanitized to absolute http(s). */
2022
2287
  contact: {
2023
2288
  /** @description Public contact email (render as `mailto:`). Operator-set in settings › Contact & company details. */
@@ -2039,6 +2304,16 @@ interface components {
2039
2304
  query?: string;
2040
2305
  /** @description Scope the results to companies in a single market (sector), by the market slug. Resolves a board-language or English slug; an unknown slug returns 404. Use `GET /boards/:identifier/companies/markets/:market` to resolve a slug to its canonical form first. */
2041
2306
  marketSlug?: string;
2307
+ /** @description Public company custom fields. Clauses are AND-matched and values within a clause are OR-matched. */
2308
+ customFields?: {
2309
+ key: string;
2310
+ values: (string | number | boolean)[];
2311
+ }[];
2312
+ /** @description Public company catalog references. Clauses are AND-matched and record IDs within a clause are OR-matched. */
2313
+ objectReferences?: {
2314
+ key: string;
2315
+ recordIds: string[];
2316
+ }[];
2042
2317
  /** @description An opaque pagination cursor returned in the `nextCursor` field of a previous response. Pass it back to fetch the next page of results. */
2043
2318
  cursor?: string | null;
2044
2319
  /** @description A limit on the number of objects to be returned. Limit can range between 1 and 100. */
@@ -2089,7 +2364,7 @@ interface components {
2089
2364
  */
2090
2365
  employmentType: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other" | null;
2091
2366
  /**
2092
- * @description Whether the role is on-site, hybrid, or fully remote, or `null` if not specified.
2367
+ * @description Whether the role is on-site, hybrid, or fully remote. `null` only on older jobs saved without one; create requires it and `PATCH` cannot clear it.
2093
2368
  * @enum {string|null}
2094
2369
  */
2095
2370
  remoteOption: "on_site" | "hybrid" | "remote" | null;
@@ -2113,7 +2388,7 @@ interface components {
2113
2388
  isFeatured: boolean;
2114
2389
  /** @description Time at which the job was first published, or `null` if not yet published. ISO 8601 datetime. */
2115
2390
  publishedAt: string | null;
2116
- /** @description Time at which the job expires, or `null` if no expiry is set. ISO 8601 datetime. */
2391
+ /** @description Time at which the job expires as an ISO 8601 datetime. `null` can appear when the expiry requirement does not apply, including for drafts and sponsored jobs; ordinary published jobs always have an expiry. */
2117
2392
  expiresAt: string | null;
2118
2393
  /** @description Time at which the job was created. ISO 8601 datetime. */
2119
2394
  createdAt: string;
@@ -2182,10 +2457,12 @@ interface components {
2182
2457
  slug: string;
2183
2458
  name: string;
2184
2459
  }[];
2185
- /** @description Opaque, display-only custom-field values, 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.job` definitions (see `GET /v1/boards/:identifier`). `{}` when the board defines no custom fields. Not filterable or searchable in v1. */
2460
+ /** @description Opaque, display-only custom-field values, 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.job` definitions (see `GET /v1/boards/:identifier`). `{}` when the board defines no custom fields. Supports exact-value custom-field filters in job search. */
2186
2461
  customFieldValues: {
2187
2462
  [key: string]: string | string[] | boolean | number;
2188
2463
  };
2464
+ /** @description Configured collection references resolved to current live names, logos, and public record details. Archived collections and records are omitted. */
2465
+ resolvedCollectionFields: components["schemas"]["ResolvedJobCollectionField"][];
2189
2466
  };
2190
2467
  PublicJobAlertConfirmation: {
2191
2468
  /** @enum {string} */
@@ -2279,6 +2556,10 @@ interface components {
2279
2556
  slug: string;
2280
2557
  name: string;
2281
2558
  logoUrl: string | null;
2559
+ /** @description The company's public custom-field values of the select, boolean, and number types, keyed by field key; select values are option `key`s. Private fields and text types are omitted (the full company carries text values). `{}` when none. */
2560
+ customFieldValues: {
2561
+ [key: string]: string | string[] | boolean | number;
2562
+ };
2282
2563
  } | null;
2283
2564
  /** @description Job categories (slug + board display name). Guaranteed resolvable: every emitted slug resolves via `GET /v1/boards/:identifier/categories/:slug`. */
2284
2565
  categories: {
@@ -2290,6 +2571,10 @@ interface components {
2290
2571
  slug: string;
2291
2572
  name: string;
2292
2573
  }[];
2574
+ /** @description The job's custom-field values of the select, boolean, and number types, keyed by each field's `key`; select values are option `key`s. Resolve labels via the board's `customFields.job` definitions (see `GET /v1/boards/:identifier`). Values of fields no longer defined, and removed options, are omitted; text types are only on the full job (`PublicJob`). `{}` when none. */
2575
+ customFieldValues: {
2576
+ [key: string]: string | string[] | boolean | number;
2577
+ };
2293
2578
  links: {
2294
2579
  /**
2295
2580
  * Format: uri
@@ -2308,6 +2593,25 @@ interface components {
2308
2593
  */
2309
2594
  public: string | null;
2310
2595
  };
2596
+ PublicLocation: {
2597
+ /** @enum {string} */
2598
+ object: "location";
2599
+ /** @description Opaque location id. Complete the pick through `POST /locations/resolve` with this id and the search session before using it in a later submission. Shares its id space with `PublicPlace.id`. */
2600
+ id: string;
2601
+ /** @description The location’s own name, e.g. `Berlin`. */
2602
+ name: string;
2603
+ /** @description Name with its parent context, for display in the input once picked, e.g. `Berlin, Germany`. */
2604
+ fullName: string;
2605
+ /** @description The parent context alone, for a secondary line in the result list, e.g. `Germany` for Berlin or `Berlin, Germany` for Kreuzberg; `null` for a country. */
2606
+ contextLabel: string | null;
2607
+ /**
2608
+ * @description Same vocabulary as `PublicPlace.placeType`: `country`, `region`, `city`, or `locality`.
2609
+ * @enum {string}
2610
+ */
2611
+ placeType: "country" | "region" | "city" | "locality";
2612
+ /** @description ISO 3166-1 alpha-2 country code, or `null` if unknown. */
2613
+ countryCode: string | null;
2614
+ };
2311
2615
  PublicPlace: {
2312
2616
  /** @enum {string} */
2313
2617
  object: "place";
@@ -2324,6 +2628,10 @@ interface components {
2324
2628
  /** @description Live published-job count for this place. */
2325
2629
  jobCount: number;
2326
2630
  };
2631
+ PublicProfileFields: {
2632
+ definitions: components["schemas"]["ProfileCustomFieldDefinition"][];
2633
+ referenceDefinitions: components["schemas"]["ProfileObjectReferenceDefinition"][];
2634
+ };
2327
2635
  PublicSearchJobsBody: {
2328
2636
  /** @description Free-text search query matched against job title and description. Up to 200 characters. */
2329
2637
  query?: string;
@@ -2344,6 +2652,8 @@ interface components {
2344
2652
  employmentType?: ("full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other")[];
2345
2653
  /** @description Only return jobs at any of the given seniority levels. Up to 10 values. */
2346
2654
  seniority?: ("entry_level" | "associate" | "mid_level" | "senior" | "lead" | "principal" | "director" | "executive")[];
2655
+ /** @description Only return jobs tagged with any of the given category slugs. Up to 10 values. Accepts the `sourceSlug` or the board-language `canonicalSlug` from `GET /v1/boards/{identifier}/categories`, or a `slug` from a job card's `categories`. Unknown slugs match no jobs. */
2656
+ categories?: string[];
2347
2657
  /** @description Range filter on the job's `publishedAt` timestamp. */
2348
2658
  publishedAt?: {
2349
2659
  /**
@@ -2361,6 +2671,16 @@ interface components {
2361
2671
  location?: string;
2362
2672
  /** @description Search radius in kilometres around `location` (10–250; default 50). Ignored without `location`. */
2363
2673
  radius?: number;
2674
+ /** @description Public custom job fields. Clauses are AND-matched; values within a clause are OR-matched. Up to 10 clauses and 10 values per clause. */
2675
+ customFields?: {
2676
+ key: string;
2677
+ values: (string | number | boolean)[];
2678
+ }[];
2679
+ /** @description Public custom company profile fields, matched against each job's company. Keys and option keys come from the board's public company profile field definitions (`GET /v1/boards/{identifier}/profile-fields/company`). Clauses are AND-matched; values within a clause are OR-matched. Up to 10 clauses and 10 values per clause. An unknown or private key, or an undefined option key, is rejected with `400 invalid_filter`. Kept separate from `customFields`, so a job field and a company field may share a key. */
2680
+ companyCustomFields?: {
2681
+ key: string;
2682
+ values: (string | number | boolean)[];
2683
+ }[];
2364
2684
  };
2365
2685
  /** @description An opaque pagination cursor returned in the `nextCursor` field of a previous response. Pass it back to fetch the next page of results. */
2366
2686
  cursor?: string;
@@ -2447,6 +2767,9 @@ interface components {
2447
2767
  /** @description Every stage id of the job, in the new order. */
2448
2768
  orderedStageIds: string[];
2449
2769
  };
2770
+ ReplaceProfileObjectReferenceSelectionsBody: {
2771
+ selections: components["schemas"]["ProfileObjectReferenceSelectionWrite"][];
2772
+ };
2450
2773
  ReplyBody: {
2451
2774
  body: string;
2452
2775
  };
@@ -2459,6 +2782,173 @@ interface components {
2459
2782
  /** Format: email */
2460
2783
  email: string;
2461
2784
  };
2785
+ ResolvedJobCollectionField: {
2786
+ key: string;
2787
+ label: string;
2788
+ entries: {
2789
+ id: string;
2790
+ name: string;
2791
+ /** @description URL-safe identifier, unique within the collection. Changing it keeps the previous value reserved. */
2792
+ slug?: string;
2793
+ /** @description The entry's logo: the image in the collection's logo field, or a legacy logo URL on older entries. Absent when the entry has neither. */
2794
+ logoUrl?: string;
2795
+ /** @description The entry's title on this job: the job's `titleOverride` when set, otherwise the entry name. Render this. */
2796
+ title: string;
2797
+ /** @description The entry's description on this job: the job's `descriptionOverride` when set, otherwise the value of the field's default description field, or `null` when neither exists. Sanitised HTML when the default description field is rich text, with a plain-text override escaped into paragraphs. Render this. */
2798
+ description: string | null;
2799
+ /** @description The title this job set for the entry, or `null` when it uses the entry name. */
2800
+ titleOverride: string | null;
2801
+ /** @description The plain-text description this job set for the entry, or `null` when it uses the default description. */
2802
+ descriptionOverride: string | null;
2803
+ fields: {
2804
+ key: string;
2805
+ label: string;
2806
+ /** @enum {string} */
2807
+ type: "short_text" | "long_text" | "rich_text" | "single_select" | "multi_select" | "boolean" | "number" | "date" | "url" | "email" | "phone" | "image" | "image_gallery" | "file" | "reference";
2808
+ helpText?: string;
2809
+ options?: {
2810
+ key: string;
2811
+ label: string;
2812
+ }[];
2813
+ }[];
2814
+ values: {
2815
+ [key: string]: string | string[] | boolean | number | {
2816
+ id: string;
2817
+ name: string;
2818
+ contentType: string;
2819
+ sizeBytes: number;
2820
+ url: string;
2821
+ } | {
2822
+ id: string;
2823
+ name: string;
2824
+ contentType: string;
2825
+ sizeBytes: number;
2826
+ url: string;
2827
+ }[];
2828
+ };
2829
+ references?: {
2830
+ [key: string]: {
2831
+ id: string;
2832
+ name: string;
2833
+ /** @description URL-safe identifier, unique within the collection. Changing it keeps the previous value reserved. */
2834
+ slug?: string;
2835
+ fields: {
2836
+ key: string;
2837
+ label: string;
2838
+ /** @enum {string} */
2839
+ type: "short_text" | "long_text" | "rich_text" | "single_select" | "multi_select" | "boolean" | "number" | "date" | "url" | "email" | "phone" | "image" | "image_gallery" | "file" | "reference";
2840
+ helpText?: string;
2841
+ options?: {
2842
+ key: string;
2843
+ label: string;
2844
+ }[];
2845
+ }[];
2846
+ values: {
2847
+ [key: string]: string | string[] | boolean | number | {
2848
+ id: string;
2849
+ name: string;
2850
+ contentType: string;
2851
+ sizeBytes: number;
2852
+ url: string;
2853
+ } | {
2854
+ id: string;
2855
+ name: string;
2856
+ contentType: string;
2857
+ sizeBytes: number;
2858
+ url: string;
2859
+ }[];
2860
+ };
2861
+ }[];
2862
+ };
2863
+ }[];
2864
+ };
2865
+ ResolvedProfileObjectReference: {
2866
+ fieldKey: string;
2867
+ fieldLabel: string;
2868
+ recordId: string;
2869
+ /** @description URL-safe identifier, unique within the collection. Changing it keeps the previous value reserved. */
2870
+ slug?: string;
2871
+ title: string;
2872
+ description?: string;
2873
+ titleOverride?: string;
2874
+ descriptionOverride?: string;
2875
+ /** @description The entry's logo: the image in the collection's logo field, or a legacy logo URL on older entries. Absent when the entry has neither. */
2876
+ logoUrl?: string;
2877
+ /** @enum {string} */
2878
+ descriptionType?: "rich_text";
2879
+ descriptionFieldKey?: string;
2880
+ fields: {
2881
+ key: string;
2882
+ label: string;
2883
+ /** @enum {string} */
2884
+ type: "short_text" | "long_text" | "rich_text" | "single_select" | "multi_select" | "boolean" | "number" | "date" | "url" | "email" | "phone" | "image" | "image_gallery" | "file" | "reference";
2885
+ helpText?: string;
2886
+ options?: {
2887
+ key: string;
2888
+ label: string;
2889
+ }[];
2890
+ }[];
2891
+ attributes: {
2892
+ [key: string]: string | string[] | boolean | number | {
2893
+ id: string;
2894
+ name: string;
2895
+ contentType: string;
2896
+ sizeBytes: number;
2897
+ url: string;
2898
+ } | {
2899
+ id: string;
2900
+ name: string;
2901
+ contentType: string;
2902
+ sizeBytes: number;
2903
+ url: string;
2904
+ }[];
2905
+ };
2906
+ references?: {
2907
+ [key: string]: {
2908
+ id: string;
2909
+ name: string;
2910
+ /** @description URL-safe identifier, unique within the collection. Changing it keeps the previous value reserved. */
2911
+ slug?: string;
2912
+ fields: {
2913
+ key: string;
2914
+ label: string;
2915
+ /** @enum {string} */
2916
+ type: "short_text" | "long_text" | "rich_text" | "single_select" | "multi_select" | "boolean" | "number" | "date" | "url" | "email" | "phone" | "image" | "image_gallery" | "file" | "reference";
2917
+ helpText?: string;
2918
+ options?: {
2919
+ key: string;
2920
+ label: string;
2921
+ }[];
2922
+ }[];
2923
+ values: {
2924
+ [key: string]: string | string[] | boolean | number | {
2925
+ id: string;
2926
+ name: string;
2927
+ contentType: string;
2928
+ sizeBytes: number;
2929
+ url: string;
2930
+ } | {
2931
+ id: string;
2932
+ name: string;
2933
+ contentType: string;
2934
+ sizeBytes: number;
2935
+ url: string;
2936
+ }[];
2937
+ };
2938
+ }[];
2939
+ };
2940
+ valueDefinitions: components["schemas"]["ScalarProfileCustomFieldDefinition"][];
2941
+ entryDefinitions: components["schemas"]["ScalarProfileCustomFieldDefinition"][];
2942
+ values: {
2943
+ [key: string]: string | number | boolean | string[];
2944
+ };
2945
+ entries: {
2946
+ key: string;
2947
+ values: {
2948
+ [key: string]: string | number | boolean | string[];
2949
+ };
2950
+ }[];
2951
+ };
2462
2952
  Resume: {
2463
2953
  /** @enum {string} */
2464
2954
  object: "resume";
@@ -2495,6 +2985,8 @@ interface components {
2495
2985
  object: "salary_location";
2496
2986
  placeSlug: string;
2497
2987
  placeName: string;
2988
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
2989
+ placeLabel: string;
2498
2990
  /** @description Slug of the parent place; `null` for a top-level node. */
2499
2991
  parentSlug: string | null;
2500
2992
  avgSalaryMin: number;
@@ -2554,6 +3046,10 @@ interface components {
2554
3046
  savedAt: string;
2555
3047
  job: components["schemas"]["PublicJobCard"];
2556
3048
  };
3049
+ ScalarProfileCustomFieldDefinition: components["schemas"]["ProfileCustomFieldDefinition"] & {
3050
+ /** @enum {string} */
3051
+ type?: "short_text" | "long_text" | "rich_text" | "single_select" | "multi_select" | "boolean" | "number" | "date" | "url" | "email" | "phone";
3052
+ };
2557
3053
  SendWorkEmailBody: {
2558
3054
  /** Format: email */
2559
3055
  workEmail: string;
@@ -2593,6 +3089,8 @@ interface components {
2593
3089
  childLocations: {
2594
3090
  placeSlug: string;
2595
3091
  placeName: string;
3092
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
3093
+ placeLabel: string;
2596
3094
  avgSalaryMin: number;
2597
3095
  avgSalaryMax: number;
2598
3096
  jobCount: number;
@@ -2603,6 +3101,8 @@ interface components {
2603
3101
  cities: {
2604
3102
  placeSlug: string;
2605
3103
  placeName: string;
3104
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
3105
+ placeLabel: string;
2606
3106
  avgSalaryMin: number;
2607
3107
  avgSalaryMax: number;
2608
3108
  jobCount: number;
@@ -2611,6 +3111,8 @@ interface components {
2611
3111
  otherLocations: {
2612
3112
  placeSlug: string;
2613
3113
  placeName: string;
3114
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
3115
+ placeLabel: string;
2614
3116
  avgSalaryMin: number;
2615
3117
  avgSalaryMax: number;
2616
3118
  jobCount: number;
@@ -2681,6 +3183,8 @@ interface components {
2681
3183
  avgSalaryMax: number;
2682
3184
  jobCount: number;
2683
3185
  placeName: string;
3186
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
3187
+ placeLabel: string;
2684
3188
  placeSlug: string;
2685
3189
  countryCode: string;
2686
3190
  }[];
@@ -2840,6 +3344,11 @@ interface components {
2840
3344
  startDate: string | null;
2841
3345
  endDate: string | null;
2842
3346
  }[];
3347
+ /** @description Values for public candidate custom fields, keyed by field key. Private and unknown fields are omitted. */
3348
+ customFieldValues: {
3349
+ [key: string]: string | number | boolean | string[];
3350
+ };
3351
+ objectReferences: components["schemas"]["ResolvedProfileObjectReference"][];
2843
3352
  };
2844
3353
  TalentList: {
2845
3354
  id: string;
@@ -2919,6 +3428,11 @@ interface components {
2919
3428
  name: string;
2920
3429
  proficiency: string;
2921
3430
  }[];
3431
+ /** @description Values for public candidate custom fields, keyed by field key. Private and unknown fields are omitted. */
3432
+ customFieldValues: {
3433
+ [key: string]: string | number | boolean | string[];
3434
+ };
3435
+ objectReferences: components["schemas"]["ResolvedProfileObjectReference"][];
2922
3436
  };
2923
3437
  TalentUnlock: {
2924
3438
  /** @enum {string} */
@@ -2996,6 +3510,8 @@ interface components {
2996
3510
  childLocations: {
2997
3511
  placeSlug: string;
2998
3512
  placeName: string;
3513
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
3514
+ placeLabel: string;
2999
3515
  avgSalaryMin: number;
3000
3516
  avgSalaryMax: number;
3001
3517
  jobCount: number;
@@ -3006,6 +3522,8 @@ interface components {
3006
3522
  cities: {
3007
3523
  placeSlug: string;
3008
3524
  placeName: string;
3525
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
3526
+ placeLabel: string;
3009
3527
  avgSalaryMin: number;
3010
3528
  avgSalaryMax: number;
3011
3529
  jobCount: number;
@@ -3014,6 +3532,8 @@ interface components {
3014
3532
  otherLocations: {
3015
3533
  placeSlug: string;
3016
3534
  placeName: string;
3535
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
3536
+ placeLabel: string;
3017
3537
  avgSalaryMin: number;
3018
3538
  avgSalaryMax: number;
3019
3539
  jobCount: number;
@@ -3088,6 +3608,8 @@ interface components {
3088
3608
  avgSalaryMax: number;
3089
3609
  jobCount: number;
3090
3610
  placeName: string;
3611
+ /** @description Display label for the place in a salary list. A city or locality adds its subdivision code ("New York, NY", "Washington, DC") so it reads apart from the region it shares a name with; a region or country is its name. Render this rather than `placeName` in lists. */
3612
+ placeLabel: string;
3091
3613
  placeSlug: string;
3092
3614
  countryCode: string;
3093
3615
  }[];