Skip to content

Jobs

Discover open positions at companies that have granted your partner key access.

GET /api/v1/external/jobs

Query parameters

ParameterTypeRequiredDescription
updated_sinceISO-8601NoReturn jobs updated after this timestamp
cursorstringNoOpaque cursor from a previous response
limitintegerNoPage size. Default 50, max 200 (clamped)
company_idstringNoFilter to one company (e.g. co_67)
statusstringNoOnly open is supported in v1

Response (200 OK)

json
{
  "data": [
    {
      "id": "job_12345",
      "title": "Janitor",
      "company": {
        "id": "co_67",
        "name": "Acme Cleaning"
      },
      "location": {
        "city": "Tampa",
        "state": "FL",
        "country": "US"
      },
      "compensation": {
        "type": "hourly",
        "min": 18,
        "max": 22,
        "currency": "USD"
      },
      "schedule": "full_time",
      "status": "open",
      "headcount": {
        "total": null,
        "filled": 2
      },
      "createdAt": "2026-05-20T14:00:00Z",
      "updatedAt": "2026-05-22T09:30:00Z",
      "applicationFormSchema": [
        {
          "key": "drivers_license",
          "label": "Do you have a valid driver's license?",
          "type": "boolean",
          "required": true
        }
      ]
    }
  ],
  "next_cursor": "eyJsYXN0VXBkYXRlZEF0IjoiMjAyNi0wNS0yMlQwOTozMDowMFoiLCJsYXN0SWQiOjEyMzQ1fQ=="
}

When there are no more pages, next_cursor is absent (not null).

Field descriptions

FieldDescription
idStable job identifier (prefix job_)
titleJob title as configured by the employer
company.idCompany identifier (prefix co_)
company.nameCompany display name
locationCity, state, country
compensationPay range. type is always hourly in v1. min/max may be null
scheduleEmployment type (e.g. full_time, part_time, contract) — may be null
statusAlways open (only visible jobs are returned)
headcount.totalTarget number of hires (null if not set)
headcount.filledCurrent number of hired candidates
applicationFormSchemaPer-job custom questions. Your POST /applications can include answers keyed by these key values
createdAtWhen the job was created
updatedAtLast modification timestamp

Pagination

See Pagination for full cursor semantics.

Authorization

Only jobs at companies where your key has active access are returned. Filtering by a company_id you don't have access to returns an empty data array (no error, no information leakage).

Examples

bash
curl -X GET "https://api.employjoy.ai/api/v1/external/jobs?limit=10&updated_since=2026-05-20T00:00:00Z" \
  -H "Authorization: Bearer YOUR_API_KEY_HERE"
javascript
const url = new URL('https://api.employjoy.ai/api/v1/external/jobs');
url.searchParams.set('limit', '10');
url.searchParams.set('updated_since', '2026-05-20T00:00:00Z');

const res = await fetch(url, {
  headers: { 'Authorization': 'Bearer YOUR_API_KEY_HERE' },
});
const { data, next_cursor } = await res.json();

// Paginate
if (next_cursor) {
  url.searchParams.set('cursor', next_cursor);
  const nextPage = await fetch(url, {
    headers: { 'Authorization': 'Bearer YOUR_API_KEY_HERE' },
  });
}
python
import requests

params = {'limit': 10, 'updated_since': '2026-05-20T00:00:00Z'}
headers = {'Authorization': 'Bearer YOUR_API_KEY_HERE'}

response = requests.get(
    'https://api.employjoy.ai/api/v1/external/jobs',
    params=params, headers=headers,
)
result = response.json()
jobs = result['data']

# Paginate
while 'next_cursor' in result:
    params['cursor'] = result['next_cursor']
    response = requests.get(
        'https://api.employjoy.ai/api/v1/external/jobs',
        params=params, headers=headers,
    )
    result = response.json()
    jobs.extend(result['data'])

Partner API v1