@cavuno/board 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,33 @@
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.1.0 — 2026-08-06
7
+
8
+ - **Salary null-clears on job PATCH** (operator `PATCH /v1/jobs/:id` and
9
+ employer `PATCH /v1/boards/:identifier/me/companies/:slug/jobs/:id`):
10
+ `salaryMin`, `salaryMax`, `salaryCurrency`, and `salaryTimeframe` now
11
+ accept an explicit `null` meaning "clear the stored value" — the same
12
+ tri-state `applicationUrl` and `expiresAt` already document (value sets,
13
+ `null` clears, omitted leaves unchanged). Clearing also drops the derived
14
+ USD figures, so salary filters stop matching a job whose salary was
15
+ withdrawn.
16
+ - **Structured remote fields on `PublicJobCard`**: `remoteWorldwide`
17
+ (`boolean | null`) and `remoteWorkPermitCountryCodes` (`string[]`) beside
18
+ the pre-worded `remoteLocationLabel`, so templates can word remote
19
+ regions from their own catalogs instead of matching the board-language
20
+ `"Worldwide"` label string. Derived from the same permit selection the
21
+ label reads — the boolean and the label always agree.
22
+ - **Docs**: `Plan.name` and `Plan.description` are documented as authoring
23
+ defaults — the localized public string lives in the board template,
24
+ composed from `featureSummary`, `billingInterval`, and `talent`.
25
+ - **Marketing consent**: consent is a property of the board
26
+ user. New `board.me.marketingConsent` namespace — `retrieve()` (the
27
+ consent, or `null` when no decision exists), `grant()`, `withdraw()` —
28
+ plus the `MarketingConsent` type. The API records the decision, never
29
+ the prose: disclosure wording is authored by the board's own frontend.
30
+ - **Outbound webhooks**: webhook subscription endpoints and event types
31
+ join the OpenAPI contract and generated types.
32
+
6
33
  ## 4.0.0 — 2026-08-03
7
34
 
8
35
  - **Lossy seams:** Resolution is fine;
@@ -205,6 +205,8 @@ interface components {
205
205
  /** @description Minimum 8 characters. */
206
206
  password: string;
207
207
  displayName: string;
208
+ /** @description True only when the person ticked a marketing checkbox your UI displayed with its disclosure wording. Omit when no checkbox was shown; false and absent both record nothing. */
209
+ marketingConsent?: boolean;
208
210
  };
