@cavuno/board 1.34.0 → 1.35.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.
@@ -84,7 +84,7 @@ interface components {
84
84
  object: "alert";
85
85
  label: string | null;
86
86
  /** @enum {string} */
87
- frequency: "daily" | "weekly";
87
+ frequency: "weekly";
88
88
  isActive: boolean;
89
89
  filters: {
90
90
  jobFunctions: string[];
@@ -104,7 +104,7 @@ interface components {
104
104
  AlertBody: {
105
105
  label?: string;
106
106
  /** @enum {string} */
107
- frequency: "daily" | "weekly";
107
+ frequency: "weekly";
108
108
  jobFunctions?: string[];
109
109
  seniorityLevels?: string[];
110
110
  remoteOptions?: string[];
@@ -1019,6 +1019,10 @@ interface components {
1019
1019
  * @enum {string}
1020
1020
  */
1021
1021
  salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour";
1022
+ /** @description Up to 100 canonical skill slugs from `GET /v1/taxonomies/skills`. Every slug must exist in this account. */
1023
+ skills?: string[];
1024
+ /** @description Up to 100 canonical category slugs from `GET /v1/taxonomies/categories`. Every slug must exist in this account. */
1025
+ categories?: string[];
1022
1026
  /** @description Whether the job appears in featured slots on the public board. */
1023
1027
  isFeatured?: boolean;
1024
1028
  /** @description Job expiry as a Unix epoch in milliseconds. On create, omitted or `null` defaults to 30 days from creation. On PATCH, pass `null` to clear an existing expiry. Past timestamps remove the job from the public board. */
@@ -1441,6 +1445,10 @@ interface components {
1441
1445
  * @enum {string}
1442
1446
  */
1443
1447
  salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour";
1448
+ /** @description Up to 100 canonical skill slugs from `GET /v1/taxonomies/skills`. Every slug must exist in this account. */
1449
+ skills?: string[];
1450
+ /** @description Up to 100 canonical category slugs from `GET /v1/taxonomies/categories`. Every slug must exist in this account. */
1451
+ categories?: string[];
1444
1452
  /** @description Required education credentials. Each value is one of `high_school`, `associate_degree`, `bachelor_degree`, `professional_certificate`, `postgraduate_degree`, or `no_requirements`. */
1445
1453
  educationRequirements?: ("high_school" | "associate_degree" | "bachelor_degree" | "professional_certificate" | "postgraduate_degree" | "no_requirements")[];
1446
1454
  /** @description Minimum required experience, expressed in months. */
@@ -1646,6 +1654,10 @@ interface components {
1646
1654
  * @enum {string}
1647
1655
  */
1648
1656
  salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour";
1657
+ /** @description Up to 100 canonical skill slugs from `GET /v1/taxonomies/skills`. Every slug must exist in this account. */
1658
+ skills?: string[];
1659
+ /** @description Up to 100 canonical category slugs from `GET /v1/taxonomies/categories`. Every slug must exist in this account. */
1660
+ categories?: string[];
1649
1661
  /** @description Required education credentials. Each value is one of `high_school`, `associate_degree`, `bachelor_degree`, `professional_certificate`, `postgraduate_degree`, or `no_requirements`. */
1650
1662
  educationRequirements?: ("high_school" | "associate_degree" | "bachelor_degree" | "professional_certificate" | "postgraduate_degree" | "no_requirements")[];
1651
1663
  /** @description Minimum required experience, expressed in months. */
@@ -1996,6 +2008,10 @@ interface components {
1996
2008
  createdAt: string;
1997
2009
  /** @description Time at which the job was last updated. ISO 8601 datetime. */
1998
2010
  updatedAt: string;
2011
+ /** @description Canonical skill slugs assigned to the job. */
2012
+ skills: string[];
2013
+ /** @description Canonical category slugs assigned to the job. */
2014
+ categories: string[];
1999
2015
  /** @description External identifier supplied by the caller on create, used for deduplication via `GET /v1/jobs?externalId=...`. `null` when no external identifier was set. */
2000
2016
  externalId: string | null;
2001
2017
  /** @description Board-defined custom-field values for this job, keyed by the field `key` (the definitions are published at `GET /v1/settings/job-form`). Each value is returned as stored: a string (`short_text` / `long_text` / a `single_select` option key), a string array (`multi_select` option keys), a boolean, or a number. Always an object — `{}` when the job has no custom-field values, never `null` or a missing field. Only real values are stored, so this never contains `null` or empty values. */
@@ -2214,6 +2230,16 @@ interface components {
2214
2230
  subscribed: boolean;
2215
2231
  updatedAt: number | null;
2216
2232
  };
2233
+ OffsetPagination: {
2234
+ /** @description Total number of results matching the query. */
2235
+ count?: number;
2236
+ /** @description The page size used for this response. */
2237
+ limit?: number;
2238
+ /** @description The number of results skipped before this page. */
2239
+ offset?: number;
2240
+ /** @description Jobs hidden behind the candidate paywall for the current viewer; absent or 0 for an entitled viewer. */
2241
+ gatedCount?: number;
2242
+ };
2217
2243
  /** @description Error envelope, populated once the operation reaches `failed`. `null` otherwise. */
2218
2244
  OperationErrorEnvelope: {
2219
2245
  /** @description Machine-readable error code. */
@@ -2699,7 +2725,8 @@ interface components {
2699
2725
  preferences: {
2700
2726
  id: string;
2701
2727
  label: string | null;
2702
- frequency: string;
2728
+ /** @enum {string} */
2729
+ frequency: "weekly";
2703
2730
  isActive: boolean;
2704
2731
  filters: {
2705
2732
  jobFunctions?: string[];
@@ -2847,7 +2874,7 @@ interface components {
2847
2874
  */
2848
2875
  limit?: number;
2849
2876
  /**
2850
- * @description The number of jobs to skip — the storefront page offset. Takes precedence over `cursor`. `offset + limit` may not exceed 10,000.
2877
+ * @description The number of jobs to skip — the job catalog page offset. Takes precedence over `cursor`. `offset + limit` may not exceed 10,000.
2851
2878
  * @example 0
2852
2879
  */
2853
2880
  offset?: number;
@@ -3073,6 +3100,10 @@ interface components {
3073
3100
  employmentType?: ("full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other")[];
3074
3101
  /** @description Only return jobs at any of the given seniority levels. Up to 10 values. */
3075
3102
  seniority?: ("entry_level" | "associate" | "mid_level" | "senior" | "lead" | "principal" | "director" | "executive")[];
3103
+ /** @description Only return jobs tagged with any of these canonical skill slugs. Up to 10 values. */
3104
+ skills?: string[];
3105
+ /** @description Only return jobs tagged with any of these canonical category slugs. Up to 10 values. */
3106
+ categories?: string[];
3076
3107
  /** @description Range filter on the job's `publishedAt` timestamp. */
3077
3108
  publishedAt?: {
3078
3109
  /**
@@ -3771,6 +3802,10 @@ interface components {
3771
3802
  * @enum {string}
3772
3803
  */
3773
3804
  salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour";
3805
+ /** @description Up to 100 canonical skill slugs from `GET /v1/taxonomies/skills`. Every slug must exist in this account. */
3806
+ skills?: string[];
3807
+ /** @description Up to 100 canonical category slugs from `GET /v1/taxonomies/categories`. Every slug must exist in this account. */
3808
+ categories?: string[];
3774
3809
  /** @description Whether the job appears in featured slots on the public board. */
3775
3810
  isFeatured?: boolean;
3776
3811
  /** @description Job expiry as a Unix epoch in milliseconds. On create, omitted or `null` defaults to 30 days from creation. On PATCH, pass `null` to clear an existing expiry. Past timestamps remove the job from the public board. */
@@ -3882,35 +3917,29 @@ type Schemas = components['schemas'];
3882
3917
  * fields.
3883
3918
  */
3884
3919
  /**
3885
- * Medusa-style storefront pagination fields (ADR-0037 §7), populated only by
3886
- * the board jobs catalog reads (browse / search / company-jobs); absent on
3887
- * every other list/search. `nextCursor` is preserved alongside (offset-encoded).
3920
+ * Optional offset-pagination metadata generated from the Board API contract.
3921
+ * `nextCursor` is preserved alongside for forward cursor iteration.
3888
3922
  */
3889
- interface StorefrontPagination {
3890
- /** Total matching results ("X jobs"). */
3891
- count?: number;
3892
- /** The page size used for this response. */
3893
- limit?: number;
3894
- /** Number of items skipped before this page. */
3895
- offset?: number;
3896
- /** Items hidden behind the candidate paywall for the current viewer; absent/0 when entitled. */
3897
- gatedCount?: number;
3898
- }
3899
- interface ListEnvelope<T> extends StorefrontPagination {
3923
+ type OffsetPagination = Schemas['OffsetPagination'];
3924
+ /** @deprecated Use `OffsetPagination`. */
3925
+ type StorefrontPagination = OffsetPagination;
3926
+ /** @deprecated Use `OffsetPagination`. */
3927
+ type JobCatalogPagination = OffsetPagination;
3928
+ type ListEnvelope<T> = OffsetPagination & {
3900
3929
  object: 'list';
3901
3930
  url: string;
3902
3931
  hasMore: boolean;
3903
3932
  /** `null` when `hasMore` is false — always present, never undefined. */
3904
3933
  nextCursor: string | null;
3905
3934
  data: T[];
3906
- }
3907
- interface SearchEnvelope<T> extends StorefrontPagination {
3935
+ };
3936
+ type SearchEnvelope<T> = OffsetPagination & {
3908
3937
  object: 'search_result';
3909
3938
  url: string;
3910
3939
  hasMore: boolean;
3911
3940
  nextCursor: string | null;
3912
3941
  data: T[];
3913
- }
3942
+ };
3914
3943
 
3915
3944
  type PublicJob = Schemas['PublicJob'];
3916
3945
  type PublicJobCard = Schemas['PublicJobCard'];
@@ -3941,17 +3970,17 @@ interface RelatedSearch {
3941
3970
  term: string;
3942
3971
  count: number;
3943
3972
  }
3944
- /** The browse list envelope — `PublicJobCard`s + storefront fields + `relatedSearches`. */
3945
- interface JobCardListEnvelope extends ListEnvelope<PublicJobCard> {
3973
+ /** The browse list envelope — `PublicJobCard`s + job catalog pagination + `relatedSearches`. */
3974
+ type JobCardListEnvelope = ListEnvelope<PublicJobCard> & {
3946
3975
  relatedSearches?: RelatedSearch[];
3947
- }
3948
- /** The search envelope — `PublicJobCard`s + storefront fields. */
3976
+ };
3977
+ /** The search envelope — `PublicJobCard`s + job catalog pagination. */
3949
3978
  type JobCardSearchEnvelope = SearchEnvelope<PublicJobCard>;
3950
3979
  type JobsListQuery = {
3951
3980
  cursor?: string;
3952
3981
  /** 1–100. */
3953
3982
  limit?: number;
3954
- /** Storefront page offset; takes precedence over `cursor`. `offset + limit` ≤ 10,000. */
3983
+ /** Job catalog page offset; takes precedence over `cursor`. `offset + limit` ≤ 10,000. */
3955
3984
  offset?: number;
3956
3985
  /** Repeated param (up to 10) — OR-matched. Repeat `companyId` per value. */
3957
3986
  companyId?: string[];
@@ -3977,4 +4006,4 @@ type JobsSimilarQuery = {
3977
4006
  };
3978
4007
  type JobsSearchBody = Schemas['PublicSearchJobsBody'];
3979
4008
 
3980
- export type { CustomFieldValues as C, EmploymentType as E, JobSort as J, ListEnvelope as L, OfficeLocation as O, PublicJob as P, RemoteOption as R, Seniority as S, PublicJobCard as a, Schemas as b, components as c, JobsListQuery as d, JobCardListEnvelope as e, JobsSearchBody as f, JobCardSearchEnvelope as g, JobsSimilarQuery as h, SearchEnvelope as i, CustomFieldValue as j, EducationRequirement as k, JobCompany as l, RelatedSearch as m, RemotePermit as n, RemoteTimezone as o, StorefrontPagination as p };
4009
+ export type { CustomFieldValues as C, EmploymentType as E, JobSort as J, ListEnvelope as L, OfficeLocation as O, PublicJob as P, RemoteOption as R, Seniority as S, PublicJobCard as a, Schemas as b, components as c, JobsListQuery as d, JobCardListEnvelope as e, JobsSearchBody as f, JobCardSearchEnvelope as g, JobsSimilarQuery as h, SearchEnvelope as i, CustomFieldValue as j, EducationRequirement as k, JobCatalogPagination as l, JobCompany as m, OffsetPagination as n, RelatedSearch as o, RemotePermit as p, RemoteTimezone as q, StorefrontPagination as r };
@@ -84,7 +84,7 @@ interface components {
84
84
  object: "alert";
85
85
  label: string | null;
86
86
  /** @enum {string} */
87
- frequency: "daily" | "weekly";
87
+ frequency: "weekly";
88
88
  isActive: boolean;
89
89
  filters: {
90
90
  jobFunctions: string[];
@@ -104,7 +104,7 @@ interface components {
104
104
  AlertBody: {
105
105
  label?: string;
106
106
  /** @enum {string} */
107
- frequency: "daily" | "weekly";
107
+ frequency: "weekly";
108
108
  jobFunctions?: string[];
109
109
  seniorityLevels?: string[];
110
110
  remoteOptions?: string[];
@@ -1019,6 +1019,10 @@ interface components {
1019
1019
  * @enum {string}
1020
1020
  */
1021
1021
  salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour";
1022
+ /** @description Up to 100 canonical skill slugs from `GET /v1/taxonomies/skills`. Every slug must exist in this account. */
1023
+ skills?: string[];
1024
+ /** @description Up to 100 canonical category slugs from `GET /v1/taxonomies/categories`. Every slug must exist in this account. */
1025
+ categories?: string[];
1022
1026
  /** @description Whether the job appears in featured slots on the public board. */
1023
1027
  isFeatured?: boolean;
1024
1028
  /** @description Job expiry as a Unix epoch in milliseconds. On create, omitted or `null` defaults to 30 days from creation. On PATCH, pass `null` to clear an existing expiry. Past timestamps remove the job from the public board. */
@@ -1441,6 +1445,10 @@ interface components {
1441
1445
  * @enum {string}
1442
1446
  */
1443
1447
  salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour";
1448
+ /** @description Up to 100 canonical skill slugs from `GET /v1/taxonomies/skills`. Every slug must exist in this account. */
1449
+ skills?: string[];
1450
+ /** @description Up to 100 canonical category slugs from `GET /v1/taxonomies/categories`. Every slug must exist in this account. */
1451
+ categories?: string[];
1444
1452
  /** @description Required education credentials. Each value is one of `high_school`, `associate_degree`, `bachelor_degree`, `professional_certificate`, `postgraduate_degree`, or `no_requirements`. */
1445
1453
  educationRequirements?: ("high_school" | "associate_degree" | "bachelor_degree" | "professional_certificate" | "postgraduate_degree" | "no_requirements")[];
1446
1454
  /** @description Minimum required experience, expressed in months. */
@@ -1646,6 +1654,10 @@ interface components {
1646
1654
  * @enum {string}
1647
1655
  */
1648
1656
  salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour";
1657
+ /** @description Up to 100 canonical skill slugs from `GET /v1/taxonomies/skills`. Every slug must exist in this account. */
1658
+ skills?: string[];
1659
+ /** @description Up to 100 canonical category slugs from `GET /v1/taxonomies/categories`. Every slug must exist in this account. */
1660
+ categories?: string[];
1649
1661
  /** @description Required education credentials. Each value is one of `high_school`, `associate_degree`, `bachelor_degree`, `professional_certificate`, `postgraduate_degree`, or `no_requirements`. */
1650
1662
  educationRequirements?: ("high_school" | "associate_degree" | "bachelor_degree" | "professional_certificate" | "postgraduate_degree" | "no_requirements")[];
1651
1663
  /** @description Minimum required experience, expressed in months. */
@@ -1996,6 +2008,10 @@ interface components {
1996
2008
  createdAt: string;
1997
2009
  /** @description Time at which the job was last updated. ISO 8601 datetime. */
1998
2010
  updatedAt: string;
2011
+ /** @description Canonical skill slugs assigned to the job. */
2012
+ skills: string[];
2013
+ /** @description Canonical category slugs assigned to the job. */
2014
+ categories: string[];
1999
2015
  /** @description External identifier supplied by the caller on create, used for deduplication via `GET /v1/jobs?externalId=...`. `null` when no external identifier was set. */
2000
2016
  externalId: string | null;
2001
2017
  /** @description Board-defined custom-field values for this job, keyed by the field `key` (the definitions are published at `GET /v1/settings/job-form`). Each value is returned as stored: a string (`short_text` / `long_text` / a `single_select` option key), a string array (`multi_select` option keys), a boolean, or a number. Always an object — `{}` when the job has no custom-field values, never `null` or a missing field. Only real values are stored, so this never contains `null` or empty values. */
@@ -2214,6 +2230,16 @@ interface components {
2214
2230
  subscribed: boolean;
2215
2231
  updatedAt: number | null;
2216
2232
  };
2233
+ OffsetPagination: {
2234
+ /** @description Total number of results matching the query. */
2235
+ count?: number;
2236
+ /** @description The page size used for this response. */
2237
+ limit?: number;
2238
+ /** @description The number of results skipped before this page. */
2239
+ offset?: number;
2240
+ /** @description Jobs hidden behind the candidate paywall for the current viewer; absent or 0 for an entitled viewer. */
2241
+ gatedCount?: number;
2242
+ };
2217
2243
  /** @description Error envelope, populated once the operation reaches `failed`. `null` otherwise. */
2218
2244
  OperationErrorEnvelope: {
2219
2245
  /** @description Machine-readable error code. */
@@ -2699,7 +2725,8 @@ interface components {
2699
2725
  preferences: {
2700
2726
  id: string;
2701
2727
  label: string | null;
2702
- frequency: string;
2728
+ /** @enum {string} */
2729
+ frequency: "weekly";
2703
2730
  isActive: boolean;
2704
2731
  filters: {
2705
2732
  jobFunctions?: string[];
@@ -2847,7 +2874,7 @@ interface components {
2847
2874
  */
2848
2875
  limit?: number;
2849
2876
  /**
2850
- * @description The number of jobs to skip — the storefront page offset. Takes precedence over `cursor`. `offset + limit` may not exceed 10,000.
2877
+ * @description The number of jobs to skip — the job catalog page offset. Takes precedence over `cursor`. `offset + limit` may not exceed 10,000.
2851
2878
  * @example 0
2852
2879
  */
2853
2880
  offset?: number;
@@ -3073,6 +3100,10 @@ interface components {
3073
3100
  employmentType?: ("full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other")[];
3074
3101
  /** @description Only return jobs at any of the given seniority levels. Up to 10 values. */
3075
3102
  seniority?: ("entry_level" | "associate" | "mid_level" | "senior" | "lead" | "principal" | "director" | "executive")[];
3103
+ /** @description Only return jobs tagged with any of these canonical skill slugs. Up to 10 values. */
3104
+ skills?: string[];
3105
+ /** @description Only return jobs tagged with any of these canonical category slugs. Up to 10 values. */
3106
+ categories?: string[];
3076
3107
  /** @description Range filter on the job's `publishedAt` timestamp. */
3077
3108
  publishedAt?: {
3078
3109
  /**
@@ -3771,6 +3802,10 @@ interface components {
3771
3802
  * @enum {string}
3772
3803
  */
3773
3804
  salaryTimeframe?: "per_year" | "per_month" | "per_week" | "per_day" | "per_hour";
3805
+ /** @description Up to 100 canonical skill slugs from `GET /v1/taxonomies/skills`. Every slug must exist in this account. */
3806
+ skills?: string[];
3807
+ /** @description Up to 100 canonical category slugs from `GET /v1/taxonomies/categories`. Every slug must exist in this account. */
3808
+ categories?: string[];
3774
3809
  /** @description Whether the job appears in featured slots on the public board. */
3775
3810
  isFeatured?: boolean;
3776
3811
  /** @description Job expiry as a Unix epoch in milliseconds. On create, omitted or `null` defaults to 30 days from creation. On PATCH, pass `null` to clear an existing expiry. Past timestamps remove the job from the public board. */
@@ -3882,35 +3917,29 @@ type Schemas = components['schemas'];
3882
3917
  * fields.
3883
3918
  */
3884
3919
  /**
3885
- * Medusa-style storefront pagination fields (ADR-0037 §7), populated only by
3886
- * the board jobs catalog reads (browse / search / company-jobs); absent on
3887
- * every other list/search. `nextCursor` is preserved alongside (offset-encoded).
3920
+ * Optional offset-pagination metadata generated from the Board API contract.
3921
+ * `nextCursor` is preserved alongside for forward cursor iteration.
3888
3922
  */
3889
- interface StorefrontPagination {
3890
- /** Total matching results ("X jobs"). */
3891
- count?: number;
3892
- /** The page size used for this response. */
3893
- limit?: number;
3894
- /** Number of items skipped before this page. */
3895
- offset?: number;
3896
- /** Items hidden behind the candidate paywall for the current viewer; absent/0 when entitled. */
3897
- gatedCount?: number;
3898
- }
3899
- interface ListEnvelope<T> extends StorefrontPagination {
3923
+ type OffsetPagination = Schemas['OffsetPagination'];
3924
+ /** @deprecated Use `OffsetPagination`. */
3925
+ type StorefrontPagination = OffsetPagination;
3926
+ /** @deprecated Use `OffsetPagination`. */
3927
+ type JobCatalogPagination = OffsetPagination;
3928
+ type ListEnvelope<T> = OffsetPagination & {
3900
3929
  object: 'list';
3901
3930
  url: string;
3902
3931
  hasMore: boolean;
3903
3932
  /** `null` when `hasMore` is false — always present, never undefined. */
3904
3933
  nextCursor: string | null;
3905
3934
  data: T[];
3906
- }
3907
- interface SearchEnvelope<T> extends StorefrontPagination {
3935
+ };
3936
+ type SearchEnvelope<T> = OffsetPagination & {
3908
3937
  object: 'search_result';
3909
3938
  url: string;
3910
3939
  hasMore: boolean;
3911
3940
  nextCursor: string | null;
3912
3941
  data: T[];
3913
- }
3942
+ };
3914
3943
 
3915
3944
  type PublicJob = Schemas['PublicJob'];
3916
3945
  type PublicJobCard = Schemas['PublicJobCard'];
@@ -3941,17 +3970,17 @@ interface RelatedSearch {
3941
3970
  term: string;
3942
3971
  count: number;
3943
3972
  }
3944
- /** The browse list envelope — `PublicJobCard`s + storefront fields + `relatedSearches`. */
3945
- interface JobCardListEnvelope extends ListEnvelope<PublicJobCard> {
3973
+ /** The browse list envelope — `PublicJobCard`s + job catalog pagination + `relatedSearches`. */
3974
+ type JobCardListEnvelope = ListEnvelope<PublicJobCard> & {
3946
3975
  relatedSearches?: RelatedSearch[];
3947
- }
3948
- /** The search envelope — `PublicJobCard`s + storefront fields. */
3976
+ };
3977
+ /** The search envelope — `PublicJobCard`s + job catalog pagination. */
3949
3978
  type JobCardSearchEnvelope = SearchEnvelope<PublicJobCard>;
3950
3979
  type JobsListQuery = {
3951
3980
  cursor?: string;
3952
3981
  /** 1–100. */
3953
3982
  limit?: number;
3954
- /** Storefront page offset; takes precedence over `cursor`. `offset + limit` ≤ 10,000. */
3983
+ /** Job catalog page offset; takes precedence over `cursor`. `offset + limit` ≤ 10,000. */
3955
3984
  offset?: number;
3956
3985
  /** Repeated param (up to 10) — OR-matched. Repeat `companyId` per value. */
3957
3986
  companyId?: string[];
@@ -3977,4 +4006,4 @@ type JobsSimilarQuery = {
3977
4006
  };
3978
4007
  type JobsSearchBody = Schemas['PublicSearchJobsBody'];
3979
4008
 
3980
- export type { CustomFieldValues as C, EmploymentType as E, JobSort as J, ListEnvelope as L, OfficeLocation as O, PublicJob as P, RemoteOption as R, Seniority as S, PublicJobCard as a, Schemas as b, components as c, JobsListQuery as d, JobCardListEnvelope as e, JobsSearchBody as f, JobCardSearchEnvelope as g, JobsSimilarQuery as h, SearchEnvelope as i, CustomFieldValue as j, EducationRequirement as k, JobCompany as l, RelatedSearch as m, RemotePermit as n, RemoteTimezone as o, StorefrontPagination as p };
4009
+ export type { CustomFieldValues as C, EmploymentType as E, JobSort as J, ListEnvelope as L, OfficeLocation as O, PublicJob as P, RemoteOption as R, Seniority as S, PublicJobCard as a, Schemas as b, components as c, JobsListQuery as d, JobCardListEnvelope as e, JobsSearchBody as f, JobCardSearchEnvelope as g, JobsSimilarQuery as h, SearchEnvelope as i, CustomFieldValue as j, EducationRequirement as k, JobCatalogPagination as l, JobCompany as m, OffsetPagination as n, RelatedSearch as o, RemotePermit as p, RemoteTimezone as q, StorefrontPagination as r };
@@ -1,4 +1,4 @@
1
- import { b as Schemas, L as ListEnvelope, m as RelatedSearch } from './jobs-IIJtDgzX.js';
1
+ import { b as Schemas, L as ListEnvelope, o as RelatedSearch } from './jobs-BFLMDNEN.js';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -44,9 +44,9 @@ type CompanySalary = Schemas['CompanySalary'];
44
44
  */
45
45
  type CompanyCategorySalary = Schemas['CompanyCategorySalary'];
46
46
  /** The companies browse list — `PublicCompany`s + `market` `relatedSearches`. */
47
- interface CompanyListEnvelope extends ListEnvelope<PublicCompany> {
47
+ type CompanyListEnvelope = ListEnvelope<PublicCompany> & {
48
48
  relatedSearches?: RelatedSearch[];
49
- }
49
+ };
50
50
  type CompaniesListQuery = {
51
51
  cursor?: string;
52
52
  /** Scope to a single market (sector) by slug. Unknown slugs 404. */
@@ -54,7 +54,7 @@ type CompaniesListQuery = {
54
54
  /** 1–100. */
55
55
  limit?: number;
56
56
  /**
57
- * Storefront page offset (companies to skip); takes precedence over
57
+ * Company catalog page offset (companies to skip); takes precedence over
58
58
  * `cursor`. Pair with the response `count` to page in parallel.
59
59
  */
60
60
  offset?: number;
@@ -1,4 +1,4 @@
1
- import { b as Schemas, L as ListEnvelope, m as RelatedSearch } from './jobs-IIJtDgzX.mjs';
1
+ import { b as Schemas, L as ListEnvelope, o as RelatedSearch } from './jobs-BFLMDNEN.mjs';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -44,9 +44,9 @@ type CompanySalary = Schemas['CompanySalary'];
44
44
  */
45
45
  type CompanyCategorySalary = Schemas['CompanyCategorySalary'];
46
46
  /** The companies browse list — `PublicCompany`s + `market` `relatedSearches`. */
47
- interface CompanyListEnvelope extends ListEnvelope<PublicCompany> {
47
+ type CompanyListEnvelope = ListEnvelope<PublicCompany> & {
48
48
  relatedSearches?: RelatedSearch[];
49
- }
49
+ };
50
50
  type CompaniesListQuery = {
51
51
  cursor?: string;
52
52
  /** Scope to a single market (sector) by slug. Unknown slugs 404. */
@@ -54,7 +54,7 @@ type CompaniesListQuery = {
54
54
  /** 1–100. */
55
55
  limit?: number;
56
56
  /**
57
- * Storefront page offset (companies to skip); takes precedence over
57
+ * Company catalog page offset (companies to skip); takes precedence over
58
58
  * `cursor`. Pair with the response `count` to page in parallel.
59
59
  */
60
60
  offset?: number;
package/dist/seo.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-BfEEEOHj.mjs';
2
- import { P as PublicBoard } from './board-DgDC0T4g.mjs';
3
- import { P as PublicJob } from './jobs-IIJtDgzX.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-pO_vGORE.mjs';
2
+ import { P as PublicBoard } from './board-Be8dY9Ba.mjs';
3
+ import { P as PublicJob } from './jobs-BFLMDNEN.mjs';
4
4
  import { B as BoardLabelOverrides } from './ui-copy-rlfoH9P3.mjs';
5
5
 
6
6
  /**
package/dist/seo.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-CL_00fNX.js';
2
- import { P as PublicBoard } from './board-Id19Yg8-.js';
3
- import { P as PublicJob } from './jobs-IIJtDgzX.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed, C as CompanyCategorySalary, a as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './salaries-negE75t8.js';
2
+ import { P as PublicBoard } from './board-DsRbgz_D.js';
3
+ import { P as PublicJob } from './jobs-BFLMDNEN.js';
4
4
  import { B as BoardLabelOverrides } from './ui-copy-rlfoH9P3.js';
5
5
 
6
6
  /**
package/dist/server.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './jobs-IIJtDgzX.mjs';
3
- import './board-DgDC0T4g.mjs';
4
- import './salaries-BfEEEOHj.mjs';
2
+ import './jobs-BFLMDNEN.mjs';
3
+ import './board-Be8dY9Ba.mjs';
4
+ import './salaries-pO_vGORE.mjs';
5
5
 
6
6
  /**
7
7
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './jobs-IIJtDgzX.js';
3
- import './board-Id19Yg8-.js';
4
- import './salaries-CL_00fNX.js';
2
+ import './jobs-BFLMDNEN.js';
3
+ import './board-DsRbgz_D.js';
4
+ import './salaries-negE75t8.js';
5
5
 
6
6
  /**
7
7
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -1,7 +1,7 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './jobs-IIJtDgzX.mjs';
3
- import './board-DgDC0T4g.mjs';
4
- import './salaries-BfEEEOHj.mjs';
2
+ import './jobs-BFLMDNEN.mjs';
3
+ import './board-Be8dY9Ba.mjs';
4
+ import './salaries-pO_vGORE.mjs';
5
5
 
6
6
  /**
7
7
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './jobs-IIJtDgzX.js';
3
- import './board-Id19Yg8-.js';
4
- import './salaries-CL_00fNX.js';
2
+ import './jobs-BFLMDNEN.js';
3
+ import './board-DsRbgz_D.js';
4
+ import './salaries-negE75t8.js';
5
5
 
6
6
  /**
7
7
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavuno/board",
3
- "version": "1.34.0",
3
+ "version": "1.35.0",
4
4
  "description": "Typed isomorphic client for the Cavuno Board API",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",
@@ -49,7 +49,6 @@ import { createBoardClient } from '@cavuno/board';
49
49
  // Browser/SPA: 'local' persists the pair across tabs + reloads via
50
50
  // localStorage; 'session' scopes it to the tab; 'memory' drops it on reload.
51
51
  const board = createBoardClient({
52
- baseUrl: 'https://api.cavuno.com',
53
52
  board: 'pk_a8f3...',
54
53
  auth: { storage: 'local' },
55
54
  });
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cavuno-board-client
3
- description: Create and configure the @cavuno/board client — baseUrl and the pk_ board identifier, global headers, request/response hooks, per-call FetchOptions caching passthrough, the client.fetch escape hatch, and the rule that keeps one shared instance safe under SSR.
3
+ description: Create and configure the @cavuno/board client — the pk_ board identifier, optional API-origin override, global headers, hooks, per-call FetchOptions, and the rule that keeps one shared instance safe under SSR.
4
4
  ---
5
5
 
6
6
  # The Board API client
@@ -23,7 +23,6 @@ description: Create and configure the @cavuno/board client — baseUrl and the p
23
23
  import { createBoardClient } from '@cavuno/board';
24
24
 
25
25
  const board = createBoardClient({
26
- baseUrl: 'https://api.cavuno.com',
27
26
  board: 'pk_a8f3...', // pk_ key (preferred) | boards_ id | slug
28
27
  });
29
28
  ```
@@ -34,7 +33,6 @@ Use the `pk_…` publishable key for `board`, not the slug: the slug is operator
34
33
 
35
34
  ```ts no-check
36
35
  const board = createBoardClient({
37
- baseUrl: process.env.PUBLIC_CAVUNO_API_URL!,
38
36
  board: process.env.PUBLIC_CAVUNO_BOARD!,
39
37
  globalHeaders: { 'Accept-Language': 'en' },
40
38
  onRequest: async (req) => req, // mutate/replace the request (locale, URL rewrite)
@@ -69,7 +67,6 @@ import { createBoardClient } from '@cavuno/board';
69
67
 
70
68
  // Safe: shared, stateless. Per-user token rides per call.
71
69
  export const board = createBoardClient({
72
- baseUrl: process.env.PUBLIC_CAVUNO_API_URL!,
73
70
  board: process.env.PUBLIC_CAVUNO_BOARD!,
74
71
  });
75
72
  ```
@@ -28,7 +28,7 @@ Only the methods and fields shown here exist. There is no pause/suspend: deactiv
28
28
  const sub = await board.jobAlerts.subscribe({
29
29
  email: 'ada@example.com',
30
30
  consent: true,
31
- frequency: 'weekly', // 'daily' | 'weekly'
31
+ frequency: 'weekly', // the only supported cadence
32
32
  filters: { jobFunctions: ['engineering'], remoteOptions: ['remote'], placeSlugs: ['berlin'] },
33
33
  });
34
34
  sub.status; // 'created' | 'duplicate'
@@ -67,7 +67,7 @@ await board.jobAlerts.updatePreference({
67
67
  subscriptionId,
68
68
  preferenceId: pref.id,
69
69
  token,
70
- frequency: 'daily', // required — restate even if unchanged
70
+ frequency: 'weekly', // required — restate even if unchanged
71
71
  filters: pref.filters, // round-trip stored filters you aren't editing
72
72
  });
73
73
  ```
@@ -94,7 +94,7 @@ await board.me.alerts.remove(alert.id); // 204 → void; the only way to stop an
94
94
  ```ts snippet
95
95
  const current = await board.me.alerts.retrieve(alertId);
96
96
  await board.me.alerts.update(alertId, {
97
- frequency: 'daily', // the one edit
97
+ frequency: 'weekly',
98
98
  jobFunctions: current.filters.jobFunctions,
99
99
  seniorityLevels: current.filters.seniorityLevels,
100
100
  remoteOptions: current.filters.remoteOptions,
@@ -112,4 +112,5 @@ await board.me.alerts.update(alertId, {
112
112
  - [ ] Manage page reads `subscription` + `token` from the email link's query string; writes send `subscriptionId` in the body.
113
113
  - [ ] Editing one preference field leaves the others intact (full-replace round-trip, both surfaces).
114
114
  - [ ] Alert UI only promises filtering on job function / place / remote option.
115
+ - [ ] Alert UI offers weekly cadence only and never sends a legacy daily value.
115
116
  - [ ] Alert surfaces are hidden when `features.jobAlerts` is false.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cavuno-board-jobs
3
- description: Browse, search, and render jobs with the @cavuno/board SDK — jobs.list, jobs.search, jobs.retrieve, jobs.similar. Covers the slim card vs full job shapes, storefront pagination (count/limit/offset + opaque cursor), filters, and the candidate-paywall gatedCount.
3
+ description: Browse, search, and render jobs with the @cavuno/board SDK — jobs.list, jobs.search, jobs.retrieve, jobs.similar. Covers the slim card vs full job shapes, catalog pagination (count/limit/offset + opaque cursor), filters, and the candidate-paywall gatedCount.
4
4
  ---
5
5
 
6
6
  # Jobs: browse, search, detail
@@ -19,7 +19,7 @@ The highest-traffic surface. Listing and search return slim `PublicJobCard`s; th
19
19
 
20
20
  ## List and render cards
21
21
 
22
- `jobs.list` returns a `JobCardListEnvelope`: storefront pagination fields plus `data: PublicJobCard[]` and optional `relatedSearches`.
22
+ `jobs.list` returns a `JobCardListEnvelope`: catalog pagination fields plus `data: PublicJobCard[]` and optional `relatedSearches`.
23
23
 
24
24
  ```ts snippet
25
25
  const page = await board.jobs.list({ limit: 20, seniority: ['senior', 'lead'] });