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.

Import the OpenAPI spec into Postman, Insomnia or your SDK generator of choice. Try requests live in the interactive reference.

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

MCP server

The same data is exposed as a Model Context Protocol server. Point any MCP-aware LLM client (Claude Desktop, ChatGPT, Cursor) at the endpoint below and it can search opportunities, look up services, and read the guides directly — no copy-paste, no scraping, always current.

https://bluewatch.app/mcp

Stateless JSON-RPC 2.0 over HTTP. Protocol version 2025-06-18. No auth, no rate limits.

Tools

Claude Desktop setup

{
  "mcpServers": {
    "bluewatch": {
      "url": "https://bluewatch.app/mcp"
    }
  }
}

Drop into claude_desktop_config.json, restart Claude, then ask “what wholetime firefighter jobs are open in the south-west right now?”

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