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
/meGet current board200 Board + key info
/jobsList jobsQuery parameters
| page | integer | |
| per | integer | |
| q | string | Search title + company |
| status | draft | published | expired | pending_review | archived | |
| remote | true | false | |
| work_mode | on_site | hybrid | remote | |
| employer_id | string (uuid) | |
| category_id | string (uuid) | |
| job_type_id | string (uuid) |
/jobs/{id}Get job200 OK
/jobs/{id}Delete job200 Deleted
/jobs/{id}/publishPublish job (idempotent)200 OK
/jobs/{id}/unpublishUnpublish job back to draft (idempotent)200 OK
/applicationsList applications (v1.1)Query parameters
| page | integer | |
| per | integer | |
| status | submitted | reviewed | shortlisted | rejected | hired | |
| job_id | string (uuid) |
200 OK
/applications/{id}Get application, with a 10-min pre-signed cv_url (v1.1)200 OK
/candidatesList candidates (v1.1)Query parameters
| page | integer | |
| per | integer | |
| q | string | Search name + email |
| available | true | false |
200 OK
/candidates/{id}Get candidate, with a 10-min pre-signed cv_url (v1.1)200 OK
/analytics/jobsPer-job views / apply-clicks / apply-rate (v1.1)Query parameters
| job_id | string (uuid) |
200 OK
/job-alertsList job-alert subscribers (v1.1)Query parameters
| page | integer | |
| per | integer | |
| status | confirmed | pending | |
| frequency | instant | daily | weekly |
200 OK
/job-typesList job types200 OK
/categoriesList categories200 OK
/tagsList tags200 OK
/employersList employersQuery parameters
| page | integer | |
| per | integer | |
| q | string | Search the name |
200 OK
/employers/{id}Get employer200 OK
Objects
The shapes referenced above. Fields marked required apply on create.
Job
| Field | Type | Notes |
|---|---|---|
| id | string (uuid) | |
| title | string | |
| status | draft | published | expired | pending_review | archived | |
| url | string | Public job page on the board |
| slug | string | |
| company_name | string | |
| employer_id | string (uuid), nullable | |
| job_type_id | string (uuid), nullable | |
| category_id | string (uuid), nullable | |
| location | string, nullable | |
| remote | boolean | |
| work_mode | on_site | hybrid | remote | |
| remote_region | string, nullable | |
| description | string, nullable | Sanitized HTML |
| apply_mode | url | onboard | email | |
| apply_url | string, nullable | |
| apply_email | string, nullable | |
| salary_min | integer, nullable | |
| salary_max | integer, nullable | |
| salary_currency | string, nullable | |
| salary_period | hourly | daily | weekly | monthly | yearly | |
| tags | string[] | |
| featured | boolean | |
| pinned | boolean | |
| published_at | string (date-time), nullable | |
| expires_at | string (date-time), nullable | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
JobCreate
Provide employer_id or company_name.
| Field | Type | Notes |
|---|---|---|
| title | string | Required. |
| employer_id | string (uuid), nullable | Existing employer id. Alternative: company_name. |
| company_name | string, nullable | Employer name. Matched case-insensitively, auto-created when missing. |
| description | string, nullable | HTML (sanitized on render) |
| location | string, nullable | |
| remote | boolean | |
| work_mode | on_site | hybrid | remote | Authoritative work mode; `remote` is derived from it. |
| remote_region | string, nullable | Remote requirements, e.g. 'US only' |
| tags | string[] | |
| job_type_id | string (uuid), nullable | |
| category_id | string (uuid), nullable | |
| salary_min | integer, nullable | |
| salary_max | integer, nullable | |
| salary_currency | string, nullable | |
| salary_period | hourly | daily | weekly | monthly | yearly | |
| apply_url | string, nullable | External apply URL. Omit for on-board applications. |
| apply_email | string, nullable | Apply-by-email address. Takes precedence over apply_url; omit for other modes. |
| status | draft | published | |
| published_at | string (date-time), nullable | Defaults to now |
| expires_in_days | integer, nullable | Days after published_at until expiry; 0 = never. Default 30. |
| featured | boolean | |
| pinned | boolean |
JobUpdate
| Field | Type | Notes |
|---|---|---|
| title | string | |
| employer_id | string (uuid), nullable | Existing employer id. Alternative: company_name. |
| company_name | string, nullable | Employer name. Matched case-insensitively, auto-created when missing. |
| description | string, nullable | HTML (sanitized on render) |
| location | string, nullable | |
| remote | boolean | |
| work_mode | on_site | hybrid | remote | Authoritative work mode; `remote` is derived from it. |
| remote_region | string, nullable | Remote requirements, e.g. 'US only' |
| tags | string[] | |
| job_type_id | string (uuid), nullable | |
| category_id | string (uuid), nullable | |
| salary_min | integer, nullable | |
| salary_max | integer, nullable | |
| salary_currency | string, nullable | |
| salary_period | hourly | daily | weekly | monthly | yearly | |
| apply_url | string, nullable | External apply URL. Omit for on-board applications. |
| apply_email | string, nullable | Apply-by-email address. Takes precedence over apply_url; omit for other modes. |
| status | draft | published | |
| published_at | string (date-time), nullable | Defaults to now |
| expires_in_days | integer, nullable | Days after published_at until expiry; 0 = never. Default 30. |
| featured | boolean | |
| pinned | boolean |
Employer
| Field | Type | Notes |
|---|---|---|
| id | string (uuid) | |
| name | string | |
| website | string, nullable | |
| description | string, nullable | |
| active | boolean | |
| featured | boolean | |
| jobs_count | integer | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
Meta
| Field | Type | Notes |
|---|---|---|
| current_page | integer | |
| per_page | integer | |
| total_pages | integer | |
| total_count | integer |
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.