@cavuno/board 4.41.1 → 4.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/{_spec-DRUEt9M3.d.mts → _spec-CLxrfYJb.d.mts} +33 -0
  3. package/dist/{_spec-DRUEt9M3.d.ts → _spec-CLxrfYJb.d.ts} +33 -0
  4. package/dist/bin.mjs +401 -6
  5. package/dist/{blog-DZejMyq-.d.ts → blog-CQ40QX7l.d.mts} +6 -1
  6. package/dist/{blog-B0oLDN4M.d.mts → blog-mlhJ6UcD.d.ts} +6 -1
  7. package/dist/{board-C-Hz8MMP.d.ts → board-DWFDeICw.d.ts} +2 -2
  8. package/dist/{board-Eusn8R9i.d.mts → board-TOzb2D8c.d.mts} +2 -2
  9. package/dist/{breadcrumbs-nX2svS5_.d.ts → breadcrumbs-DJHyzBji.d.ts} +2 -2
  10. package/dist/{breadcrumbs-BTqDFpGD.d.mts → breadcrumbs-DauM7O7_.d.mts} +2 -2
  11. package/dist/browser/cavuno-board.global.min.js +1 -1
  12. package/dist/{chunk-WSO6JN5C.mjs → chunk-DZD3DAEY.mjs} +2 -0
  13. package/dist/doctor.js +401 -6
  14. package/dist/doctor.mjs +401 -6
  15. package/dist/filters.d.mts +2 -2
  16. package/dist/filters.d.ts +2 -2
  17. package/dist/format.d.mts +4 -4
  18. package/dist/format.d.ts +4 -4
  19. package/dist/index.d.mts +99 -15
  20. package/dist/index.d.ts +99 -15
  21. package/dist/index.js +105 -8
  22. package/dist/index.mjs +104 -9
  23. package/dist/{jobs-B-imggAc.d.mts → jobs-CjQM8EPT.d.mts} +1 -1
  24. package/dist/{jobs-jQwzYyvr.d.ts → jobs-DZVMzBOQ.d.ts} +1 -1
  25. package/dist/{search-C8uy6k8-.d.mts → search-BtBE6iJO.d.mts} +1 -1
  26. package/dist/{search-vXX_s6f5.d.ts → search-CF_wa20h.d.ts} +1 -1
  27. package/dist/{seo-D3AF4q7d.d.mts → seo-0bfk63qi.d.mts} +1 -1
  28. package/dist/{seo-BdNi6Eif.d.ts → seo-CU9LpWH7.d.ts} +1 -1
  29. package/dist/seo-files.d.mts +2 -2
  30. package/dist/seo-files.d.ts +2 -2
  31. package/dist/seo.d.mts +6 -6
  32. package/dist/seo.d.ts +6 -6
  33. package/dist/server.d.mts +6 -6
  34. package/dist/server.d.ts +6 -6
  35. package/dist/server.mjs +1 -1
  36. package/dist/sitemap.d.mts +6 -6
  37. package/dist/sitemap.d.ts +6 -6
  38. package/dist/sitemap.mjs +1 -1
  39. package/dist/suggest.d.mts +2 -2
  40. package/dist/suggest.d.ts +2 -2
  41. package/package.json +1 -1
  42. package/skills/cavuno-board-blog/SKILL.md +7 -3
  43. package/skills/cavuno-board-post-a-job/SKILL.md +2 -1
  44. package/skills/manifest.json +1 -1
package/dist/index.mjs CHANGED
@@ -25,7 +25,7 @@ import {
25
25
  isSsoRequired,
26
26
  isUnauthorized,
27
27
  isValidationError
28
- } from "./chunk-WSO6JN5C.mjs";
28
+ } from "./chunk-DZD3DAEY.mjs";
29
29
 
30
30
  // src/query.ts
