Get Jobs API
Submit and manage charity job listings programmatically. The API is a simple JSON-over-HTTPS interface: authenticate with your API key, send jobs, and manage them with standard REST verbs.
All requests go to the base URL:
https://getjobs.org.uk/wp-json/getjobs/v1
Throughout these docs, YOUR_API_KEY stands in for your real key — never share or commit your actual key. Note that newly submitted jobs are moderated before they appear publicly (see Job lifecycle).
Authentication
Every request must include your secret key in the X-API-Key header. Account keys look like gjk_3f9a1c2b.…32 hex chars….
- Generate, regenerate, or revoke your key from your dashboard at /employer/api-key. A key is shown in full only once — store it securely.
- A revoked key returns
401. Generate a new one to resume access. - Never expose your secret key in client-side code or public repositories.
curl -X GET https://getjobs.org.uk/wp-json/getjobs/v1/jobs \-H "X-API-Key: YOUR_API_KEY"
Quickstart
Create your first job in under a minute. Grab your key from the dashboard, then send a single job object:
curl -X POST https://getjobs.org.uk/wp-json/getjobs/v1/jobs \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"gj_role": "Fundraising Manager","job_description": "Lead our individual giving programme...","gj_company_name": "Hope Trust","gj_town_city": "Bristol","gj_location": "South West England","gj_employer_email": "jobs@hopetrust.org","gj_apply_to_email": "apply@hopetrust.org","gj_website": "https://hopetrust.org/jobs/fundraising-manager","gj_deadline": "2026-08-01","gj_basis": "hybrid","gj_contract": "permanent","gj_hours": "full-time","gj_paid_voluntary": "paid","gj_function": ["Fundraising"],"gj_sector": ["Poverty Relief"]}'
You'll get back a 201 with the new job's id. The job starts as pending and goes through moderation before it appears publicly (see Job lifecycle). Check its status any time with GET /jobs.
Rate limits & batching
- Each key is limited to 100 requests per minute by default. Exceeding it returns
429. - Batch create: send an array of up to 200 jobs to
POST /jobs. A batch over 200 is rejected with400. - Batches are validated per item. Valid jobs are still created when others fail; the response lists failures in an
errorsarray as{ index, errors }.
The Job object
Jobs use the gj_* field names below. Required fields must be present on create (POST) and full replace (PUT).
| Field | Type | Required | Description |
|---|---|---|---|
| gj_role | string | Yes | Job title. |
| job_description | string | Yes | Full job description. Basic HTML is sanitised on our side. |
| gj_company_name | string | Yes | Hiring organisation name. |
| gj_logo | string (URL) | No | URL of the hiring organisation's logo. We fetch the image and re-host it on Get Jobs (PNG, JPEG, WebP or SVG; max 5MB) — your URL is not hot-linked. If it can't be fetched the job still posts, without a logo. |
| gj_town_city | string | Yes | Town or city of the role. |
| gj_location | string | Yes | Region / wider location. |
| gj_employer_email | string (email) | Yes | Employer contact email. |
| gj_apply_to_email | string (email) | Yes | Email applications should be sent to. |
| gj_website | string (URL) | Yes | Application or job URL. |
| gj_deadline | string | number | Yes | Closing date. Accepts an ISO / YYYY-MM-DD date string or a UNIX timestamp (seconds, or milliseconds if ~13 digits). |
| gj_basis | enum | Yes | One of: office, hybrid, remote. |
| gj_contract | enum | Yes | One of: permanent, temporary, contract. |
| gj_hours | enum | Yes | One of: full-time, part-time, flexible. |
| gj_paid_voluntary | enum | Yes | One of: paid, voluntary. |
| gj_function | string[] | Yes | 1–5 values from the Function vocabulary (see below). |
| gj_sector | string[] | Yes | 1–5 values from the Sector vocabulary (see below). |
| gj_fundraising_type | string[] | No | Up to 5 values from the Fundraising vocabulary (see below). |
| gj_salary_fixed | number | No | Fixed annual salary. |
| gj_salary_fixed_comments | string | No | Free-text note for a fixed salary. |
| gj_salary_lower | number | No | Lower bound of an annual salary range. |
| gj_salary_upper | number | No | Upper bound of an annual salary range. |
| gj_salary_range_comments | string | No | Free-text note for a salary range. |
| gj_salary_hourly | number | No | Hourly rate (sets salary type to hourly). |
| gj_salary_hourly_comments | string | No | Free-text note for an hourly rate. |
| gj_flexi_hours_min | number | No | Minimum hours for a flexible role. |
| gj_flexi_hours_max | number | No | Maximum hours for a flexible role. |
| gj_flexi_hours_basis | string | No | Basis description for flexible hours (e.g. per week). |
gj_function, gj_sector and gj_fundraising_type each take up to five values from these controlled vocabularies. gj_function and gj_sector are required (at least one); gj_fundraising_type is optional.
Function
Administration ·Business Development ·Campaigning ·Education ·Finance & Legal ·Fundraising ·Graduate & Trainee ·Grantmaking ·Human Resources ·International Development ·IT & Web Development ·Marketing ·Operations & Service Delivery ·Policy & Research ·PR & Communications ·Senior Management ·Training ·Trustees ·Volunteer Recruitment & Management
Sector
Animals ·Advocacy ·Arts & Culture ·Charity Support ·Children & Youth ·Community Development ·Crime & Justice ·Disability ·Diversity & Inclusion ·Education ·Elderly ·Environment & Conservation ·Faith ·Health ·Housing & Homelessness ·Human Rights ·International Development ·Poverty Relief ·Social Care & Welfare ·Sport & Physical Activity
Fundraising type
Community ·Corporate ·Digital ·Events ·Individual Giving ·Legacy ·Major Donor ·Statutory ·Trusts & Foundations
Endpoints
Create job(s)
POST/jobs
curl -X POST https://getjobs.org.uk/wp-json/getjobs/v1/jobs \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"gj_role": "Fundraising Manager","job_description": "Lead our individual giving programme...","gj_company_name": "Hope Trust","gj_logo": "https://hopetrust.org/logo.png","gj_town_city": "Bristol","gj_location": "South West England","gj_employer_email": "jobs@hopetrust.org","gj_apply_to_email": "apply@hopetrust.org","gj_website": "https://hopetrust.org/jobs/fundraising-manager","gj_deadline": "2026-08-01","gj_basis": "hybrid","gj_contract": "permanent","gj_hours": "full-time","gj_paid_voluntary": "paid","gj_function": ["Fundraising"],"gj_sector": ["Poverty Relief"],"gj_salary_lower": 32000,"gj_salary_upper": 38000}'
Response
{"success": true,"jobs": [{"id": 1432,"status": "created"}]}
List your jobs
GET/jobs
curl -X GET https://getjobs.org.uk/wp-json/getjobs/v1/jobs \-H "X-API-Key: YOUR_API_KEY"
Response
{"success": true,"jobs": [{"id": 1432,"slug": "fundraising-manager","title": "Fundraising Manager","status": "live","createdAt": "2026-06-07T10:15:00.000Z"}]}
Retrieve a job
GET/jobs/{id}
curl -X GET https://getjobs.org.uk/wp-json/getjobs/v1/jobs/1432 \-H "X-API-Key: YOUR_API_KEY"
Response
{"success": true,"job": {"id": 1432,"title": "Fundraising Manager","status": "live"}}
Update a job
PATCH/jobs/{id}
curl -X PATCH https://getjobs.org.uk/wp-json/getjobs/v1/jobs/1432 \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"gj_deadline": "2026-09-01"}'
Response
{"success": true,"id": 1432,"status": "updated"}
Replace a job
PUT/jobs/{id}
curl -X PUT https://getjobs.org.uk/wp-json/getjobs/v1/jobs/1432 \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"gj_role": "Fundraising Manager","job_description": "Lead our individual giving programme...","gj_company_name": "Hope Trust","gj_logo": "https://hopetrust.org/logo.png","gj_town_city": "Bristol","gj_location": "South West England","gj_employer_email": "jobs@hopetrust.org","gj_apply_to_email": "apply@hopetrust.org","gj_website": "https://hopetrust.org/jobs/fundraising-manager","gj_deadline": "2026-08-01","gj_basis": "hybrid","gj_contract": "permanent","gj_hours": "full-time","gj_paid_voluntary": "paid","gj_function": ["Fundraising"],"gj_sector": ["Poverty Relief"],"gj_salary_lower": 32000,"gj_salary_upper": 38000}'
Response
{"success": true,"id": 1432,"status": "updated"}
Delete a job
DELETE/jobs/{id}
curl -X DELETE https://getjobs.org.uk/wp-json/getjobs/v1/jobs/1432 \-H "X-API-Key: YOUR_API_KEY"
Response
{"success": true,"id": 1432,"status": "deleted"}
Job lifecycle & moderation
Jobs are not instantly live. When you create a job it is stored as pending and your request returns immediately. Moderation runs asynchronously in the background, and an approved job flips to live a short time later (typically within a moderation cycle of tens of seconds). If a job isn't visible the instant you create it, that's expected — not an error.
The status flow is pending → live → expired. A job expires automatically once its gj_deadline passes. Editing a job with PATCH or PUT resets it to pending so the change is re-moderated before going live again.
You can only read or modify your own jobs. A job that doesn't exist — or belongs to another account — always returns 404, never 403, so account boundaries stay private.
Errors
Errors use standard HTTP status codes and a JSON body of { success: false, message } or, for validation failures, { success: false, errors: [...] }.
| Status | Meaning | When |
|---|---|---|
| 200 | OK | Successful read or update. |
| 201 | Created | At least one job was created. |
| 400 | Bad Request | Validation failed, or a batch exceeded 200 jobs. Details in message or errors. |
| 401 | Unauthorized | Missing, malformed, invalid, or revoked API key. |
| 403 | Forbidden | The account's email is not verified. Verify it before submitting jobs. |
| 404 | Not Found | The job does not exist or belongs to another account. |
| 429 | Too Many Requests | Per-key rate limit exceeded (default 100/min). |