@cavuno/board 4.19.0 → 4.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/{_spec-DyTPJbIZ.d.mts → _spec-CyNKpM_j.d.mts} +68 -4
  3. package/dist/{_spec-DyTPJbIZ.d.ts → _spec-CyNKpM_j.d.ts} +68 -4
  4. package/dist/{blog-Cdw6_ocq.d.mts → blog-BNIqGayD.d.mts} +1 -1
  5. package/dist/{blog-vDgRPBAK.d.ts → blog-CRvaDyzJ.d.ts} +1 -1
  6. package/dist/{board-CLDHd9N_.d.mts → board-CXNxSlUB.d.ts} +16 -3
  7. package/dist/{board-DpDCNMJD.d.ts → board-mn3GVbrC.d.mts} +16 -3
  8. package/dist/{breadcrumbs-CKtVWTOB.d.mts → breadcrumbs-Bi4LHNAF.d.mts} +2 -2
  9. package/dist/{breadcrumbs-CYT3HxfO.d.ts → breadcrumbs-Crk6Q69T.d.ts} +2 -2
  10. package/dist/browser/cavuno-board.global.min.js +1 -1
  11. package/dist/{chunk-XNO4NOPW.mjs → chunk-NQTMFOKF.mjs} +1 -0
  12. package/dist/filters.d.mts +2 -2
  13. package/dist/filters.d.ts +2 -2
  14. package/dist/format.d.mts +4 -4
  15. package/dist/format.d.ts +4 -4
  16. package/dist/index.d.mts +33 -17
  17. package/dist/index.d.ts +33 -17
  18. package/dist/index.js +14 -6
  19. package/dist/index.mjs +14 -7
  20. package/dist/{jobs-Bnx1B6at.d.mts → jobs-CALE3I8I.d.mts} +1 -1
  21. package/dist/{jobs-Bwl7pKKg.d.ts → jobs-CSWXqLZR.d.ts} +1 -1
  22. package/dist/route-contract.d.mts +2 -1
  23. package/dist/route-contract.d.ts +2 -1
  24. package/dist/{search-CQZ-ibOl.d.ts → search-BRCbe1Nm.d.ts} +1 -1
  25. package/dist/{search-DlxLGmDk.d.mts → search-B_hwS-xu.d.mts} +1 -1
  26. package/dist/{seo-zYWVcaj1.d.mts → seo-CS4lrG20.d.mts} +1 -1
  27. package/dist/{seo-BfEBr4pW.d.ts → seo-D1u-RmLQ.d.ts} +1 -1
  28. package/dist/seo-files.d.mts +2 -2
  29. package/dist/seo-files.d.ts +2 -2
  30. package/dist/seo.d.mts +6 -6
  31. package/dist/seo.d.ts +6 -6
  32. package/dist/server.d.mts +6 -6
  33. package/dist/server.d.ts +6 -6
  34. package/dist/server.mjs +1 -1
  35. package/dist/sitemap.d.mts +6 -6
  36. package/dist/sitemap.d.ts +6 -6
  37. package/dist/sitemap.mjs +1 -1
  38. package/dist/suggest.d.mts +2 -2
  39. package/dist/suggest.d.ts +2 -2
  40. package/dist/well-known.d.mts +2 -1
  41. package/dist/well-known.d.ts +2 -1
  42. package/package.json +2 -2
  43. package/skills/manifest.json +1 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,25 @@
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.20.0 — 2026-09-03
7
+
8
+ - **Memberships as public identity.** `PublicCompanyMembership` (`planId` +
9
+ display name) is exported, and `board.companies.list({ membershipPlanId })`
10
+ scopes the roster to the companies holding an active membership on that
11
+ published plan. Combines with `marketSlug` by intersection; `count` then
12
+ describes the members.
13
+ - **`board.plans.list({ purpose })`** accepts every plan purpose:
14
+ `job_posting`, `talent_access`, `membership`, `job_seeker`,
15
+ `employer_service`, `job_seeker_service`. Plans carry `pricingMode`; a
16
+ `contact` plan is quote-only, so render `priceText` and the CTA fields
17
+ instead of `price`.
18
+ - **`board.plans.listSalesLed()` is deprecated.** Use
19
+ `plans.list({ purpose: 'employer_service' })` and keep the rows whose
20
+ `pricingMode` is `contact`. The helper keeps working as a compatibility
21
+ read.
22
+ - **`BOARD_API_ERROR_CODES`**: adds `membership_required`, returned when a
23
+ board requires an approved membership to post and the caller has none.
24
+
6
25
  ## 4.19.0 — 2026-09-02