31
31
  function toSearchParams(query) {
@@ -46,7 +46,7 @@ function toSearchParams(query) {
46
46
  }
47
47
 
48
48
  // src/version.ts
49
- var SDK_VERSION = "4.41.1";
49
+ var SDK_VERSION = "4.44.0";
50
50
 
51
51
  // src/client.ts
52
52
  function isRawBody(body) {
@@ -989,7 +989,11 @@ function jobPostingNamespace(client) {
989
989
  { ...options, method: "POST", body: input }
990
990
  );
991
991
  },
992
- /** List the credit options for a verified email (an option → `selectedBilling`). */
992
+ /**
993
+ * List the credit options for a verified email. To spend one, pass the
994
+ * option as `selectedBilling` and the same `verificationToken` as
995
+ * `billingVerificationToken` to `create`.
996
+ */
993
997
  getBillingOptions(input, options) {
994
998
  return client.fetch(
995
999
  "/job-postings/billing-options",
@@ -2129,9 +2133,12 @@ function meNamespace(client) {
2129
2133
  }
2130
2134
  },
2131
2135
  /**
2132
- * Company-owned saved predicates over the talent directory.
2133
- * Approved members share the same lists. Optional `job` binds a list
2134
- * to one company job; pass `job: null` on update to unbind.
2136
+ * Company-owned saved searches over the talent directory. Each holds
2137
+ * named filters and, optionally, saved people (`members`). Approved
2138
+ * members share the same lists. Optional `job` links a list to one
2139
+ * company job; pass `job: null` on update to unlink. Linking a list
2140
+ * shortlists everyone saved to it onto that job; unlinking changes no
2141
+ * pipeline.
2135
2142
  */
2136
2143
  talentLists: {
2137
2144
  /**
@@ -2173,7 +2180,10 @@ function meNamespace(client) {
2173
2180
  { ...options, method: "PATCH", body }
2174
2181
  );
2175
2182
  },
2176
- /** Delete a talent list. Sourced membership is unaffected. */
2183
+ /**
2184
+ * Delete a talent list and the people saved to it. Job pipelines and
2185
+ * sourced membership are unaffected.
2186
+ */
2177
2187
  remove(slug, listId, options) {
2178
2188
  return client.fetch(
2179
2189
  `/me/companies/${encodeURIComponent(
@@ -2181,6 +2191,90 @@ function meNamespace(client) {
2181
2191
  )}/talent-lists/${encodeURIComponent(listId)}`,
2182
2192
  { ...options, method: "DELETE" }
2183
2193
  );
2194
+ },
2195
+ /**
2196
+ * The talent lists of a company one candidate is saved to — for
2197
+ * showing which lists a Save control has ticked.
2198
+ *
2199
+ * @example
2200
+ * const { data } = await board.me.companies.talentLists.memberships(
2201
+ * 'acme',
2202
+ * { candidate: candidateId },
2203
+ * );
2204
+ * const saved = new Set(data.map((m) => m.listId));
2205
+ */
2206
+ memberships(slug, query, options) {
2207
+ return client.fetch(
2208
+ `/me/companies/${encodeURIComponent(slug)}/talent-list-memberships`,
2209
+ { ...options, query }
2210
+ );
2211
+ },
2212
+ /**
2213
+ * People saved to a talent list (at most 500 per list).
2214
+ */
2215
+ members: {
2216
+ /**
2217
+ * List the people saved to a list as directory cards, most
2218
+ * recently saved first unless `sort` or a keyword (`q`) is set;
2219
+ * with a keyword, best match first. Cards are redacted as in the
2220
+ * public directory when the board sells profile unlocks, except
2221
+ * for candidates the company has unlocked. Runs the public
2222
+ * talent directory search, with the same filters, restricted to
2223
+ * the saved people, so a "Saved" view can combine with the
2224
+ * list's filters. Blocked, hidden and deactivated
2225
+ * candidates are omitted. `total` counts every visible saved
2226
+ * person; `count` counts the ones the filters keep.
2227
+ *
2228
+ * @example
2229
+ * const { data, total } =
2230
+ * await board.me.companies.talentLists.members.list(
2231
+ * 'acme',
2232
+ * listId,
2233
+ * { skill: 'react' },
2234
+ * );
2235
+ */
2236
+ list(slug, listId, query, options) {
2237
+ return client.fetch(
2238
+ `/me/companies/${encodeURIComponent(
2239
+ slug
2240
+ )}/talent-lists/${encodeURIComponent(listId)}/members`,
2241
+ { ...options, query }
2242
+ );
2243
+ },
2244
+ /**
2245
+ * Save a candidate to a list. Idempotent: saving someone already
2246
+ * on it returns `created: false`. When the list is linked to a
2247
+ * job, the candidate is also shortlisted onto that job unless they
2248
+ * already have a pipeline row there. A full list raises
2249
+ * `talent_list_full` (409).
2250
+ *
2251
+ * @example
2252
+ * await board.me.companies.talentLists.members.add('acme', listId, {
2253
+ * candidateBoardUserId: candidateId,
2254
+ * });
2255
+ */
2256
+ add(slug, listId, body, options) {
2257
+ return client.fetch(
2258
+ `/me/companies/${encodeURIComponent(
2259
+ slug
2260
+ )}/talent-lists/${encodeURIComponent(listId)}/members`,
2261
+ { ...options, method: "POST", body }
2262
+ );
2263
+ },
2264
+ /**
2265
+ * Remove a candidate from a list. Idempotent. Never changes a job
2266
+ * pipeline, including the linked job's.
2267
+ */
2268
+ remove(slug, listId, candidateBoardUserId, options) {
2269
+ return client.fetch(
2270
+ `/me/companies/${encodeURIComponent(
2271
+ slug
2272
+ )}/talent-lists/${encodeURIComponent(
2273
+ listId
2274
+ )}/members/${encodeURIComponent(candidateBoardUserId)}`,
2275
+ { ...options, method: "DELETE" }
2276
+ );
2277
+ }
2184
2278
  }
2185
2279
  },
2186
2280
  /**
@@ -3396,9 +3490,10 @@ function sitemapNamespace(client) {
3396
3490
  function talentNamespace(client) {
3397
3491
  return {
3398
3492
  /**
3399
- * List the board's public talent directory — candidate cards ranked by
3493
+ * List the board's talent directory — candidate cards ranked by
3400
3494
  * job-search status then most-recently-updated, the same ordering the
3401
- * hosted `/talent` page renders. Only `public` profiles appear.
3495
+ * hosted `/talent` page renders. Anonymous callers see `public` profiles;
3496
+ * a signed-in board user also sees `logged_in_only` ones.
3402
3497
  *
3403
3498
  * Throws `talent_directory_restricted` (403) when the board restricts the
3404
3499
  * directory to employers (render an employer upsell), or
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DRUEt9M3.mjs';
1
+ import { S as Schemas } from './_spec-CLxrfYJb.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-DRUEt9M3.js';
1
+ import { S as Schemas } from './_spec-CLxrfYJb.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-DRUEt9M3.mjs';
1
+ import { S as Schemas } from './_spec-CLxrfYJb.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DRUEt9M3.js';
1
+ import { S as Schemas } from './_spec-CLxrfYJb.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DRUEt9M3.mjs';
1
+ import { S as Schemas } from './_spec-CLxrfYJb.mjs';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-DRUEt9M3.js';
1
+ import { S as Schemas } from './_spec-CLxrfYJb.js';
2
2
 
3
3
  /**
4
4
  * The public SEO-infra payload (`board.seo()`) — platform infrastructure a
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-D3AF4q7d.mjs';
2
- import './_spec-DRUEt9M3.mjs';
1
+ import { B as BoardSeo } from './seo-0bfk63qi.mjs';
2
+ import './_spec-CLxrfYJb.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
@@ -1,5 +1,5 @@
1
- import { B as BoardSeo } from './seo-BdNi6Eif.js';
2
- import './_spec-DRUEt9M3.js';
1
+ import { B as BoardSeo } from './seo-CU9LpWH7.js';
2
+ import './_spec-CLxrfYJb.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/seo-files` — platform-owned crawler/identity file bodies
package/dist/seo.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-B0oLDN4M.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-BTqDFpGD.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-BTqDFpGD.mjs';
4
- import './_spec-DRUEt9M3.mjs';
5
- import './board-Eusn8R9i.mjs';
6
- import './jobs-B-imggAc.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-CQ40QX7l.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-DauM7O7_.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-DauM7O7_.mjs';
4
+ import './_spec-CLxrfYJb.mjs';
5
+ import './board-TOzb2D8c.mjs';
6
+ import './jobs-CjQM8EPT.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-DZejMyq-.js';
2
- import { e as JsonLdObject } from './breadcrumbs-nX2svS5_.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-nX2svS5_.js';
4
- import './_spec-DRUEt9M3.js';
5
- import './board-C-Hz8MMP.js';
6
- import './jobs-jQwzYyvr.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-mlhJ6UcD.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-DJHyzBji.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-DJHyzBji.js';
4
+ import './_spec-CLxrfYJb.js';
5
+ import './board-DWFDeICw.js';
6
+ import './jobs-DZVMzBOQ.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,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-DRUEt9M3.mjs';
3
- import './search-C8uy6k8-.mjs';
4
- import './board-Eusn8R9i.mjs';
5
- import './jobs-B-imggAc.mjs';
6
- import './seo-D3AF4q7d.mjs';
7
- import './blog-B0oLDN4M.mjs';
2
+ import './_spec-CLxrfYJb.mjs';
3
+ import './search-BtBE6iJO.mjs';
4
+ import './jobs-CjQM8EPT.mjs';
5
+ import './board-TOzb2D8c.mjs';
6
+ import './seo-0bfk63qi.mjs';
7
+ import './blog-CQ40QX7l.mjs';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-DRUEt9M3.js';
3
- import './search-vXX_s6f5.js';
4
- import './board-C-Hz8MMP.js';
5
- import './jobs-jQwzYyvr.js';
6
- import './seo-BdNi6Eif.js';
7
- import './blog-DZejMyq-.js';
2
+ import './_spec-CLxrfYJb.js';
3
+ import './search-CF_wa20h.js';
4
+ import './jobs-DZVMzBOQ.js';
5
+ import './board-DWFDeICw.js';
6
+ import './seo-CU9LpWH7.js';
7
+ import './blog-mlhJ6UcD.js';
8
8
 
9
9
  /**
10
10
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.mjs CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-Z4ALWIGS.mjs";
5
5
  import {
6
6
  isUnauthorized
7
- } from "./chunk-WSO6JN5C.mjs";
7
+ } from "./chunk-DZD3DAEY.mjs";
8
8
 
9
9
  // src/server/cookie.ts
10
10
  var COOKIE_ATTRIBUTES = "Path=/; HttpOnly; Secure; SameSite=Lax";
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-DRUEt9M3.mjs';
3
- import './search-C8uy6k8-.mjs';
4
- import './board-Eusn8R9i.mjs';
5
- import './jobs-B-imggAc.mjs';
6
- import './seo-D3AF4q7d.mjs';
7
- import './blog-B0oLDN4M.mjs';
2
+ import './_spec-CLxrfYJb.mjs';
3
+ import './search-BtBE6iJO.mjs';
4
+ import './jobs-CjQM8EPT.mjs';
5
+ import './board-TOzb2D8c.mjs';
6
+ import './seo-0bfk63qi.mjs';
7
+ import './blog-CQ40QX7l.mjs';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-DRUEt9M3.js';
3
- import './search-vXX_s6f5.js';
4
- import './board-C-Hz8MMP.js';
5
- import './jobs-jQwzYyvr.js';
6
- import './seo-BdNi6Eif.js';
7
- import './blog-DZejMyq-.js';
2
+ import './_spec-CLxrfYJb.js';
3
+ import './search-CF_wa20h.js';
4
+ import './jobs-DZVMzBOQ.js';
5
+ import './board-DWFDeICw.js';
6
+ import './seo-CU9LpWH7.js';
7
+ import './blog-mlhJ6UcD.js';
8
8
 
9
9
  /**
10
10
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.mjs CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-DLSO6XXY.mjs";
4
4
  import {
5
5
  isNotFound
6
- } from "./chunk-WSO6JN5C.mjs";
6
+ } from "./chunk-DZD3DAEY.mjs";
7
7
  import {
8
8
  BOARD_PATHS,
9
9
  blogAuthorPath,
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-C8uy6k8-.mjs';
2
- import './_spec-DRUEt9M3.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-BtBE6iJO.mjs';
2
+ import './_spec-CLxrfYJb.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-vXX_s6f5.js';
2
- import './_spec-DRUEt9M3.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-CF_wa20h.js';
2
+ import './_spec-CLxrfYJb.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.41.1",
3
+ "version": "4.44.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -13,9 +13,11 @@ The host app owns authoring, feeds, sitemaps, and OG-image routes.
13
13
  ## Build archives
14
14
 
15
15
  `blog.posts.list` returns `ListEnvelope<PublicBlogPostSummary>`. Its query
16
- accepts `limit` (1–100), `cursor`, `tagSlug`, `authorSlug`, and
17
- `featured: 'true'`. `featured` is the string literal. Blog lists use cursor
18
- pagination and expose neither `offset` nor total `count`.
16
+ accepts `limit` (1–100), `cursor`, `tagSlug`, `authorSlug`,
17
+ `featured: 'true'`, and `sort` (`'newest'` default, or `'featured'` for
18
+ featured posts first, then the rest, as one list). `featured` is the string
19
+ literal. Blog lists use cursor pagination and expose neither `offset` nor total
20
+ `count`; a cursor only continues the list it came from.
19
21
 
20
22
  ```ts snippet
21
23
  const page = await board.blog.posts.list({ tagSlug: 'news', limit: 12 });
@@ -109,6 +111,8 @@ Finish only after every applicable check passes:
109
111
  `html`.
110
112
  - A retrieved old slug redirects to `newSlug` before rendering.
111
113
  - Featured archives send the exact string `featured: 'true'`.
114
+ - Archives that put featured posts on top use `sort: 'featured'`, not a
115
+ separate featured call merged in front of page one.
112
116
  - Cursor paging reaches `nextCursor: null` without relying on count or offset.
113
117
  - Newest and oldest posts handle the null side of `adjacent`.
114
118
 
@@ -168,7 +168,7 @@ The checkout value is a URL for a host-owned full-page redirect. Payment publica
168
168
 
169
169
  ## Verified existing credit
170
170
 
171
- Email verification protects billing ownership. Send verification first, then exchange the token for options; a selected option becomes `selectedBilling`.
171
+ Email verification protects billing ownership. Send verification first, then exchange the token for options; a selected option becomes `selectedBilling`, and the same token goes with it as `billingVerificationToken`. The token expires after an hour; verify again if it has.
172
172
 
173
173
  ```ts snippet
174
174
  await board.jobPosting.sendBillingVerification({ email });
@@ -190,6 +190,7 @@ if (option) {
190
190
  id: option.id,
191
191
  planId: option.planId,
192
192
  },
193
+ billingVerificationToken: verificationToken,
193
194
  });
194
195
  }
195
196
  ```
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.41.1",
2
+ "version": "4.44.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",