209
211
  BoardAuthRequestMagicLinkBody: {
210
212
  /** Format: email */
@@ -1140,17 +1142,17 @@ interface components {
1140
1142
  seniority?: "entry_level" | "associate" | "mid_level" | "senior" | "lead" | "principal" | "director" | "executive";
1141
1143
  /** @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. */
1142
1144
  applicationUrl?: string | null;
1143
- /** @description Minimum salary, in `salaryCurrency` units. */
1144
- salaryMin?: number;
1145
- /** @description Maximum salary, in `salaryCurrency` units. */
1146
- salaryMax?: number;
1147
- /** @description Three-letter ISO 4217 currency code for `salaryMin` and `salaryMax`. */
1148
- salaryCurrency?: string;
1145
+ /** @description Minimum salary, in `salaryCurrency` units. Pass `null` to clear the stored value; omitted means unchanged. */
1146
+ salaryMin?: number | null;
1147
+ /** @description Maximum salary, in `salaryCurrency` units. Pass `null` to clear the stored value; omitted means unchanged. */
1148
+ salaryMax?: number | null;
1149
+ /** @description Three-letter ISO 4217 currency code for `salaryMin` and `salaryMax`. Pass `null` to clear the stored value; omitted means unchanged. */
1150
+ salaryCurrency?: string | null;
1149
1151
  /**
1150
- * @description Period the `salaryMin` and `salaryMax` figures are quoted against.
1151
- * @enum {string}
1152
+ * @description Period the `salaryMin` and `salaryMax` figures are quoted against. Pass `null` to clear the stored value; omitted means unchanged.
1153
+ * @enum {string|null}
1152
1154
  */
1153
- salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour";
1155
+ salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour" | null;
1154
1156
  /** @description Up to 100 canonical skill slugs from `GET /v1/taxonomies/skills`. Every slug must exist in this account. */
1155
1157
  skills?: string[];
1156
1158
  /** @description Up to 100 canonical category slugs from `GET /v1/taxonomies/categories`. Every slug must exist in this account. */
@@ -1455,6 +1457,21 @@ interface components {
1455
1457
  /** @description Number of companies on the board in this market. */
1456
1458
  companyCount: number;
1457
1459
  };
1460
+ MarketingConsent: {
1461
+ id: string;
1462
+ /** @enum {string} */
1463
+ object: "marketing_consent";
1464
+ /** @enum {string} */
1465
+ status: "granted" | "withdrawn";
1466
+ source: string;
1467
+ /** @enum {string|null} */
1468
+ reason: "person_request" | "operator_request" | "account_deleted" | null;
1469
+ /** Format: date-time */
1470
+ grantedAt: string | null;
1471
+ /** Format: date-time */
1472
+ withdrawnAt: string | null;
1473
+ revision: number;
1474
+ } | null;
1458
1475
  Message: {
1459
1476
  id: string;
1460
1477
  /** @enum {string} */
@@ -1518,7 +1535,9 @@ interface components {
1518
1535
  /** @enum {string} */
1519
1536
  object: "plan";
1520
1537
  id: string;
1538
+ /** @description The operator's authoring-default plan name, in the board's language. Board templates that localize chrome should treat this as the fallback and word plan names from `featureSummary` structure or their own catalogs. */
1521
1539
  name: string;
1540
+ /** @description Authoring default: the operator's prose description in the board's language. The localized public string lives in the board template — compose it from `featureSummary`, `billingInterval`, and `talent` rather than displaying this verbatim on localized surfaces. */
1522
1541
  description: string | null;
1523
1542
  /** @enum {string} */
1524
1543
  purpose: "job_posting" | "talent_access";
@@ -1913,6 +1932,10 @@ interface components {
1913
1932
  remoteOption: "on_site" | "hybrid" | "remote" | null;
1914
1933
  /** @description Display region label for remote jobs (e.g. "United States", "Worldwide"); `null` for non-remote jobs. */
1915
1934
  remoteLocationLabel: string | null;
1935
+ /** @description Structured twin of `remoteLocationLabel`’s "Worldwide" case: `true` when the remote permit selection is unrestricted (explicit worldwide, or no constraint), `false` for a constrained remote job, `null` for non-remote jobs. Word it from your own catalog instead of matching the board-language label string. */
1936
+ remoteWorldwide: boolean | null;
1937
+ /** @description ISO 3166-1 alpha-2 codes the remote permit selection covers (derived expansion, mirroring the job detail field of the same name). Empty for worldwide/unconstrained and non-remote jobs. */
1938
+ remoteWorkPermitCountryCodes: string[];
1916
1939
  salaryMin: number | null;
1917
1940
  salaryMax: number | null;
1918
1941
  salaryCurrency: string | null;
@@ -205,6 +205,8 @@ interface components {
205
205
  /** @description Minimum 8 characters. */
206
206
  password: string;
207
207
  displayName: string;
208
+ /** @description True only when the person ticked a marketing checkbox your UI displayed with its disclosure wording. Omit when no checkbox was shown; false and absent both record nothing. */
209
+ marketingConsent?: boolean;
208
210
  };
209
211
  BoardAuthRequestMagicLinkBody: {
210
212
  /** Format: email */
@@ -1140,17 +1142,17 @@ interface components {
1140
1142
  seniority?: "entry_level" | "associate" | "mid_level" | "senior" | "lead" | "principal" | "director" | "executive";
1141
1143
  /** @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. */
1142
1144
  applicationUrl?: string | null;
1143
- /** @description Minimum salary, in `salaryCurrency` units. */
1144
- salaryMin?: number;
1145
- /** @description Maximum salary, in `salaryCurrency` units. */
1146
- salaryMax?: number;
1147
- /** @description Three-letter ISO 4217 currency code for `salaryMin` and `salaryMax`. */
1148
- salaryCurrency?: string;
1145
+ /** @description Minimum salary, in `salaryCurrency` units. Pass `null` to clear the stored value; omitted means unchanged. */
1146
+ salaryMin?: number | null;
1147
+ /** @description Maximum salary, in `salaryCurrency` units. Pass `null` to clear the stored value; omitted means unchanged. */
1148
+ salaryMax?: number | null;
1149
+ /** @description Three-letter ISO 4217 currency code for `salaryMin` and `salaryMax`. Pass `null` to clear the stored value; omitted means unchanged. */
1150
+ salaryCurrency?: string | null;
1149
1151
  /**
1150
- * @description Period the `salaryMin` and `salaryMax` figures are quoted against.
1151
- * @enum {string}
1152
+ * @description Period the `salaryMin` and `salaryMax` figures are quoted against. Pass `null` to clear the stored value; omitted means unchanged.
1153
+ * @enum {string|null}
1152
1154
  */
1153
- salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour";
1155
+ salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour" | null;
1154
1156
  /** @description Up to 100 canonical skill slugs from `GET /v1/taxonomies/skills`. Every slug must exist in this account. */
1155
1157
  skills?: string[];
1156
1158
  /** @description Up to 100 canonical category slugs from `GET /v1/taxonomies/categories`. Every slug must exist in this account. */
@@ -1455,6 +1457,21 @@ interface components {
1455
1457
  /** @description Number of companies on the board in this market. */
1456
1458
  companyCount: number;
1457
1459
  };
1460
+ MarketingConsent: {
1461
+ id: string;
1462
+ /** @enum {string} */
1463
+ object: "marketing_consent";
1464
+ /** @enum {string} */
1465
+ status: "granted" | "withdrawn";
1466
+ source: string;
1467
+ /** @enum {string|null} */
1468
+ reason: "person_request" | "operator_request" | "account_deleted" | null;
1469
+ /** Format: date-time */
1470
+ grantedAt: string | null;
1471
+ /** Format: date-time */
1472
+ withdrawnAt: string | null;
1473
+ revision: number;
1474
+ } | null;
1458
1475
  Message: {
1459
1476
  id: string;
1460
1477
  /** @enum {string} */
@@ -1518,7 +1535,9 @@ interface components {
1518
1535
  /** @enum {string} */
1519
1536
  object: "plan";
1520
1537
  id: string;
1538
+ /** @description The operator's authoring-default plan name, in the board's language. Board templates that localize chrome should treat this as the fallback and word plan names from `featureSummary` structure or their own catalogs. */
1521
1539
  name: string;
1540
+ /** @description Authoring default: the operator's prose description in the board's language. The localized public string lives in the board template — compose it from `featureSummary`, `billingInterval`, and `talent` rather than displaying this verbatim on localized surfaces. */
1522
1541
  description: string | null;
1523
1542
  /** @enum {string} */
1524
1543
  purpose: "job_posting" | "talent_access";
@@ -1913,6 +1932,10 @@ interface components {
1913
1932
  remoteOption: "on_site" | "hybrid" | "remote" | null;
1914
1933
  /** @description Display region label for remote jobs (e.g. "United States", "Worldwide"); `null` for non-remote jobs. */
1915
1934
  remoteLocationLabel: string | null;
1935
+ /** @description Structured twin of `remoteLocationLabel`’s "Worldwide" case: `true` when the remote permit selection is unrestricted (explicit worldwide, or no constraint), `false` for a constrained remote job, `null` for non-remote jobs. Word it from your own catalog instead of matching the board-language label string. */
1936
+ remoteWorldwide: boolean | null;
1937
+ /** @description ISO 3166-1 alpha-2 codes the remote permit selection covers (derived expansion, mirroring the job detail field of the same name). Empty for worldwide/unconstrained and non-remote jobs. */
1938
+ remoteWorkPermitCountryCodes: string[];
1916
1939
  salaryMin: number | null;
1917
1940
  salaryMax: number | null;
1918
1941
  salaryCurrency: string | null;
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-GVe6WAfT.js';
1
+ import { S as Schemas } from './_spec-BZDv2dc5.js';
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-GVe6WAfT.mjs';
1
+ import { S as Schemas } from './_spec-BZDv2dc5.mjs';
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-GVe6WAfT.mjs';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-BuLpV8iy.mjs';
1
+ import { S as Schemas } from './_spec-BZDv2dc5.mjs';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-BX6d_sdd.mjs';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-GVe6WAfT.js';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-QrbXOYB9.js';
1
+ import { S as Schemas } from './_spec-BZDv2dc5.js';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-BbLJfz1z.js';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -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-DUhgiacm.js';
2
- import { P as PublicJob } from './jobs-QrbXOYB9.js';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BTEZ0uiI.js';
2
+ import { P as PublicJob } from './jobs-BbLJfz1z.js';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
@@ -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-GGWJ4coe.mjs';
2
- import { P as PublicJob } from './jobs-BuLpV8iy.mjs';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BF3Qao6J.mjs';
2
+ import { P as PublicJob } from './jobs-BX6d_sdd.mjs';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
@@ -1,5 +1,5 @@
1
- import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-BuLpV8iy.mjs';
2
- import './_spec-GVe6WAfT.mjs';
1
+ import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-BX6d_sdd.mjs';
2
+ import './_spec-BZDv2dc5.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/filters` — the canonical listing-filter vocabulary and URL
package/dist/filters.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-QrbXOYB9.js';
2
- import './_spec-GVe6WAfT.js';
1
+ import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-BbLJfz1z.js';
2
+ import './_spec-BZDv2dc5.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/filters` — the canonical listing-filter vocabulary and URL
package/dist/format.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-DFKr0HzU.mjs';
2
- import { C as CustomFieldDefinition } from './board-GGWJ4coe.mjs';
3
- import { C as CustomFieldValues } from './jobs-BuLpV8iy.mjs';
4
- import './_spec-GVe6WAfT.mjs';
1
+ export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-icxRVydh.mjs';
2
+ import { C as CustomFieldDefinition } from './board-BF3Qao6J.mjs';
3
+ import { C as CustomFieldValues } from './jobs-BX6d_sdd.mjs';
4
+ import './_spec-BZDv2dc5.mjs';
5
5
 
6
6
  /**
7
7
  * Date display helpers in the board language (required leading parameter,
package/dist/format.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-DiccJhk4.js';
2
- import { C as CustomFieldDefinition } from './board-DUhgiacm.js';
3
- import { C as CustomFieldValues } from './jobs-QrbXOYB9.js';
4
- import './_spec-GVe6WAfT.js';
1
+ export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-SGaWth6C.js';
2
+ import { C as CustomFieldDefinition } from './board-BTEZ0uiI.js';
3
+ import { C as CustomFieldValues } from './jobs-BbLJfz1z.js';
4
+ import './_spec-BZDv2dc5.js';
5
5
 
6
6
  /**
7
7
  * Date display helpers in the board language (required leading parameter,
package/dist/index.d.mts CHANGED
@@ -1,12 +1,12 @@
1
- import { S as Schemas, c as components } from './_spec-GVe6WAfT.mjs';
2
- import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-Cr4noJJZ.mjs';
3
- export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-Cr4noJJZ.mjs';
4
- import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-GGWJ4coe.mjs';
5
- export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, C as CustomFieldDefinition, l as CustomFieldOption, m as CustomFieldType, L as LocationSalaryDetail, n as LocationSkillsIndex, o as LocationTitlesIndex, P as PublicBoard, p as PublicBoardAnalytics, q as PublicBoardFeatures, r as PublicCompany, s as PublicCompanyDetail, t as SalaryCompany, u as SalaryLocation, v as SalarySkill, w as SalaryTitle, x as SkillLocationSalary, y as SkillLocationsIndex, S as SkillSalaryDetail, z as TitleLocationSalary, A as TitleLocationsIndex, T as TitleSalaryDetail } from './board-GGWJ4coe.mjs';
6
- import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-BuLpV8iy.mjs';
7
- export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-BuLpV8iy.mjs';
8
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-Cf64mI8A.mjs';
9
- export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-Cf64mI8A.mjs';
1
+ import { S as Schemas, c as components } from './_spec-BZDv2dc5.mjs';
2
+ import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-OKrdAHv8.mjs';
3
+ export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-OKrdAHv8.mjs';
4
+ import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-BF3Qao6J.mjs';
5
+ export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, C as CustomFieldDefinition, l as CustomFieldOption, m as CustomFieldType, L as LocationSalaryDetail, n as LocationSkillsIndex, o as LocationTitlesIndex, P as PublicBoard, p as PublicBoardAnalytics, q as PublicBoardFeatures, r as PublicCompany, s as PublicCompanyDetail, t as SalaryCompany, u as SalaryLocation, v as SalarySkill, w as SalaryTitle, x as SkillLocationSalary, y as SkillLocationsIndex, S as SkillSalaryDetail, z as TitleLocationSalary, A as TitleLocationsIndex, T as TitleSalaryDetail } from './board-BF3Qao6J.mjs';
6
+ import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-BX6d_sdd.mjs';
7
+ export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-BX6d_sdd.mjs';
8
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-DyDvyQrI.mjs';
9
+ export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-DyDvyQrI.mjs';
10
10
 
11
11
  /**
12
12
  * Well-known `<domain>_<snake_reason>` codes the Board API sends, grouped by
@@ -142,7 +142,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
142
142
  * constant because the package is platform-neutral and cannot read
143
143
  * package.json at runtime.
144
144
  */
145
- declare const SDK_VERSION = "4.0.0";
145
+ declare const SDK_VERSION = "4.1.0";
146
146
 
147
147
  type SavedJob = Schemas['SavedJob'];
148
148
  type SavedJobsListQuery = {
@@ -459,6 +459,14 @@ type EmbedJobsQuery = {
459
459
  */
460
460
  type BoardAccessGrant = Schemas['BoardAccessGrant'];
461
461
 
462
+ /**
463
+ * A board user's marketing-email consent, or `null` when no decision exists.
464
+ *
465
+ * Carries no disclosure text or wording version: the checkbox copy is authored
466
+ * by the board's own frontend, so the API records the decision, not the prose.
467
+ */
468
+ type MarketingConsent = Schemas['MarketingConsent'];
469
+
462
470
  /**
463
471
  * The result of resolving a path against the board's configured redirects
464
472
  * (`board.redirects.resolve()`). A headless frontend 308s to `target`, or
@@ -806,6 +814,8 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
806
814
  employmentType: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other" | null;
807
815
  remoteOption: "on_site" | "hybrid" | "remote" | null;
808
816
  remoteLocationLabel: string | null;
817
+ remoteWorldwide: boolean | null;
818
+ remoteWorkPermitCountryCodes: string[];
809
819
  salaryMin: number | null;
810
820
  salaryMax: number | null;
811
821
  salaryCurrency: string | null;
@@ -903,6 +913,8 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
903
913
  employmentType: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other" | null;
904
914
  remoteOption: "on_site" | "hybrid" | "remote" | null;
905
915
  remoteLocationLabel: string | null;
916
+ remoteWorldwide: boolean | null;
917
+ remoteWorkPermitCountryCodes: string[];
906
918
  salaryMin: number | null;
907
919
  salaryMax: number | null;
908
920
  salaryCurrency: string | null;
@@ -2227,6 +2239,38 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2227
2239
  blocked: boolean;
2228
2240
  }>;
2229
2241
  };
2242
+ marketingConsent: {
2243
+ retrieve(options?: FetchOptions): Promise<{
2244
+ id: string;
2245
+ object: "marketing_consent";
2246
+ status: "granted" | "withdrawn";
2247
+ source: string;
2248
+ reason: "person_request" | "operator_request" | "account_deleted" | null;
2249
+ grantedAt: string | null;
2250
+ withdrawnAt: string | null;
2251
+ revision: number;
2252
+ } | null>;
2253
+ grant(options?: FetchOptions): Promise<{
2254
+ id: string;
2255
+ object: "marketing_consent";
2256
+ status: "granted" | "withdrawn";
2257
+ source: string;
2258
+ reason: "person_request" | "operator_request" | "account_deleted" | null;
2259
+ grantedAt: string | null;
2260
+ withdrawnAt: string | null;
2261
+ revision: number;
2262
+ } | null>;
2263
+ withdraw(options?: FetchOptions): Promise<{
2264
+ id: string;
2265
+ object: "marketing_consent";
2266
+ status: "granted" | "withdrawn";
2267
+ source: string;
2268
+ reason: "person_request" | "operator_request" | "account_deleted" | null;
2269
+ grantedAt: string | null;
2270
+ withdrawnAt: string | null;
2271
+ revision: number;
2272
+ } | null>;
2273
+ };
2230
2274
  access: {
2231
2275
  checkout(body: AccessCheckoutBody, options?: FetchOptions): Promise<{
2232
2276
  object: "checkout_session";
@@ -2967,4 +3011,4 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2967
3011
  };
2968
3012
  type BoardSdk = ReturnType<typeof createBoardClient>;
2969
3013
 
2970
- export { type AccessCheckoutBody, type AccessCheckoutSession, type AccessCheckoutSessionState, type AccessGrant, type AccessPortalBody, type AccessPortalSession, type AddApplicantNoteBody, type Alert, type AlertBody, type Application, type ApplicationsListQuery, type ApplyAction, type ApplyBody, Awaitable, BOARD_API_ERROR_CODES, type Block, type BlockStatus, type BlockUserBody, type BlockedUser, BlogPostsListQuery, BlogSearchBody, BlogSimilarQuery, type BoardAccessGrant, BoardApiError, type BoardApiErrorCode, type BoardAuthSession, BoardClient, BoardRequest, type BoardSdk, type BoardSeo, type BoardUser, type BulkMoveApplicantsBody, type BulkRejectApplicantsBody, type CandidateAvatar, type CandidateEducation, type CandidateExperience, type CandidateLanguage, type CandidateProfile, type CandidateSkill, type ClaimableCompany, CompaniesListQuery, CompaniesSearchBody, CompanyJobsListQuery, CompanyListEnvelope, CompanyMarketsListQuery, type CompanyMembership, CompanySimilarQuery, type ConfirmWorkEmailBody, type ConsumeMagicLinkBody, type Conversation, type ConversationArchive, type ConversationDetail, type ConversationRef, type ConversationsListQuery, type CreateBoardClientOptions, type CreateCompanyBody, type CreateEducationBody, type CreateEmployerJobBody, type CreateExperienceBody, type CreateJobPostingInput, type CreatePipelineStageBody, type EditMessageBody, type EmbedJobsQuery, type EmployerApplicant, type EmployerBillingOption, type EmployerCheckout, type EmployerCheckoutBody, type EmployerCompany, type EmployerCompanySearchQuery, type EmployerJob, type EmployerJobStat, type EmployerJobStatsPoint, type EmployerJobStatsTimeseriesQuery, type EmployerJobSummary, type EmployerJobsListQuery, type EmployerPipeline, type EmployerPipelineQuery, type EmployerPipelineStage, type EmployerProfileStats, type EmployerProfileViewsPoint, type EmployerProfileViewsTimeseriesQuery, EmploymentType, FetchOptions, type FindExistingConversationQuery, type ForgotPasswordBody, type HandleAvailability, type JobAlertConfirmation, type JobAlertDeletePreferenceInput, type JobAlertFiltersInput, type JobAlertFrequency, type JobAlertManageQuery, type JobAlertManageResult, type JobAlertManageState, type JobAlertManageTokenInput, type JobAlertPreference, type JobAlertRemoteOption, type JobAlertResendResult, type JobAlertStoredFilters, type JobAlertSubscribeInput, type JobAlertSubscription, type JobAlertUpdatePreferenceInput, JobCardListEnvelope, JobCardSearchEnvelope, type JobPostingBillingOptions, type JobPostingBillingVerification, type JobPostingLogoResult, type JobPostingPlan, type JobPostingResult, JobsListQuery, JobsSearchBody, JobsSimilarQuery, ListEnvelope, Logger, type LoginBody, type LogoutBody, type Message, type ModerationReport, type MoveApplicantStageBody, type NotificationPreference, type OAuthAuthorizationQuery, type OAuthAuthorizationUrl, type OAuthExchangeBody, type OAuthProvider, type Paginator, type PaywallOffer, type PaywallOfferListEnvelope, type PlacesListQuery, type Plan, type PlanListEnvelope, type PlansListQuery, type PublicPlace, type PublicTaxonomyTerm, type ReadReceipt, type RedirectResolution, type RefreshBody, type RegisterBody, RemoteOption, type RemotePermitTaxonomyEntry, type ReorderPipelineStagesBody, type ReplyBody, type ReportBody, type RequestMagicLinkBody, type ResetPasswordBody, type Resume, type ResumeUploadOptions, SDK_VERSION, SalaryDetailQuery, type SalesLedPlan, type SalesLedPlanListEnvelope, type SaveJobBody, type SavedJob, type SavedJobsListQuery, SearchEnvelope, SearchSuggestQuery, type SendWorkEmailBody, Seniority, type StartAboutApplicationBody, type StartConversationBody, StorageMode, type TalentAccess, type TalentDirectoryEntry, type TalentDirectoryListEnvelope, type TalentDirectoryQuery, type TalentProfile, type TaxonomyGeo, type TaxonomyListQuery, type TaxonomyResolution, type ThreadMessagesQuery, type UnreadCount, type UnsubscribeBody, type UpdateApplicationFactsBody, type UpdateCandidateProfileBody, type UpdateEducationBody, type UpdateEmployerCompanyBody, type UpdateEmployerJobBody, type UpdateExperienceBody, type UpdateLanguagesBody, type UpdateNotificationPreferenceBody, type UpdatePipelineStageBody, type UpdateSkillsBody, type VerifyEmailBody, createBoardClient, isBoardApiError, isBoardPasswordRequired, isColdRule, isConflict, isForbidden, isNotFound, isOwnMessage, isRateLimited, isSafeApplicationUrl, isUnauthorized, isValidationError, lastOwnMessageId, paginate, resolveApplyAction };
3014
+ export { type AccessCheckoutBody, type AccessCheckoutSession, type AccessCheckoutSessionState, type AccessGrant, type AccessPortalBody, type AccessPortalSession, type AddApplicantNoteBody, type Alert, type AlertBody, type Application, type ApplicationsListQuery, type ApplyAction, type ApplyBody, Awaitable, BOARD_API_ERROR_CODES, type Block, type BlockStatus, type BlockUserBody, type BlockedUser, BlogPostsListQuery, BlogSearchBody, BlogSimilarQuery, type BoardAccessGrant, BoardApiError, type BoardApiErrorCode, type BoardAuthSession, BoardClient, BoardRequest, type BoardSdk, type BoardSeo, type BoardUser, type BulkMoveApplicantsBody, type BulkRejectApplicantsBody, type CandidateAvatar, type CandidateEducation, type CandidateExperience, type CandidateLanguage, type CandidateProfile, type CandidateSkill, type ClaimableCompany, CompaniesListQuery, CompaniesSearchBody, CompanyJobsListQuery, CompanyListEnvelope, CompanyMarketsListQuery, type CompanyMembership, CompanySimilarQuery, type ConfirmWorkEmailBody, type ConsumeMagicLinkBody, type Conversation, type ConversationArchive, type ConversationDetail, type ConversationRef, type ConversationsListQuery, type CreateBoardClientOptions, type CreateCompanyBody, type CreateEducationBody, type CreateEmployerJobBody, type CreateExperienceBody, type CreateJobPostingInput, type CreatePipelineStageBody, type EditMessageBody, type EmbedJobsQuery, type EmployerApplicant, type EmployerBillingOption, type EmployerCheckout, type EmployerCheckoutBody, type EmployerCompany, type EmployerCompanySearchQuery, type EmployerJob, type EmployerJobStat, type EmployerJobStatsPoint, type EmployerJobStatsTimeseriesQuery, type EmployerJobSummary, type EmployerJobsListQuery, type EmployerPipeline, type EmployerPipelineQuery, type EmployerPipelineStage, type EmployerProfileStats, type EmployerProfileViewsPoint, type EmployerProfileViewsTimeseriesQuery, EmploymentType, FetchOptions, type FindExistingConversationQuery, type ForgotPasswordBody, type HandleAvailability, type JobAlertConfirmation, type JobAlertDeletePreferenceInput, type JobAlertFiltersInput, type JobAlertFrequency, type JobAlertManageQuery, type JobAlertManageResult, type JobAlertManageState, type JobAlertManageTokenInput, type JobAlertPreference, type JobAlertRemoteOption, type JobAlertResendResult, type JobAlertStoredFilters, type JobAlertSubscribeInput, type JobAlertSubscription, type JobAlertUpdatePreferenceInput, JobCardListEnvelope, JobCardSearchEnvelope, type JobPostingBillingOptions, type JobPostingBillingVerification, type JobPostingLogoResult, type JobPostingPlan, type JobPostingResult, JobsListQuery, JobsSearchBody, JobsSimilarQuery, ListEnvelope, Logger, type LoginBody, type LogoutBody, type MarketingConsent, type Message, type ModerationReport, type MoveApplicantStageBody, type NotificationPreference, type OAuthAuthorizationQuery, type OAuthAuthorizationUrl, type OAuthExchangeBody, type OAuthProvider, type Paginator, type PaywallOffer, type PaywallOfferListEnvelope, type PlacesListQuery, type Plan, type PlanListEnvelope, type PlansListQuery, type PublicPlace, type PublicTaxonomyTerm, type ReadReceipt, type RedirectResolution, type RefreshBody, type RegisterBody, RemoteOption, type RemotePermitTaxonomyEntry, type ReorderPipelineStagesBody, type ReplyBody, type ReportBody, type RequestMagicLinkBody, type ResetPasswordBody, type Resume, type ResumeUploadOptions, SDK_VERSION, SalaryDetailQuery, type SalesLedPlan, type SalesLedPlanListEnvelope, type SaveJobBody, type SavedJob, type SavedJobsListQuery, SearchEnvelope, SearchSuggestQuery, type SendWorkEmailBody, Seniority, type StartAboutApplicationBody, type StartConversationBody, StorageMode, type TalentAccess, type TalentDirectoryEntry, type TalentDirectoryListEnvelope, type TalentDirectoryQuery, type TalentProfile, type TaxonomyGeo, type TaxonomyListQuery, type TaxonomyResolution, type ThreadMessagesQuery, type UnreadCount, type UnsubscribeBody, type UpdateApplicationFactsBody, type UpdateCandidateProfileBody, type UpdateEducationBody, type UpdateEmployerCompanyBody, type UpdateEmployerJobBody, type UpdateExperienceBody, type UpdateLanguagesBody, type UpdateNotificationPreferenceBody, type UpdatePipelineStageBody, type UpdateSkillsBody, type VerifyEmailBody, createBoardClient, isBoardApiError, isBoardPasswordRequired, isColdRule, isConflict, isForbidden, isNotFound, isOwnMessage, isRateLimited, isSafeApplicationUrl, isUnauthorized, isValidationError, lastOwnMessageId, paginate, resolveApplyAction };
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- import { S as Schemas, c as components } from './_spec-GVe6WAfT.js';
2
- import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-DdsniXQv.js';
3
- export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-DdsniXQv.js';
4
- import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-DUhgiacm.js';
5
- export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, C as CustomFieldDefinition, l as CustomFieldOption, m as CustomFieldType, L as LocationSalaryDetail, n as LocationSkillsIndex, o as LocationTitlesIndex, P as PublicBoard, p as PublicBoardAnalytics, q as PublicBoardFeatures, r as PublicCompany, s as PublicCompanyDetail, t as SalaryCompany, u as SalaryLocation, v as SalarySkill, w as SalaryTitle, x as SkillLocationSalary, y as SkillLocationsIndex, S as SkillSalaryDetail, z as TitleLocationSalary, A as TitleLocationsIndex, T as TitleSalaryDetail } from './board-DUhgiacm.js';
6
- import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-QrbXOYB9.js';
7
- export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-QrbXOYB9.js';
8
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-BsmKizpd.js';
9
- export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-BsmKizpd.js';
1
+ import { S as Schemas, c as components } from './_spec-BZDv2dc5.js';
2
+ import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-7B-mVRNA.js';
3
+ export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-7B-mVRNA.js';
4
+ import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-BTEZ0uiI.js';
5
+ export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, C as CustomFieldDefinition, l as CustomFieldOption, m as CustomFieldType, L as LocationSalaryDetail, n as LocationSkillsIndex, o as LocationTitlesIndex, P as PublicBoard, p as PublicBoardAnalytics, q as PublicBoardFeatures, r as PublicCompany, s as PublicCompanyDetail, t as SalaryCompany, u as SalaryLocation, v as SalarySkill, w as SalaryTitle, x as SkillLocationSalary, y as SkillLocationsIndex, S as SkillSalaryDetail, z as TitleLocationSalary, A as TitleLocationsIndex, T as TitleSalaryDetail } from './board-BTEZ0uiI.js';
6
+ import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-BbLJfz1z.js';
7
+ export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-BbLJfz1z.js';
8
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-BHx6iH3Z.js';
9
+ export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-BHx6iH3Z.js';
10
10
 
11
11
  /**
12
12
  * Well-known `<domain>_<snake_reason>` codes the Board API sends, grouped by
@@ -142,7 +142,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
142
142
  * constant because the package is platform-neutral and cannot read
143
143
  * package.json at runtime.
144
144
  */
145
- declare const SDK_VERSION = "4.0.0";
145
+ declare const SDK_VERSION = "4.1.0";
146
146
 
147
147
  type SavedJob = Schemas['SavedJob'];
148
148
  type SavedJobsListQuery = {
@@ -459,6 +459,14 @@ type EmbedJobsQuery = {
459
459
  */
460
460
  type BoardAccessGrant = Schemas['BoardAccessGrant'];
461
461
 
462
+ /**
463
+ * A board user's marketing-email consent, or `null` when no decision exists.
464
+ *
465
+ * Carries no disclosure text or wording version: the checkbox copy is authored
466
+ * by the board's own frontend, so the API records the decision, not the prose.
467
+ */
468
+ type MarketingConsent = Schemas['MarketingConsent'];
469
+
462
470
  /**
463
471
  * The result of resolving a path against the board's configured redirects
464
472
  * (`board.redirects.resolve()`). A headless frontend 308s to `target`, or
@@ -806,6 +814,8 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
806
814
  employmentType: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other" | null;
807
815
  remoteOption: "on_site" | "hybrid" | "remote" | null;
808
816
  remoteLocationLabel: string | null;
817
+ remoteWorldwide: boolean | null;
818
+ remoteWorkPermitCountryCodes: string[];
809
819
  salaryMin: number | null;
810
820
  salaryMax: number | null;
811
821
  salaryCurrency: string | null;
@@ -903,6 +913,8 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
903
913
  employmentType: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other" | null;
904
914
  remoteOption: "on_site" | "hybrid" | "remote" | null;
905
915
  remoteLocationLabel: string | null;
916
+ remoteWorldwide: boolean | null;
917
+ remoteWorkPermitCountryCodes: string[];
906
918
  salaryMin: number | null;
907
919
  salaryMax: number | null;
908
920
  salaryCurrency: string | null;
@@ -2227,6 +2239,38 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2227
2239
  blocked: boolean;
2228
2240
  }>;
2229
2241
  };
2242
+ marketingConsent: {
2243
+ retrieve(options?: FetchOptions): Promise<{
2244
+ id: string;
2245
+ object: "marketing_consent";
2246
+ status: "granted" | "withdrawn";
2247
+ source: string;
2248
+ reason: "person_request" | "operator_request" | "account_deleted" | null;
2249
+ grantedAt: string | null;
2250
+ withdrawnAt: string | null;
2251
+ revision: number;
2252
+ } | null>;
2253
+ grant(options?: FetchOptions): Promise<{
2254
+ id: string;
2255
+ object: "marketing_consent";
2256
+ status: "granted" | "withdrawn";
2257
+ source: string;
2258
+ reason: "person_request" | "operator_request" | "account_deleted" | null;
2259
+ grantedAt: string | null;
2260
+ withdrawnAt: string | null;
2261
+ revision: number;
2262
+ } | null>;
2263
+ withdraw(options?: FetchOptions): Promise<{
2264
+ id: string;
2265
+ object: "marketing_consent";
2266
+ status: "granted" | "withdrawn";
2267
+ source: string;
2268
+ reason: "person_request" | "operator_request" | "account_deleted" | null;
2269
+ grantedAt: string | null;
2270
+ withdrawnAt: string | null;
2271
+ revision: number;
2272
+ } | null>;
2273
+ };
2230
2274
  access: {
2231
2275
  checkout(body: AccessCheckoutBody, options?: FetchOptions): Promise<{
2232
2276
  object: "checkout_session";
@@ -2967,4 +3011,4 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
2967
3011
  };
2968
3012
  type BoardSdk = ReturnType<typeof createBoardClient>;
2969
3013
 
2970
- export { type AccessCheckoutBody, type AccessCheckoutSession, type AccessCheckoutSessionState, type AccessGrant, type AccessPortalBody, type AccessPortalSession, type AddApplicantNoteBody, type Alert, type AlertBody, type Application, type ApplicationsListQuery, type ApplyAction, type ApplyBody, Awaitable, BOARD_API_ERROR_CODES, type Block, type BlockStatus, type BlockUserBody, type BlockedUser, BlogPostsListQuery, BlogSearchBody, BlogSimilarQuery, type BoardAccessGrant, BoardApiError, type BoardApiErrorCode, type BoardAuthSession, BoardClient, BoardRequest, type BoardSdk, type BoardSeo, type BoardUser, type BulkMoveApplicantsBody, type BulkRejectApplicantsBody, type CandidateAvatar, type CandidateEducation, type CandidateExperience, type CandidateLanguage, type CandidateProfile, type CandidateSkill, type ClaimableCompany, CompaniesListQuery, CompaniesSearchBody, CompanyJobsListQuery, CompanyListEnvelope, CompanyMarketsListQuery, type CompanyMembership, CompanySimilarQuery, type ConfirmWorkEmailBody, type ConsumeMagicLinkBody, type Conversation, type ConversationArchive, type ConversationDetail, type ConversationRef, type ConversationsListQuery, type CreateBoardClientOptions, type CreateCompanyBody, type CreateEducationBody, type CreateEmployerJobBody, type CreateExperienceBody, type CreateJobPostingInput, type CreatePipelineStageBody, type EditMessageBody, type EmbedJobsQuery, type EmployerApplicant, type EmployerBillingOption, type EmployerCheckout, type EmployerCheckoutBody, type EmployerCompany, type EmployerCompanySearchQuery, type EmployerJob, type EmployerJobStat, type EmployerJobStatsPoint, type EmployerJobStatsTimeseriesQuery, type EmployerJobSummary, type EmployerJobsListQuery, type EmployerPipeline, type EmployerPipelineQuery, type EmployerPipelineStage, type EmployerProfileStats, type EmployerProfileViewsPoint, type EmployerProfileViewsTimeseriesQuery, EmploymentType, FetchOptions, type FindExistingConversationQuery, type ForgotPasswordBody, type HandleAvailability, type JobAlertConfirmation, type JobAlertDeletePreferenceInput, type JobAlertFiltersInput, type JobAlertFrequency, type JobAlertManageQuery, type JobAlertManageResult, type JobAlertManageState, type JobAlertManageTokenInput, type JobAlertPreference, type JobAlertRemoteOption, type JobAlertResendResult, type JobAlertStoredFilters, type JobAlertSubscribeInput, type JobAlertSubscription, type JobAlertUpdatePreferenceInput, JobCardListEnvelope, JobCardSearchEnvelope, type JobPostingBillingOptions, type JobPostingBillingVerification, type JobPostingLogoResult, type JobPostingPlan, type JobPostingResult, JobsListQuery, JobsSearchBody, JobsSimilarQuery, ListEnvelope, Logger, type LoginBody, type LogoutBody, type Message, type ModerationReport, type MoveApplicantStageBody, type NotificationPreference, type OAuthAuthorizationQuery, type OAuthAuthorizationUrl, type OAuthExchangeBody, type OAuthProvider, type Paginator, type PaywallOffer, type PaywallOfferListEnvelope, type PlacesListQuery, type Plan, type PlanListEnvelope, type PlansListQuery, type PublicPlace, type PublicTaxonomyTerm, type ReadReceipt, type RedirectResolution, type RefreshBody, type RegisterBody, RemoteOption, type RemotePermitTaxonomyEntry, type ReorderPipelineStagesBody, type ReplyBody, type ReportBody, type RequestMagicLinkBody, type ResetPasswordBody, type Resume, type ResumeUploadOptions, SDK_VERSION, SalaryDetailQuery, type SalesLedPlan, type SalesLedPlanListEnvelope, type SaveJobBody, type SavedJob, type SavedJobsListQuery, SearchEnvelope, SearchSuggestQuery, type SendWorkEmailBody, Seniority, type StartAboutApplicationBody, type StartConversationBody, StorageMode, type TalentAccess, type TalentDirectoryEntry, type TalentDirectoryListEnvelope, type TalentDirectoryQuery, type TalentProfile, type TaxonomyGeo, type TaxonomyListQuery, type TaxonomyResolution, type ThreadMessagesQuery, type UnreadCount, type UnsubscribeBody, type UpdateApplicationFactsBody, type UpdateCandidateProfileBody, type UpdateEducationBody, type UpdateEmployerCompanyBody, type UpdateEmployerJobBody, type UpdateExperienceBody, type UpdateLanguagesBody, type UpdateNotificationPreferenceBody, type UpdatePipelineStageBody, type UpdateSkillsBody, type VerifyEmailBody, createBoardClient, isBoardApiError, isBoardPasswordRequired, isColdRule, isConflict, isForbidden, isNotFound, isOwnMessage, isRateLimited, isSafeApplicationUrl, isUnauthorized, isValidationError, lastOwnMessageId, paginate, resolveApplyAction };
3014
+ export { type AccessCheckoutBody, type AccessCheckoutSession, type AccessCheckoutSessionState, type AccessGrant, type AccessPortalBody, type AccessPortalSession, type AddApplicantNoteBody, type Alert, type AlertBody, type Application, type ApplicationsListQuery, type ApplyAction, type ApplyBody, Awaitable, BOARD_API_ERROR_CODES, type Block, type BlockStatus, type BlockUserBody, type BlockedUser, BlogPostsListQuery, BlogSearchBody, BlogSimilarQuery, type BoardAccessGrant, BoardApiError, type BoardApiErrorCode, type BoardAuthSession, BoardClient, BoardRequest, type BoardSdk, type BoardSeo, type BoardUser, type BulkMoveApplicantsBody, type BulkRejectApplicantsBody, type CandidateAvatar, type CandidateEducation, type CandidateExperience, type CandidateLanguage, type CandidateProfile, type CandidateSkill, type ClaimableCompany, CompaniesListQuery, CompaniesSearchBody, CompanyJobsListQuery, CompanyListEnvelope, CompanyMarketsListQuery, type CompanyMembership, CompanySimilarQuery, type ConfirmWorkEmailBody, type ConsumeMagicLinkBody, type Conversation, type ConversationArchive, type ConversationDetail, type ConversationRef, type ConversationsListQuery, type CreateBoardClientOptions, type CreateCompanyBody, type CreateEducationBody, type CreateEmployerJobBody, type CreateExperienceBody, type CreateJobPostingInput, type CreatePipelineStageBody, type EditMessageBody, type EmbedJobsQuery, type EmployerApplicant, type EmployerBillingOption, type EmployerCheckout, type EmployerCheckoutBody, type EmployerCompany, type EmployerCompanySearchQuery, type EmployerJob, type EmployerJobStat, type EmployerJobStatsPoint, type EmployerJobStatsTimeseriesQuery, type EmployerJobSummary, type EmployerJobsListQuery, type EmployerPipeline, type EmployerPipelineQuery, type EmployerPipelineStage, type EmployerProfileStats, type EmployerProfileViewsPoint, type EmployerProfileViewsTimeseriesQuery, EmploymentType, FetchOptions, type FindExistingConversationQuery, type ForgotPasswordBody, type HandleAvailability, type JobAlertConfirmation, type JobAlertDeletePreferenceInput, type JobAlertFiltersInput, type JobAlertFrequency, type JobAlertManageQuery, type JobAlertManageResult, type JobAlertManageState, type JobAlertManageTokenInput, type JobAlertPreference, type JobAlertRemoteOption, type JobAlertResendResult, type JobAlertStoredFilters, type JobAlertSubscribeInput, type JobAlertSubscription, type JobAlertUpdatePreferenceInput, JobCardListEnvelope, JobCardSearchEnvelope, type JobPostingBillingOptions, type JobPostingBillingVerification, type JobPostingLogoResult, type JobPostingPlan, type JobPostingResult, JobsListQuery, JobsSearchBody, JobsSimilarQuery, ListEnvelope, Logger, type LoginBody, type LogoutBody, type MarketingConsent, type Message, type ModerationReport, type MoveApplicantStageBody, type NotificationPreference, type OAuthAuthorizationQuery, type OAuthAuthorizationUrl, type OAuthExchangeBody, type OAuthProvider, type Paginator, type PaywallOffer, type PaywallOfferListEnvelope, type PlacesListQuery, type Plan, type PlanListEnvelope, type PlansListQuery, type PublicPlace, type PublicTaxonomyTerm, type ReadReceipt, type RedirectResolution, type RefreshBody, type RegisterBody, RemoteOption, type RemotePermitTaxonomyEntry, type ReorderPipelineStagesBody, type ReplyBody, type ReportBody, type RequestMagicLinkBody, type ResetPasswordBody, type Resume, type ResumeUploadOptions, SDK_VERSION, SalaryDetailQuery, type SalesLedPlan, type SalesLedPlanListEnvelope, type SaveJobBody, type SavedJob, type SavedJobsListQuery, SearchEnvelope, SearchSuggestQuery, type SendWorkEmailBody, Seniority, type StartAboutApplicationBody, type StartConversationBody, StorageMode, type TalentAccess, type TalentDirectoryEntry, type TalentDirectoryListEnvelope, type TalentDirectoryQuery, type TalentProfile, type TaxonomyGeo, type TaxonomyListQuery, type TaxonomyResolution, type ThreadMessagesQuery, type UnreadCount, type UnsubscribeBody, type UpdateApplicationFactsBody, type UpdateCandidateProfileBody, type UpdateEducationBody, type UpdateEmployerCompanyBody, type UpdateEmployerJobBody, type UpdateExperienceBody, type UpdateLanguagesBody, type UpdateNotificationPreferenceBody, type UpdatePipelineStageBody, type UpdateSkillsBody, type VerifyEmailBody, createBoardClient, isBoardApiError, isBoardPasswordRequired, isColdRule, isConflict, isForbidden, isNotFound, isOwnMessage, isRateLimited, isSafeApplicationUrl, isUnauthorized, isValidationError, lastOwnMessageId, paginate, resolveApplyAction };
package/dist/index.js CHANGED
@@ -312,7 +312,7 @@ async function clearSession(storage) {
312
312
  }
313
313
 
314
314
  // src/version.ts
315
- var SDK_VERSION = "4.0.0";
315
+ var SDK_VERSION = "4.1.0";
316
316
 
317
317
  // src/client.ts
318
318
  function isRawBody(body) {
@@ -2325,6 +2325,40 @@ function meNamespace(client) {
2325
2325
  );
2326
2326
  }
2327
2327
  },
2328
+ /**
2329
+ * My marketing-email consent.
2330
+ *
2331
+ * Consent is a property of the board user, given at sign-up or from the
2332
+ * board's own settings page. Both surfaces render board-authored
2333
+ * disclosure wording — the API records the decision, never the prose, so
2334
+ * whatever you show beside these calls is what the person agreed to.
2335
+ */
2336
+ marketingConsent: {
2337
+ /** My consent, or `null` when no decision has ever been recorded. */
2338
+ retrieve(options) {
2339
+ return client.fetch(
2340
+ "/me/marketing-consent",
2341
+ options
2342
+ );
2343
+ },
2344
+ /**
2345
+ * Grant. Call this only from a surface that displayed your disclosure
2346
+ * copy — nothing server-side can check that you did.
2347
+ */
2348
+ grant(options) {
2349
+ return client.fetch("/me/marketing-consent/grant", {
2350
+ ...options,
2351
+ method: "POST"
2352
+ });
2353
+ },
2354
+ /** Withdraw. Repeating it returns the same state, no new event. */
2355
+ withdraw(options) {
2356
+ return client.fetch(
2357
+ "/me/marketing-consent/withdraw",
2358
+ { ...options, method: "POST" }
2359
+ );
2360
+ }
2361
+ },
2328
2362
  /**
2329
2363
  * The candidate job-access paywall — the authenticated money flow . Enumerate offers publicly with `board.paywall.offers()`, then
2330
2364
  * `checkout` here; poll `retrieveCheckout` until complete and confirm with
package/dist/index.mjs CHANGED
@@ -39,7 +39,7 @@ function toSearchParams(query) {
39
39
  }
40
40
 
41
41
  // src/version.ts
42
- var SDK_VERSION = "4.0.0";
42
+ var SDK_VERSION = "4.1.0";
43
43
 
44
44
  // src/client.ts
45
45
  function isRawBody(body) {
@@ -2052,6 +2052,40 @@ function meNamespace(client) {
2052
2052
  );
2053
2053
  }
2054
2054
  },
2055
+ /**
2056
+ * My marketing-email consent.
2057
+ *
2058
+ * Consent is a property of the board user, given at sign-up or from the
2059
+ * board's own settings page. Both surfaces render board-authored
2060
+ * disclosure wording — the API records the decision, never the prose, so
2061
+ * whatever you show beside these calls is what the person agreed to.
2062
+ */
2063
+ marketingConsent: {
2064
+ /** My consent, or `null` when no decision has ever been recorded. */
2065
+ retrieve(options) {
2066
+ return client.fetch(
2067
+ "/me/marketing-consent",
2068
+ options
2069
+ );
2070
+ },
2071
+ /**
2072
+ * Grant. Call this only from a surface that displayed your disclosure
2073
+ * copy — nothing server-side can check that you did.
2074
+ */
2075
+ grant(options) {
2076
+ return client.fetch("/me/marketing-consent/grant", {
2077
+ ...options,
2078
+ method: "POST"
2079
+ });
2080
+ },
2081
+ /** Withdraw. Repeating it returns the same state, no new event. */
2082
+ withdraw(options) {
2083
+ return client.fetch(
2084
+ "/me/marketing-consent/withdraw",
2085
+ { ...options, method: "POST" }
2086
+ );
2087
+ }
2088
+ },
2055
2089
  /**
2056
2090
  * The candidate job-access paywall — the authenticated money flow . Enumerate offers publicly with `board.paywall.offers()`, then
2057
2091
  * `checkout` here; poll `retrieveCheckout` until complete and confirm with
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-GVe6WAfT.mjs';
1
+ import { S as Schemas } from './_spec-BZDv2dc5.mjs';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-GVe6WAfT.js';
1
+ import { S as Schemas } from './_spec-BZDv2dc5.js';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-GVe6WAfT.js';
1
+ import { S as Schemas } from './_spec-BZDv2dc5.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-GVe6WAfT.mjs';
1
+ import { S as Schemas } from './_spec-BZDv2dc5.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
package/dist/seo.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-Cf64mI8A.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-DFKr0HzU.mjs';
3
- export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-DFKr0HzU.mjs';
4
- import './_spec-GVe6WAfT.mjs';
5
- import './board-GGWJ4coe.mjs';
6
- import './jobs-BuLpV8iy.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-DyDvyQrI.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-icxRVydh.mjs';
3
+ export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-icxRVydh.mjs';
4
+ import './_spec-BZDv2dc5.mjs';
5
+ import './board-BF3Qao6J.mjs';
6
+ import './jobs-BX6d_sdd.mjs';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/seo.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BsmKizpd.js';
2
- import { e as JsonLdObject } from './breadcrumbs-DiccJhk4.js';
3
- export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-DiccJhk4.js';
4
- import './_spec-GVe6WAfT.js';
5
- import './board-DUhgiacm.js';
6
- import './jobs-QrbXOYB9.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BHx6iH3Z.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-SGaWth6C.js';
3
+ export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-SGaWth6C.js';
4
+ import './_spec-BZDv2dc5.js';
5
+ import './board-BTEZ0uiI.js';
6
+ import './jobs-BbLJfz1z.js';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/server.d.mts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-GVe6WAfT.mjs';
3
- import './search-Cr4noJJZ.mjs';
4
- import './board-GGWJ4coe.mjs';
5
- import './jobs-BuLpV8iy.mjs';
6
- import './blog-Cf64mI8A.mjs';
2
+ import './_spec-BZDv2dc5.mjs';
3
+ import './search-OKrdAHv8.mjs';
4
+ import './board-BF3Qao6J.mjs';
5
+ import './jobs-BX6d_sdd.mjs';
6
+ import './blog-DyDvyQrI.mjs';
7
7
 
8
8
  /**
9
9
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-GVe6WAfT.js';
3
- import './search-DdsniXQv.js';
4
- import './board-DUhgiacm.js';
5
- import './jobs-QrbXOYB9.js';
6
- import './blog-BsmKizpd.js';
2
+ import './_spec-BZDv2dc5.js';
3
+ import './search-7B-mVRNA.js';
4
+ import './board-BTEZ0uiI.js';
5
+ import './jobs-BbLJfz1z.js';
6
+ import './blog-BHx6iH3Z.js';
7
7
 
8
8
  /**
9
9
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-GVe6WAfT.mjs';
3
- import './search-Cr4noJJZ.mjs';
4
- import './board-GGWJ4coe.mjs';
5
- import './jobs-BuLpV8iy.mjs';
6
- import './blog-Cf64mI8A.mjs';
2
+ import './_spec-BZDv2dc5.mjs';
3
+ import './search-OKrdAHv8.mjs';
4
+ import './board-BF3Qao6J.mjs';
5
+ import './jobs-BX6d_sdd.mjs';
6
+ import './blog-DyDvyQrI.mjs';
7
7
 
8
8
  /**
9
9
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-GVe6WAfT.js';
3
- import './search-DdsniXQv.js';
4
- import './board-DUhgiacm.js';
5
- import './jobs-QrbXOYB9.js';
6
- import './blog-BsmKizpd.js';
2
+ import './_spec-BZDv2dc5.js';
3
+ import './search-7B-mVRNA.js';
4
+ import './board-BTEZ0uiI.js';
5
+ import './jobs-BbLJfz1z.js';
6
+ import './blog-BHx6iH3Z.js';
7
7
 
8
8
  /**
9
9
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-Cr4noJJZ.mjs';
2
- import './_spec-GVe6WAfT.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-OKrdAHv8.mjs';
2
+ import './_spec-BZDv2dc5.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
package/dist/suggest.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-DdsniXQv.js';
2
- import './_spec-GVe6WAfT.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-7B-mVRNA.js';
2
+ import './_spec-BZDv2dc5.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavuno/board",
3
- "version": "4.0.0",
3
+ "version": "4.1.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -60,6 +60,48 @@ A module-scoped client is safe for concurrent SSR requests when it uses the serv
60
60
 
61
61
  **Complete when:** a shared server client contains no per-user state and each authenticated request supplies its own headers.
62
62
 
63
+ ## Record marketing consent for the signed-in person
64
+
65
+ Marketing consent is a property of the board user, never a guest capture. The
66
+ frontend owns the checkbox wording and the privacy-policy link — render your
67
+ own copy beside the control; the API records the decision, not the prose.
68
+ Leave any checkbox unticked by default and call nothing while it stays
69
+ unticked: absence of a record means no consent, never a default.
70
+
71
+ At sign-up, pass the tick through the register body so consent is recorded in
72
+ the same transaction that creates the user:
73
+
74
+ ```ts snippet
75
+ await board.auth.register({
76
+ role: 'candidate',
77
+ method: 'emailpass',
78
+ email: form.email,
79
+ password: form.password,
80
+ displayName: form.displayName,
81
+ marketingConsent: form.marketingChecked,
82
+ });
83
+ ```
84
+
85
+ Later, read or change only the signed-in person's own consent through the
86
+ authenticated `me` namespace. There is intentionally no email parameter, so a
87
+ frontend cannot target another person. Withdrawal is always an explicit POST —
88
+ never a state-changing GET, which mail scanners would follow.
89
+
90
+ ```ts snippet
91
+ const current = await board.me.marketingConsent.retrieve();
92
+ if (current?.status !== 'granted') {
93
+ await board.me.marketingConsent.grant();
94
+ }
95
+ await board.me.marketingConsent.withdraw();
96
+ ```
97
+
98
+ Call `grant()` only from a surface that displayed your disclosure wording.
99
+ Both calls are idempotent: repeating one changes nothing and emits no event.
100
+
101
+ **Complete when:** the checkbox defaults to unticked, unticked submits
102
+ nothing, grant is only reachable beside rendered disclosure copy, and
103
+ withdrawal is never implemented as a state-changing GET.
104
+
63
105
  ## Use the escape hatch for an untyped endpoint
64
106
 
65
107
  `board.client.fetch<T>(path, options)` keeps the full request pipeline while providing a response type locally.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.0.0",
2
+ "version": "4.1.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",