7
26
 
8
27
  - **`board.sitemap()` / `board.sitemap.entries(bucket, { limit, cursor })`**:
@@ -547,6 +547,7 @@ interface components {
547
547
  publishedJobCount: number;
548
548
  /** @description Number of jobs that contribute to this company's salary aggregates on the board (the salary sample size). `0` when there is no usable salary data — prefer this over fetching the full company-salary document just to decide whether to show a Salaries tab. Not the same as `publishedJobCount` (open roles without pay data stay at 0 here). */
549
549
  salarySampleCount: number;
550
+ membership: components["schemas"]["PublicCompanyMembership"];
550
551
  links: components["schemas"]["PublicCompanyLinks"];
551
552
  };
552
553
  CompanyPublicDetail: components["schemas"]["CompanyPublic"] & {
@@ -920,7 +921,9 @@ interface components {
920
921
  /** @enum {string} */
921
922
  object: "employer_billing_option";
922
923
  /** @enum {string} */
923
- type: "subscription" | "order";
924
+ type: "subscription" | "order" | "plan_assignment";
925
+ /** @enum {string} */
926
+ kind?: "member_post";
924
927
  planId: string;
925
928
  planName: string;
926
929
  /** @enum {string} */
@@ -929,6 +932,10 @@ interface components {
929
932
  jobsTotal: number;
930
933
  featuredRemaining: number;
931
934
  featuredTotal: number;
935
+ /** @description True when this option grants unlimited job posts; jobsRemaining/jobsTotal are then not meaningful. */
936
+ jobsUnlimited?: boolean;
937
+ /** @description True when this option grants unlimited featured posts. */
938
+ featuredUnlimited?: boolean;
932
939
  /**
933
940
  * Format: date-time
934
941
  * @description When a subscription renews, or `null` for one-time orders.
@@ -960,6 +967,11 @@ interface components {
960
967
  type: "subscription";
961
968
  planId: string;
962
969
  id: string;
970
+ } | {
971
+ /** @enum {string} */
972
+ type: "plan_assignment";
973
+ planId?: string;
974
+ id?: string;
963
975
  };
964
976
  invoiceBilling?: {
965
977
  billingName?: string;
@@ -1239,6 +1251,16 @@ interface components {
1239
1251
  hidden: boolean;
1240
1252
  position: number;
1241
1253
  };
1254
+ EmployerPostingCapabilities: {
1255
+ canPost: boolean;
1256
+ /** @enum {string} */
1257
+ reason?: "membership_required";
1258
+ discountPercent: number;
1259
+ freePostsRemaining: number;
1260
+ /** @description True when an active membership grants unlimited posts. */
1261
+ freePostsUnlimited?: boolean;
1262
+ memberPlanName?: string;
1263
+ };
1242
1264
  EmployerProfileStats: {
1243
1265
  /** @enum {string} */
1244
1266
  object: "employer_profile_stats";
@@ -1692,13 +1714,26 @@ interface components {
1692
1714
  /** @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. */
1693
1715
  description: string | null;
1694
1716
  /** @enum {string} */
1695
- purpose: "job_posting" | "talent_access";
1717
+ purpose: "job_posting" | "talent_access" | "membership" | "job_seeker" | "employer_service" | "job_seeker_service";
1696
1718
  /** @enum {string} */
1697
1719
  kind: "free" | "subscription" | "one_time" | "bundle";
1698
1720
  /** @enum {string|null} */
1699
- billingInterval: "month" | "year" | null;
1721
+ billingInterval: "day" | "week" | "month" | "year" | null;
1722
+ /** @description Stripe recurring.interval_count. Null means 1. Quarterly is month × 3. */
1723
+ billingIntervalCount: number | null;
1700
1724
  isRecommended: boolean;
1701
1725
  displayOrder: number;
1726
+ /**
1727
+ * @description How the plan is sold. `priced` is bought with `price.stripePriceId`; `contact` is quote-only and must render the CTA below instead of a price. Read this, never `price` — a contact plan can still carry a zeroed price row. Plans created before this field existed report `priced`.
1728
+ * @enum {string}
1729
+ */
1730
+ pricingMode: "priced" | "contact";
1731
+ /** @description Operator-authored display price for a contact plan, e.g. "From $2,000" or "15% of first-year salary". Null when unset. */
1732
+ priceText: string | null;
1733
+ /** @description Operator-authored CTA label for a contact plan. Null when unset; supply your own wording. */
1734
+ ctaText: string | null;
1735
+ /** @description The CTA target: an https, mailto:, or tel: URL. Null when unset, in which case render no CTA rather than a dead control. */
1736
+ ctaDestination: string | null;
1702
1737
  invoiceOnly: boolean;
1703
1738
  /** @enum {string|null} */
1704
1739
  publishTiming: "on_issue" | "on_payment" | null;
@@ -1709,6 +1744,10 @@ interface components {
1709
1744
  /** @description The public Stripe Price id used to start checkout. */
1710
1745
  stripePriceId: string | null;
1711
1746
  } | null;
1747
+ /**
1748
+ * @deprecated
1749
+ * @description Job-posting feature summary. **Deprecated** — superseded by `features`, which carries the same benefits keyed by canonical feature key. Still serialized for compatibility.
1750
+ */
1712
1751
  featureSummary: {
1713
1752
  durationDays: number;
1714
1753
  maxActiveJobs: number;
@@ -1716,11 +1755,23 @@ interface components {
1716
1755
  /** @enum {string} */
1717
1756
  featureSelectionMode: "auto" | "manual";
1718
1757
  };
1719
- /** @description Talent-access allowances (per billing period). Present only when `purpose` is `talent_access`. `"unlimited"` is a sentinel value. */
1758
+ /**
1759
+ * @deprecated
1760
+ * @description Talent-access allowances (per billing period). Present only when `purpose` is `talent_access`. `"unlimited"` is a sentinel value. **Deprecated** — superseded by `features`, which carries the same allowances keyed by canonical feature key. Still serialized for compatibility.
1761
+ */
1720
1762
  talent?: {
1721
1763
  unlocksPerPeriod: string;
1722
1764
  messagesPerPeriod: string;
1723
1765
  };
1766
+ /** @description Self-describing map of every benefit the plan carries, keyed by the canonical feature key. Each entry includes the value and enough of the feature definition (name, dataType, and optional displayOrder) to render without a second call. Values are strings; the literal "unlimited" is a sentinel and must be kept as a string. New features, including operator-defined custom attributes, appear here with no schema change. The API returns no display copy. */
1767
+ features: {
1768
+ [key: string]: {
1769
+ value: string;
1770
+ name: string;
1771
+ dataType: string;
1772
+ displayOrder?: number;
1773
+ };
1774
+ };
1724
1775
  };
1725
1776
  PostSuggestion: {
1726
1777
  /** @enum {string} */
@@ -1863,6 +1914,11 @@ interface components {
1863
1914
  * @enum {string|null}
1864
1915
  */
1865
1916
  talentAccessModel: "paid_messaging" | "paid_unlocks_and_messaging" | null;
1917
+ /** @description Employer posting policy. Separate from `features.publicJobSubmission`, which says whether the board takes public submissions at all — this says who may complete one. */
1918
+ posting: {
1919
+ /** @description Whether posting a job on this board requires an active membership. When `true`, render the join gate in place of the anonymous post form: the platform rejects a create from a company with no contributing assignment (`membership_required`). Absent board config defaults to `false`. This flag is board policy and is safe to read anonymously; a signed-in employer's own standing rides their company billing options. */
1920
+ requiresMembership: boolean;
1921
+ };
1866
1922
  analytics: {
1867
1923
  ga4MeasurementId: string | null;
1868
1924
  gtmId: string | null;
@@ -1972,6 +2028,13 @@ interface components {
1972
2028
  */
1973
2029
  public: string | null;
1974
2030
  };
2031
+ /** @description The company's membership on this board, or `null` when it holds none that is public. Only an ACTIVE assignment on a PUBLISHED plan whose purpose is membership appears here: a company on a private (operator-only) plan reads as `null`, and non-membership purchases — job-posting packs, talent access, services — never appear. Identity only: entitlements, billing state, and expiry are not on the public wire. */
2032
+ PublicCompanyMembership: {
2033
+ /** @description The membership plan's `id`. Pass it to `GET /boards/{identifier}/companies?membershipPlanId=` to browse the roster, or join it against the board's plans to render the plan's own copy. */
2034
+ planId: string;
2035
+ /** @description The membership plan's current display name — the badge text. Operators rename plans, so treat `planId` as the stable key. */
2036
+ planName: string;
2037
+ } | null;
1975
2038
  PublicJob: {
1976
2039
  /** @description Unique identifier for the object. Use this value as the `{id}` path parameter for the job endpoints (e.g. `GET /v1/jobs/{id}`). */
1977
2040
  id: string;
@@ -2433,6 +2496,7 @@ interface components {
2433
2496
  jobCount: number;
2434
2497
  currency: string;
2435
2498
  };
2499
+ /** @description Deprecated. Prefer public plans with purpose employer_service and pricingMode contact. */
2436
2500
  SalesLedPlan: {
2437
2501
  /** @enum {string} */
2438
2502
  object: "sales_led_plan";
@@ -547,6 +547,7 @@ interface components {
547
547
  publishedJobCount: number;
548
548
  /** @description Number of jobs that contribute to this company's salary aggregates on the board (the salary sample size). `0` when there is no usable salary data — prefer this over fetching the full company-salary document just to decide whether to show a Salaries tab. Not the same as `publishedJobCount` (open roles without pay data stay at 0 here). */
549
549
  salarySampleCount: number;
550
+ membership: components["schemas"]["PublicCompanyMembership"];
550
551
  links: components["schemas"]["PublicCompanyLinks"];
551
552
  };
552
553
  CompanyPublicDetail: components["schemas"]["CompanyPublic"] & {
@@ -920,7 +921,9 @@ interface components {
920
921
  /** @enum {string} */
921
922
  object: "employer_billing_option";
922
923
  /** @enum {string} */
923
- type: "subscription" | "order";
924
+ type: "subscription" | "order" | "plan_assignment";
925
+ /** @enum {string} */
926
+ kind?: "member_post";
924
927
  planId: string;
925
928
  planName: string;
926
929
  /** @enum {string} */
@@ -929,6 +932,10 @@ interface components {
929
932
  jobsTotal: number;
930
933
  featuredRemaining: number;
931
934
  featuredTotal: number;
935
+ /** @description True when this option grants unlimited job posts; jobsRemaining/jobsTotal are then not meaningful. */
936
+ jobsUnlimited?: boolean;
937
+ /** @description True when this option grants unlimited featured posts. */
938
+ featuredUnlimited?: boolean;
932
939
  /**
933
940
  * Format: date-time
934
941
  * @description When a subscription renews, or `null` for one-time orders.
@@ -960,6 +967,11 @@ interface components {
960
967
  type: "subscription";
961
968
  planId: string;
962
969
  id: string;
970
+ } | {
971
+ /** @enum {string} */
972
+ type: "plan_assignment";
973
+ planId?: string;
974
+ id?: string;
963
975
  };
964
976
  invoiceBilling?: {
965
977
  billingName?: string;
@@ -1239,6 +1251,16 @@ interface components {
1239
1251
  hidden: boolean;
1240
1252
  position: number;
1241
1253
  };
1254
+ EmployerPostingCapabilities: {
1255
+ canPost: boolean;
1256
+ /** @enum {string} */
1257
+ reason?: "membership_required";
1258
+ discountPercent: number;
1259
+ freePostsRemaining: number;
1260
+ /** @description True when an active membership grants unlimited posts. */
1261
+ freePostsUnlimited?: boolean;
1262
+ memberPlanName?: string;
1263
+ };
1242
1264
  EmployerProfileStats: {
1243
1265
  /** @enum {string} */
1244
1266
  object: "employer_profile_stats";
@@ -1692,13 +1714,26 @@ interface components {
1692
1714
  /** @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. */
1693
1715
  description: string | null;
1694
1716
  /** @enum {string} */
1695
- purpose: "job_posting" | "talent_access";
1717
+ purpose: "job_posting" | "talent_access" | "membership" | "job_seeker" | "employer_service" | "job_seeker_service";
1696
1718
  /** @enum {string} */
1697
1719
  kind: "free" | "subscription" | "one_time" | "bundle";
1698
1720
  /** @enum {string|null} */
1699
- billingInterval: "month" | "year" | null;
1721
+ billingInterval: "day" | "week" | "month" | "year" | null;
1722
+ /** @description Stripe recurring.interval_count. Null means 1. Quarterly is month × 3. */
1723
+ billingIntervalCount: number | null;
1700
1724
  isRecommended: boolean;
1701
1725
  displayOrder: number;
1726
+ /**
1727
+ * @description How the plan is sold. `priced` is bought with `price.stripePriceId`; `contact` is quote-only and must render the CTA below instead of a price. Read this, never `price` — a contact plan can still carry a zeroed price row. Plans created before this field existed report `priced`.
1728
+ * @enum {string}
1729
+ */
1730
+ pricingMode: "priced" | "contact";
1731
+ /** @description Operator-authored display price for a contact plan, e.g. "From $2,000" or "15% of first-year salary". Null when unset. */
1732
+ priceText: string | null;
1733
+ /** @description Operator-authored CTA label for a contact plan. Null when unset; supply your own wording. */
1734
+ ctaText: string | null;
1735
+ /** @description The CTA target: an https, mailto:, or tel: URL. Null when unset, in which case render no CTA rather than a dead control. */
1736
+ ctaDestination: string | null;
1702
1737
  invoiceOnly: boolean;
1703
1738
  /** @enum {string|null} */
1704
1739
  publishTiming: "on_issue" | "on_payment" | null;
@@ -1709,6 +1744,10 @@ interface components {
1709
1744
  /** @description The public Stripe Price id used to start checkout. */
1710
1745
  stripePriceId: string | null;
1711
1746
  } | null;
1747
+ /**
1748
+ * @deprecated
1749
+ * @description Job-posting feature summary. **Deprecated** — superseded by `features`, which carries the same benefits keyed by canonical feature key. Still serialized for compatibility.
1750
+ */
1712
1751
  featureSummary: {
1713
1752
  durationDays: number;
1714
1753
  maxActiveJobs: number;
@@ -1716,11 +1755,23 @@ interface components {
1716
1755
  /** @enum {string} */
1717
1756
  featureSelectionMode: "auto" | "manual";
1718
1757
  };
1719
- /** @description Talent-access allowances (per billing period). Present only when `purpose` is `talent_access`. `"unlimited"` is a sentinel value. */
1758
+ /**
1759
+ * @deprecated
1760
+ * @description Talent-access allowances (per billing period). Present only when `purpose` is `talent_access`. `"unlimited"` is a sentinel value. **Deprecated** — superseded by `features`, which carries the same allowances keyed by canonical feature key. Still serialized for compatibility.
1761
+ */
1720
1762
  talent?: {
1721
1763
  unlocksPerPeriod: string;
1722
1764
  messagesPerPeriod: string;
1723
1765
  };
1766
+ /** @description Self-describing map of every benefit the plan carries, keyed by the canonical feature key. Each entry includes the value and enough of the feature definition (name, dataType, and optional displayOrder) to render without a second call. Values are strings; the literal "unlimited" is a sentinel and must be kept as a string. New features, including operator-defined custom attributes, appear here with no schema change. The API returns no display copy. */
1767
+ features: {
1768
+ [key: string]: {
1769
+ value: string;
1770
+ name: string;
1771
+ dataType: string;
1772
+ displayOrder?: number;
1773
+ };
1774
+ };
1724
1775
  };
1725
1776
  PostSuggestion: {
1726
1777
  /** @enum {string} */
@@ -1863,6 +1914,11 @@ interface components {
1863
1914
  * @enum {string|null}
1864
1915
  */
1865
1916
  talentAccessModel: "paid_messaging" | "paid_unlocks_and_messaging" | null;
1917
+ /** @description Employer posting policy. Separate from `features.publicJobSubmission`, which says whether the board takes public submissions at all — this says who may complete one. */
1918
+ posting: {
1919
+ /** @description Whether posting a job on this board requires an active membership. When `true`, render the join gate in place of the anonymous post form: the platform rejects a create from a company with no contributing assignment (`membership_required`). Absent board config defaults to `false`. This flag is board policy and is safe to read anonymously; a signed-in employer's own standing rides their company billing options. */
1920
+ requiresMembership: boolean;
1921
+ };
1866
1922
  analytics: {
1867
1923
  ga4MeasurementId: string | null;
1868
1924
  gtmId: string | null;
@@ -1972,6 +2028,13 @@ interface components {
1972
2028
  */
1973
2029
  public: string | null;
1974
2030
  };
2031
+ /** @description The company's membership on this board, or `null` when it holds none that is public. Only an ACTIVE assignment on a PUBLISHED plan whose purpose is membership appears here: a company on a private (operator-only) plan reads as `null`, and non-membership purchases — job-posting packs, talent access, services — never appear. Identity only: entitlements, billing state, and expiry are not on the public wire. */
2032
+ PublicCompanyMembership: {
2033
+ /** @description The membership plan's `id`. Pass it to `GET /boards/{identifier}/companies?membershipPlanId=` to browse the roster, or join it against the board's plans to render the plan's own copy. */
2034
+ planId: string;
2035
+ /** @description The membership plan's current display name — the badge text. Operators rename plans, so treat `planId` as the stable key. */
2036
+ planName: string;
2037
+ } | null;
1975
2038
  PublicJob: {
1976
2039
  /** @description Unique identifier for the object. Use this value as the `{id}` path parameter for the job endpoints (e.g. `GET /v1/jobs/{id}`). */
1977
2040
  id: string;
@@ -2433,6 +2496,7 @@ interface components {
2433
2496
  jobCount: number;
2434
2497
  currency: string;
2435
2498
  };
2499
+ /** @description Deprecated. Prefer public plans with purpose employer_service and pricingMode contact. */
2436
2500
  SalesLedPlan: {
2437
2501
  /** @enum {string} */
2438
2502
  object: "sales_led_plan";
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DyTPJbIZ.mjs';
1
+ import { S as Schemas } from './_spec-CyNKpM_j.mjs';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DyTPJbIZ.js';
1
+ import { S as Schemas } from './_spec-CyNKpM_j.js';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-DyTPJbIZ.mjs';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-Bnx1B6at.mjs';
1
+ import { S as Schemas } from './_spec-CyNKpM_j.js';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-CSWXqLZR.js';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -29,10 +29,23 @@ type CompanyCategorySalary = Schemas['CompanyCategorySalary'];
29
29
  type CompanyListEnvelope = ListEnvelope<PublicCompany> & {
30
30
  relatedSearches?: RelatedSearch[];
31
31
  };
32
+ /**
33
+ * A company's membership on the board, as public identity: the plan's `id`
34
+ * and its current display name. `planId` is the stable key — join it against
35
+ * `board.plans` for price, benefits, and description.
36
+ */
37
+ type PublicCompanyMembership = Schemas['PublicCompanyMembership'];
32
38
  type CompaniesListQuery = {
33
39
  cursor?: string;
34
40
  /** Scope to a single market (sector) by slug. Unknown slugs 404. */
35
41
  marketSlug?: string;
42
+ /**
43
+ * Scope to the companies holding an active membership on this plan, by the
44
+ * plan's `id`. Only published membership plans match — any other id returns
45
+ * an empty list. Combines with `marketSlug` by intersection, and the roster
46
+ * becomes the whole result set, so `count` describes the members.
47
+ */
48
+ membershipPlanId?: string;
36
49
  /** 1–100. */
37
50
  limit?: number;
38
51
  /**
@@ -118,4 +131,4 @@ type CustomFieldDefinition = Schemas['CustomFieldDefinition'];
118
131
  type CustomFieldType = CustomFieldDefinition['type'];
119
132
  type CustomFieldOption = Schemas['CustomFieldOption'];
120
133
 
121
- export type { SkillLocationSalary as A, SkillLocationsIndex as B, CustomFieldDefinition as C, TitleLocationSalary as D, TitleLocationsIndex as E, LocationSalaryDetail as L, PublicBoard as P, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, CompanyMarket as j, CompanyMarketRef as k, CompanySalarySummary as l, CustomFieldOption as m, CustomFieldType as n, LocationSkillsIndex as o, LocationTitlesIndex as p, PublicBoardAds as q, PublicBoardAnalytics as r, PublicBoardFeatures as s, PublicBoardJobForm as t, PublicCompany as u, PublicCompanyDetail as v, SalaryCompany as w, SalaryLocation as x, SalarySkill as y, SalaryTitle as z };
134
+ export type { SalaryTitle as A, SkillLocationSalary as B, CustomFieldDefinition as C, SkillLocationsIndex as D, TitleLocationSalary as E, TitleLocationsIndex as F, LocationSalaryDetail as L, PublicBoard as P, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, CompanyMarket as j, CompanyMarketRef as k, CompanySalarySummary as l, CustomFieldOption as m, CustomFieldType as n, LocationSkillsIndex as o, LocationTitlesIndex as p, PublicBoardAds as q, PublicBoardAnalytics as r, PublicBoardFeatures as s, PublicBoardJobForm as t, PublicCompany as u, PublicCompanyDetail as v, PublicCompanyMembership as w, SalaryCompany as x, SalaryLocation as y, SalarySkill as z };
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-DyTPJbIZ.js';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-Bwl7pKKg.js';
1
+ import { S as Schemas } from './_spec-CyNKpM_j.mjs';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-CALE3I8I.mjs';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -29,10 +29,23 @@ type CompanyCategorySalary = Schemas['CompanyCategorySalary'];
29
29
  type CompanyListEnvelope = ListEnvelope<PublicCompany> & {
30
30
  relatedSearches?: RelatedSearch[];
31
31
  };
32
+ /**
33
+ * A company's membership on the board, as public identity: the plan's `id`
34
+ * and its current display name. `planId` is the stable key — join it against
35
+ * `board.plans` for price, benefits, and description.
36
+ */
37
+ type PublicCompanyMembership = Schemas['PublicCompanyMembership'];
32
38
  type CompaniesListQuery = {
33
39
  cursor?: string;
34
40
  /** Scope to a single market (sector) by slug. Unknown slugs 404. */
35
41
  marketSlug?: string;
42
+ /**
43
+ * Scope to the companies holding an active membership on this plan, by the
44
+ * plan's `id`. Only published membership plans match — any other id returns
45
+ * an empty list. Combines with `marketSlug` by intersection, and the roster
46
+ * becomes the whole result set, so `count` describes the members.
47
+ */
48
+ membershipPlanId?: string;
36
49
  /** 1–100. */
37
50
  limit?: number;
38
51
  /**
@@ -118,4 +131,4 @@ type CustomFieldDefinition = Schemas['CustomFieldDefinition'];
118
131
  type CustomFieldType = CustomFieldDefinition['type'];
119
132
  type CustomFieldOption = Schemas['CustomFieldOption'];
120
133
 
121
- export type { SkillLocationSalary as A, SkillLocationsIndex as B, CustomFieldDefinition as C, TitleLocationSalary as D, TitleLocationsIndex as E, LocationSalaryDetail as L, PublicBoard as P, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, CompanyMarket as j, CompanyMarketRef as k, CompanySalarySummary as l, CustomFieldOption as m, CustomFieldType as n, LocationSkillsIndex as o, LocationTitlesIndex as p, PublicBoardAds as q, PublicBoardAnalytics as r, PublicBoardFeatures as s, PublicBoardJobForm as t, PublicCompany as u, PublicCompanyDetail as v, SalaryCompany as w, SalaryLocation as x, SalarySkill as y, SalaryTitle as z };
134
+ export type { SalaryTitle as A, SkillLocationSalary as B, CustomFieldDefinition as C, SkillLocationsIndex as D, TitleLocationSalary as E, TitleLocationsIndex as F, LocationSalaryDetail as L, PublicBoard as P, SkillSalaryDetail as S, TitleSalaryDetail as T, CompanyCategorySalary as a, CompanySalary as b, CompaniesListQuery as c, CompanyListEnvelope as d, CompaniesSearchBody as e, CompanyJobsListQuery as f, CompanySimilarQuery as g, CompanyMarketsListQuery as h, SalaryDetailQuery as i, CompanyMarket as j, CompanyMarketRef as k, CompanySalarySummary as l, CustomFieldOption as m, CustomFieldType as n, LocationSkillsIndex as o, LocationTitlesIndex as p, PublicBoardAds as q, PublicBoardAnalytics as r, PublicBoardFeatures as s, PublicBoardJobForm as t, PublicCompany as u, PublicCompanyDetail as v, PublicCompanyMembership as w, SalaryCompany as x, SalaryLocation as y, SalarySkill as z };
@@ -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-CLDHd9N_.mjs';
2
- import { P as PublicJob } from './jobs-Bnx1B6at.mjs';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-mn3GVbrC.mjs';
2
+ import { P as PublicJob } from './jobs-CALE3I8I.mjs';
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-DpDCNMJD.js';
2
- import { P as PublicJob } from './jobs-Bwl7pKKg.js';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-CXNxSlUB.js';
2
+ import { P as PublicJob } from './jobs-CSWXqLZR.js';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any