Developers

API documentation

Every easyboard job board ships with a headless REST API on its own domain: create and publish jobs, read applications and candidates, pull analytics, and build custom frontends. This reference is generated from the same source as the machine-readable spec, so it always matches the live API.

Base URL

Your board's own domain: https://<your-board>.myeasyjobboard.com/api/v1 (or your custom domain). The OpenAPI spec lives at /api/v1/openapi.json, public, importable into Postman, Insomnia, or Swagger UI.

Authentication

Send an API key with every request: Authorization: Bearer ezb_live_... Keys are created under Dashboard, Distribution, API (Advanced and Enterprise plans). Test keys are read-only; any write with one returns 405.

Limits and errors

600 requests per minute per key (429 beyond that). Errors are always JSON: { error: { code, message, fields? } } with a matching HTTP status; validation failures (422) list the offending fields.

Browsers and webhooks

The API is server-to-server by default; allow exact origins on the API settings page for CORS. Pair it with outbound webhooks (job.published, application.received, ...) so your systems react the moment something happens.

New: drive your board from an AI assistant

Beyond REST, every board exposes an MCP server: connect Claude, ChatGPT, or any MCP client and set up, customize, and manage the whole board conversationally, 139 tools covering everything the dashboard does. Find it under Dashboard, Distribution, MCP.

Endpoints

get/meGet current board

200 Board + key info

get/jobsList jobs

Query parameters

pageinteger
perinteger
qstringSearch title + company
statusdraft | published | expired | pending_review | archived
remotetrue | false
work_modeon_site | hybrid | remote
employer_idstring (uuid)
category_idstring (uuid)
job_type_idstring (uuid)

200 OK with jobs (Job[]) + meta (Meta)

post/jobsCreate job

Request body

JobCreate object (JSON).

201 Created

get/jobs/{id}Get job

200 OK

patch/jobs/{id}Update job (partial)

Request body

JobUpdate object (JSON).

200 OK

delete/jobs/{id}Delete job

200 Deleted

post/jobs/{id}/publishPublish job (idempotent)

200 OK

post/jobs/{id}/unpublishUnpublish job back to draft (idempotent)

200 OK

get/applicationsList applications (v1.1)

Query parameters

pageinteger
perinteger
statussubmitted | reviewed | shortlisted | rejected | hired
job_idstring (uuid)

200 OK

get/applications/{id}Get application, with a 10-min pre-signed cv_url (v1.1)

200 OK

get/candidatesList candidates (v1.1)

Query parameters

pageinteger
perinteger
qstringSearch name + email
availabletrue | false

200 OK

get/candidates/{id}Get candidate, with a 10-min pre-signed cv_url (v1.1)

200 OK

get/analytics/jobsPer-job views / apply-clicks / apply-rate (v1.1)

Query parameters

job_idstring (uuid)

200 OK

get/job-alertsList job-alert subscribers (v1.1)

Query parameters

pageinteger
perinteger
statusconfirmed | pending
frequencyinstant | daily | weekly

200 OK

get/job-typesList job types

200 OK

get/categoriesList categories

200 OK

get/tagsList tags

200 OK

get/employersList employers

Query parameters

pageinteger
perinteger
qstringSearch the name

200 OK

post/employersCreate employer

Request body

object (JSON).

201 Created

get/employers/{id}Get employer

200 OK

Objects

The shapes referenced above. Fields marked required apply on create.

Job

FieldTypeNotes
idstring (uuid)
titlestring
statusdraft | published | expired | pending_review | archived
urlstringPublic job page on the board
slugstring
company_namestring
employer_idstring (uuid), nullable
job_type_idstring (uuid), nullable
category_idstring (uuid), nullable
locationstring, nullable
remoteboolean
work_modeon_site | hybrid | remote
remote_regionstring, nullable
descriptionstring, nullableSanitized HTML
apply_modeurl | onboard | email
apply_urlstring, nullable
apply_emailstring, nullable
salary_mininteger, nullable
salary_maxinteger, nullable
salary_currencystring, nullable
salary_periodhourly | daily | weekly | monthly | yearly
tagsstring[]
featuredboolean
pinnedboolean
published_atstring (date-time), nullable
expires_atstring (date-time), nullable
created_atstring (date-time)
updated_atstring (date-time)

JobCreate

Provide employer_id or company_name.

FieldTypeNotes
titlestringRequired.
employer_idstring (uuid), nullableExisting employer id. Alternative: company_name.
company_namestring, nullableEmployer name. Matched case-insensitively, auto-created when missing.
descriptionstring, nullableHTML (sanitized on render)
locationstring, nullable
remoteboolean
work_modeon_site | hybrid | remoteAuthoritative work mode; `remote` is derived from it.
remote_regionstring, nullableRemote requirements, e.g. 'US only'
tagsstring[]
job_type_idstring (uuid), nullable
category_idstring (uuid), nullable
salary_mininteger, nullable
salary_maxinteger, nullable
salary_currencystring, nullable
salary_periodhourly | daily | weekly | monthly | yearly
apply_urlstring, nullableExternal apply URL. Omit for on-board applications.
apply_emailstring, nullableApply-by-email address. Takes precedence over apply_url; omit for other modes.
statusdraft | published
published_atstring (date-time), nullableDefaults to now
expires_in_daysinteger, nullableDays after published_at until expiry; 0 = never. Default 30.
featuredboolean
pinnedboolean

JobUpdate

FieldTypeNotes
titlestring
employer_idstring (uuid), nullableExisting employer id. Alternative: company_name.
company_namestring, nullableEmployer name. Matched case-insensitively, auto-created when missing.
descriptionstring, nullableHTML (sanitized on render)
locationstring, nullable
remoteboolean
work_modeon_site | hybrid | remoteAuthoritative work mode; `remote` is derived from it.
remote_regionstring, nullableRemote requirements, e.g. 'US only'
tagsstring[]
job_type_idstring (uuid), nullable
category_idstring (uuid), nullable
salary_mininteger, nullable
salary_maxinteger, nullable
salary_currencystring, nullable
salary_periodhourly | daily | weekly | monthly | yearly
apply_urlstring, nullableExternal apply URL. Omit for on-board applications.
apply_emailstring, nullableApply-by-email address. Takes precedence over apply_url; omit for other modes.
statusdraft | published
published_atstring (date-time), nullableDefaults to now
expires_in_daysinteger, nullableDays after published_at until expiry; 0 = never. Default 30.
featuredboolean
pinnedboolean

Employer

FieldTypeNotes
idstring (uuid)
namestring
websitestring, nullable
descriptionstring, nullable
activeboolean
featuredboolean
jobs_countinteger
created_atstring (date-time)
updated_atstring (date-time)

Meta

FieldTypeNotes
current_pageinteger
per_pageinteger
total_pagesinteger
total_countinteger

Getting started

The step-by-step guide (create a key, first request, publish a job, CORS) lives in the help center. No board yet? Start a free trial and your API is live the moment your board is.