Headless Board API

Public Board API endpoints and the @cavuno/board SDK for building a custom job-posting flow on a headless board.

The Board API endpoints under /v1/boards/:identifier/ require no authentication and are designed for headless boards that implement their own posting UI. The :identifier is your board slug.

List job-posting plans

text
GET /v1/boards/:identifier/job-postings/plans

Returns the board's available plans. Pass the chosen plan's id as selectedPlan when submitting a job.

Submit a job posting

text
POST /v1/boards/:identifier/job-postings

Creates the job and returns a status-discriminated result. Branch on .status: checkout (redirect to .checkoutUrl), published, pending_approval, or invoice_sent.

Check billing status

text
POST /v1/boards/:identifier/job-postings/check-billing

Body: { email }. Returns { hasActiveBilling } — whether this email already has billing credit on the board.

Send a billing-verification token

text
POST /v1/boards/:identifier/job-postings/send-verification

Body: { email }. Sends a verification token to the address. Pass the token to the billing-options endpoint.

Get billing options

text
POST /v1/boards/:identifier/job-postings/billing-options

Body: { verificationToken }. Returns the credit options for the verified email. Use one option as selectedBilling in the job submission.

Check subscription entitlements

text
POST /v1/boards/:identifier/job-postings/subscription-entitlements

Body: { email, planId }. Returns the featured slots and active entitlements the email's subscription grants for the given plan.

Use the @cavuno/board SDK

Install @cavuno/board and call the board.jobPosting namespace:

ts
import { createBoardClient } from '@cavuno/board';
const board = createBoardClient({ identifier: 'my-board' });
const { hasActiveBilling } = await board.jobPosting.checkBilling({ email });
await board.jobPosting.sendBillingVerification({ email });
const options = await board.jobPosting.getBillingOptions({ verificationToken });
const entitlements = await board.jobPosting.checkSubscriptionEntitlements({ email, planId });

The namespace also exposes plans() and create(input) for the full posting flow. See the API reference for request and response schemas.