Get Jobs

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 with 400.
  • Batches are validated per item. Valid jobs are still created when others fail; the response lists failures in an errors array 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).

FieldTypeRequiredDescription
gj_rolestringYesJob title.
job_descriptionstringYesFull job description. Basic HTML is sanitised on our side.
gj_company_namestringYesHiring organisation name.
gj_logostring (URL)NoURL 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_citystringYesTown or city of the role.
gj_locationstringYesRegion / wider location.
gj_employer_emailstring (email)YesEmployer contact email.
gj_apply_to_emailstring (email)YesEmail applications should be sent to.
gj_websitestring (URL)YesApplication or job URL.
gj_deadlinestring | numberYesClosing date. Accepts an ISO / YYYY-MM-DD date string or a UNIX timestamp (seconds, or milliseconds if ~13 digits).
gj_basisenumYesOne of: office, hybrid, remote.
gj_contractenumYesOne of: permanent, temporary, contract.
gj_hoursenumYesOne of: full-time, part-time, flexible.
gj_paid_voluntaryenumYesOne of: paid, voluntary.
gj_functionstring[]Yes1–5 values from the Function vocabulary (see below).
gj_sectorstring[]Yes1–5 values from the Sector vocabulary (see below).
gj_fundraising_typestring[]NoUp to 5 values from the Fundraising vocabulary (see below).
gj_salary_fixednumberNoFixed annual salary.
gj_salary_fixed_commentsstringNoFree-text note for a fixed salary.
gj_salary_lowernumberNoLower bound of an annual salary range.
gj_salary_uppernumberNoUpper bound of an annual salary range.
gj_salary_range_commentsstringNoFree-text note for a salary range.
gj_salary_hourlynumberNoHourly rate (sets salary type to hourly).
gj_salary_hourly_commentsstringNoFree-text note for an hourly rate.
gj_flexi_hours_minnumberNoMinimum hours for a flexible role.
gj_flexi_hours_maxnumberNoMaximum hours for a flexible role.
gj_flexi_hours_basisstringNoBasis 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

Create a single job (send one object) or many (send an array, up to 200 per request). Each job is validated independently — valid jobs are still created when others fail, and per-item problems come back in an errors array. New jobs start as pending (see Job lifecycle).
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

Return the jobs submitted by your account, newest first.
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}

Fetch one of your own jobs by id. Returns the full job object (the example below is abbreviated). A job that does not exist — or belongs to another account — returns 404 (never 403).
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}

Partially update a job — send only the fields you want to change. The job is reset to pending and re-moderated before it goes live again.
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}

Fully replace a job with a complete, valid payload (same required fields as create). The job is reset to pending and re-moderated.
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}

Permanently delete one of your own jobs.
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: [...] }.

StatusMeaningWhen
200OKSuccessful read or update.
201CreatedAt least one job was created.
400Bad RequestValidation failed, or a batch exceeded 200 jobs. Details in message or errors.
401UnauthorizedMissing, malformed, invalid, or revoked API key.
403ForbiddenThe account's email is not verified. Verify it before submitting jobs.
404Not FoundThe job does not exist or belongs to another account.
429Too Many RequestsPer-key rate limit exceeded (default 100/min).