Bluewatch — jobs that answer the call

Developer API

Build on the same feed that powers Bluewatch.

A free, read-only JSON API of live UK firefighter recruitment. No auth, no rate limits, no account. Cached at the edge so it’s fast and stable. Build dashboards, mobile apps, Slack bots, custom widgets — whatever you like.

Base URL

https://bluewatch.app/api/v1

Versioned. v1 is stable. Breaking changes ship under v2; v1 stays online.

Endpoints

GET/api/v1/opportunities

List live recruitment opportunities. Most-recent first. Paginated.

https://bluewatch.app/api/v1/opportunities?role=wholetime&region=north-west&limit=10
GET/api/v1/opportunities/{slug}

Single opportunity by slug. Slugs are stable once issued.

https://bluewatch.app/api/v1/opportunities/{opportunity-slug}
GET/api/v1/services

List services (fire and rescue services, airport ARFF units, defence fire teams, industrial fire teams, overseas employers).

https://bluewatch.app/api/v1/services?category=airport_arff
GET/api/v1/services/{slug}

Single service by slug. Use the slug from /jobs/fire/{slug} URLs.

https://bluewatch.app/api/v1/services/london-fire-brigade
GET/api/v1/meta

Counts and the latest opportunity timestamp. Cheap to poll for change detection.

https://bluewatch.app/api/v1/meta

Query parameters

/api/v1/opportunities

ParamValues
service_typefire (default), police, medicOnly fire is currently active.
serviceA service sluge.g. london-fire-brigade — see /api/v1/services
rolewholetime, on_call, transferee, control, specialist, officer, cadet, volunteer, operational_hq
regionnorth-east, north-west, yorkshire-and-humber, east-midlands, west-midlands, east-of-england, london, south-east, south-west, scotland, wales, northern-irelandUK region — Wales rolls up the three Welsh services.
categorylocal_authority_frs, airport_arff, defence_fire, industrial, private_contractor, overseas_transfer, otherService category.
sinceISO 8601 timestampOnly return opportunities first seen at or after this time.
limit1–200Default 50.
offset0+For pagination. Default 0.

/api/v1/services

ParamValues
service_typefire (default)
categorylocal_authority_frs, airport_arff, defence_fire, industrial, private_contractor, overseas_transfer, other
regionnorth-east, north-west, yorkshire-and-humber, east-midlands, west-midlands, east-of-england, london, south-east, south-west, scotland, wales, northern-ireland
limit1–200Default 50.
offset0+

Response shape

All endpoints return JSON. Lists are wrapped in { data, meta, links }; details in { data }.

Opportunity

{
  "service_type": "fire",
  "service_slug": "london-fire-brigade",
  "service_name": "London Fire Brigade",
  "service_short_name": "LFB",
  "service_region": "London",
  "service_category": "local_authority_frs",
  "station_slug": null,
  "station_name": null,
  "slug": "lfb-2026-wholetime-intake",
  "title": "Wholetime firefighter — 2026 intake",
  "summary": "Applications open for the LFB 2026 wholetime intake.",
  "role_type": "wholetime",
  "specialism": null,
  "is_cadet": false,
  "status": "live",
  "posted_at": null,
  "closes_at": "2026-06-30T23:59:59.000Z",
  "first_seen_at": "2026-04-21T09:30:00.000Z",
  "last_seen_at": "2026-05-07T08:00:00.000Z",
  "apply_url": "https://...",
  "source_url": "https://...",
  "url": "https://bluewatch.app/jobs/fire/london-fire-brigade/lfb-2026-wholetime-intake"
}

Service

{
  "service_type": "fire",
  "service_category": "local_authority_frs",
  "slug": "london-fire-brigade",
  "name": "London Fire Brigade",
  "short_name": "LFB",
  "country": "UK",
  "region": "London",
  "website_url": "https://www.london-fire.gov.uk",
  "recruitment_url": "https://www.london-fire.gov.uk/jobs/",
  "description": null,
  "url": "https://bluewatch.app/jobs/fire/london-fire-brigade"
}

Examples

curl

curl 'https://bluewatch.app/api/v1/opportunities?role=on_call&limit=5'

JavaScript (fetch)

const res = await fetch(
  'https://bluewatch.app/api/v1/opportunities?service_type=fire&region=south-west',
);
const { data, meta, links } = await res.json();

Python

import requests

r = requests.get(
    "https://bluewatch.app/api/v1/opportunities",
    params={"role": "wholetime", "limit": 25},
)
r.raise_for_status()
for opp in r.json()["data"]:
    print(opp["service_name"], "-", opp["title"])

Caching, polling, errors

Attribution

The data is free to use. We’d love a link back to bluewatch.app in your UI — it helps applicants discover the source and keeps the project sustainable. The data is sourced live from each fire and rescue service’s own recruitment pages; treat each opportunity’s apply_url as the authoritative submission destination.

Building something? We’d love to hear about it.

If you’re building on the API and need a missing field, a different filter, or are running into a quirk, drop us a line. We can usually ship changes the same day.

hello@bluewatch.app