Job Posting API

Submit job postings and retrieve plans programmatically via the Board API or the TypeScript SDK.

Job posting endpoints are part of the Board API (/v1/boards/:identifier/job-postings/*) and require no authentication. The :identifier is your board slug, board ID (boards_…), or a publishable key (pk_…).

List plans

  1. GET /v1/boards/:identifier/job-postings/plans — list the board's public job-posting plans

The response is a paginated list of JobPostingPlan objects. Pass ?purpose=job_posting (default) or ?purpose=talent_access to filter by plan type. Use the plan id as selectedPlan when submitting a job.

Submit a job posting

  1. POST /v1/boards/:identifier/job-postings — submit a job through the board's public funnel

The server selects the billing flow based on the employer's entitlements and the chosen plan: free, bundle credit, subscription credit, Stripe Checkout, or invoice. The response is a status-discriminated job_posting_result object — branch on .status:

  • published — job is live
  • pending_approval — job is queued for moderation
  • checkout — redirect the employer to .checkoutUrl to complete payment
  • invoice_sent — an invoice has been emailed; no redirect needed

Use the TypeScript SDK

Import createBoardClient from @cavuno/board:

ts
import { createBoardClient } from '@cavuno/board';
const board = createBoardClient({ baseUrl: 'https://api.cavuno.com', board: 'pk_a8f3…' });
const { data: plans } = await board.jobPosting.plans();
const selectedPlan = plans[0].id;
const result = await board.jobPosting.create({
submission: { selectedPlan, title: 'Senior Engineer', companyName: 'Acme' },
});
if (result.status === 'checkout') {
window.location.href = result.checkoutUrl;
}

The client exposes plans and create on board.jobPosting. A rejected submission throws a BoardApiError.