Job postings
Search job postings, read one with its history and export the results.
At least one filter is required (filter_required). limit 1 to 50, cursor pagination through pagination.next_cursor. groupBy: "company" returns one row per company. Free: does not use the export allowance.
Parameters
400 workspace_required).Response 200
data is a object.
curl -X POST "https://api.ken.so/v1/job-postings/search" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": null
}Export job postings as JSON or CSV
/v1/job-postings/search/exportjob-postings.exportSame filters as search, plus format (json default, or csv) and limit (default 100). The export runs with min(limit, 5000, remaining monthly allowance) rows. The monthly allowance is the workspace's lead limit; exporting does not use lead credits. A larger match set returns 422 export_limit_exceeded with details[0].count and details[0].limit, and uses nothing. Other ken-jobs 422s keep their code and message (filter_required when no filter is set, validation_error when a filter list has more than 100 items) and also use nothing. No allowance left, or rows that no longer fit because another export used them first, returns 402 plan_limit_reached with refusal code JOBS_EXPORT_ROWS_LIMIT_REACHED. Success uses one allowance row per returned row, charged once the whole export is in hand, and sets X-Ken-Row-Count. CSV is a file download. An export larger than 512 MB returns 422 export_too_large and uses nothing. When too many exports are running, returns 503 with Retry-After. The returned rows also count on the workspace's jobsExportRows fair-use quota; past it, 429 quota_exceeded with Retry-After, and nothing is used.
Parameters
400 workspace_required).Response 200
data is a object.
curl -X POST "https://api.ken.so/v1/job-postings/search/export" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": null
}Get the job-postings export allowance for this calendar month
/v1/job-postings/export-allowancejob-postings.get-export-allowanceFree. The allowance is the workspace's lead limit, in rows per calendar month, and resets on the first of each month, UTC. Unlimited when the workspace bypasses limits.
Parameters
400 workspace_required).Response 200
data is a JobPostingsExportAllowanceModel.
curl -X GET "https://api.ken.so/v1/job-postings/export-allowance" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"limit": 1,
"used": 1,
"remaining": 1,
"maxPerExport": 1,
"isUnlimited": true,
"periodStart": "2026-09-23T15:02:11Z",
"periodEnd": "2026-09-23T15:02:11Z"
}
}Get one job posting with its raw source document and revisions
/v1/job-postings/{jobPostingId}job-postings.getFree. Closed postings stay readable.
Parameters
400 workspace_required).Response 200
data is a object.
curl -X GET "https://api.ken.so/v1/job-postings/string" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": null
}Resolve partial company, title and location text for filter autocomplete
/v1/job-postings/filters/resolvejob-postings.resolve-filtersFree. Needs no search filter.
Parameters
400 workspace_required).Response 200
data is a object.
curl -X POST "https://api.ken.so/v1/job-postings/filters/resolve" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": null
}