---
title: "Australia Wide First Aid agent API"
description: "A public, read-only JSON API for AI agents: Australia Wide First Aid courses, venues, sessions and FAQs."
canonical: "https://www.australiawidefirstaid.com/agent/docs"
---

# Australia Wide First Aid agent API

A public, read-only JSON API for AI agents helping someone find an Australia Wide First Aid course: the courses, the training venues, upcoming sessions and the site's FAQs. It needs no credentials or API key, sets no cookies and changes nothing. Call it with a plain `GET`.

- OpenAPI 3.1 description: [https://www.australiawidefirstaid.com/agent/openapi.json](https://www.australiawidefirstaid.com/agent/openapi.json) (also at `https://www.australiawidefirstaid.com/openapi.json`)
- API catalog (RFC 9727): [https://www.australiawidefirstaid.com/.well-known/api-catalog](https://www.australiawidefirstaid.com/.well-known/api-catalog)
- Server: `https://www.australiawidefirstaid.com`
- HTML version: [https://www.australiawidefirstaid.com/agent/docs](https://www.australiawidefirstaid.com/agent/docs)

## Authentication

None. Every endpoint is public and read-only: there is no API key, account or sign-up, and a request needs no `Authorization` header and no cookie. This request, sent exactly as written, answers 200 with JSON:

```sh
curl https://www.australiawidefirstaid.com/agent/courses
```

The site's statement for agents is [auth.md](https://www.australiawidefirstaid.com/auth.md).

## Booking

The API doesn't book. When the person has chosen a session, send them to its `booking_page`. They finish on the enrolment site, where they enter their own details and pay there. An agent never enters payment details.

## MCP server

The same API is a public MCP server at `https://www.australiawidefirstaid.com/mcp` (Streamable HTTP). It needs no sign-in, API key or install. To use it from an assistant, add it as a custom connector with that URL: in Claude, for example, under Settings, Connectors, Add custom connector. Its server card is at [https://www.australiawidefirstaid.com/mcp/server-card](https://www.australiawidefirstaid.com/mcp/server-card) (also `https://www.australiawidefirstaid.com/.well-known/mcp/server-card.json`).

Each tool takes the endpoint's parameters as arguments and returns the same JSON the endpoint does; an endpoint error comes back as a tool error with the same `{"error": "..."}` body. The tools never use the caller's IP address, so `search_nearby_sessions` needs `near`: ask the person for their postcode or suburb.

| Tool | Mirrors |
| --- | --- |
| `list_courses` | `GET /agent/courses` |
| `get_course_details` | `GET /agent/courses/{course}` |
| `list_locations` | `GET /agent/locations` |
| `search_sessions` | `GET /agent/sessions` |
| `search_nearby_sessions` | `GET /agent/nearby-sessions` |
| `get_faqs` | `GET /agent/faqs` |
| `start_booking` | No endpoint: returns the booking link |

`start_booking` doesn't book. It takes a `session_id` from a search and returns a link, `https://www.australiawidefirstaid.com/book/<session_id>`, for one place. The person opens it and completes the booking themselves on the enrolment site, where they enter their own details and pay. For a group, book each person separately or use the [corporate enquiry page](https://www.australiawidefirstaid.com/corporate).

## A2A agent

The same reads are an Agent2Agent (A2A) agent at `https://www.australiawidefirstaid.com/a2a`: JSON-RPC 2.0 `SendMessage` (A2A 1.0) or `message/send` (0.3), no sign-in. Its agent card is at [https://www.australiawidefirstaid.com/.well-known/agent-card.json](https://www.australiawidefirstaid.com/.well-known/agent-card.json). Send a message whose data part names a skill (the tool names above, without `start_booking`) and its arguments, named as the endpoint's parameters, for example `{"skill":"search_nearby_sessions","course":"HLTAID011","near":"4000"}`. The reply is a completed task whose artifact holds the endpoint's JSON as a data part and a one-line text part. An endpoint error is the same `{"error": "..."}` body in a completed task, or a failed task when an upstream service failed. Free text isn't interpreted: a message without a known skill gets a list of the skills and examples. The agent never uses the caller's IP address, stores no tasks, doesn't stream and doesn't book.

## Errors

Every error is JSON `{"error": "..."}` saying what to call or pass instead.

| Status | Meaning |
| --- | --- |
| 400 | A bad argument, such as a malformed date or an unknown state. |
| 404 | Nothing matched. The message lists the valid options. |
| 409 | The suburb is in more than one state. The response includes a `candidates` list; retry with the state or postcode. |
| 502 | An upstream service failed. The message says to try again shortly or what to use instead. |
| 404 | No endpoint at this path. The body adds `"code": "not_found"` and a `hint` linking this page and `https://www.australiawidefirstaid.com/llms.txt`. |
| 405 | The endpoint doesn't accept that method: every endpoint is read-only. The body adds `"code": "method_not_allowed"` and a `hint`, and the `Allow` header lists the methods to use (`GET, HEAD`). |

## Endpoints

### `GET /agent/courses`

**List courses** (`listCourses`). Every bookable course in menu order. Each course's id is the value the other endpoints take as course.

| Status | Response |
| --- | --- |
| 200 | The courses. |

Example request:

```sh
curl https://www.australiawidefirstaid.com/agent/courses
```

Example response (trimmed to the first item of each list and some of its fields; from the live catalogue):

```json
{
  "courses": [
    {
      "id": "first-aid",
      "code": "HLTAID011",
      "name": "Provide First Aid",
      "official_name": "Provide First Aid (Includes CPR)",
      "summary": "Comprehensive first aid training including CPR, emergency response and casualty management.",
      "duration": [
        "This is a blended course with self-paced online learning (e-Learning) and face-to-face training. Before attending the face-to-face training, students will need to complete their e-Learning which can be done in one sitting or over several sessions."
      ],
      "delivery": [
        "e-Learning plus face-to-face classroom training and assessment"
      ],
      "renewal": "Renew every 3 years",
      "url": "https://www.australiawidefirstaid.com/courses/first-aid"
    }
  ]
}
```

### `GET /agent/courses/{course}`

**Get a course's details** (`getCourseDetails`). One course with what it covers, how it is assessed, the certificate and what to bring. course may be the id, the unit code (such as HLTAID011), the workshops course id, the name or the official name, in any case, or text containing a unit code. A unit code two courses share resolves to the first in menu order.

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `course` (required) | path | string | The course's id, unit code, workshops course id or name. |

| Status | Response |
| --- | --- |
| 200 | The course. |
| 404 | No course matches. The error lists the valid course ids and codes. |
| 502 | The course list is unavailable just now; try again shortly. |

Example request:

```sh
curl https://www.australiawidefirstaid.com/agent/courses/first-aid
```

Example response (trimmed to the first item of each list and some of its fields; from the live catalogue):

```json
{
  "id": "first-aid",
  "code": "HLTAID011",
  "name": "Provide First Aid",
  "official_name": "Provide First Aid (Includes CPR)",
  "headline": "HLTAID011 Provide First Aid is the minimum requirement for workplace first aid compliance.",
  "key_points": [
    "HLTAID011 Provide First Aid — a nationally recognised certification"
  ],
  "renewal": "Renew every 3 years",
  "certificate": [
    "A PDF Statement of Attainment in HLTAID011 Provide First Aid will be emailed to you the same day as your successful completion of the training and assessment (and provided that student has provided a verified USI and completed all required assessment for the course)."
  ],
  "url": "https://www.australiawidefirstaid.com/courses/first-aid"
}
```

### `GET /agent/locations`

**List training venues** (`listLocations`). The training venues, grouped by state and then by name, optionally narrowed to one state. With near, the venues nearest that postcode or suburb instead, nearest first, each with distance_km; an empty near uses the caller's approximate location from their IP address.

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `state` | query | string | A state or territory, such as QLD, in any case. Ignored when near is given. |
| `near` | query | string | A postcode or suburb, optionally with its state, such as 4510 or Caboolture QLD. |
| `limit` | query | integer, default 10 | With near, how many venues to return. Values below 1 use the default. |

| Status | Response |
| --- | --- |
| 200 | The venues, and with near the place it resolved to. |
| 400 | The state is unknown. The error lists the valid states. |
| 404 | near matched no place. Check the postcode or suburb, or list the venues by state. |
| 409 | near is a suburb in more than one state. Retry with the state or postcode from candidates. |
| 502 | The postcode/suburb lookup is unavailable. List the venues by state and pick the closest by name. |

Example request:

```sh
curl 'https://www.australiawidefirstaid.com/agent/locations?state=QLD'
```

Example response (trimmed to the first item of each list and some of its fields; from the live catalogue):

```json
{
  "locations": [
    {
      "id": "beaudesert",
      "name": "Beaudesert",
      "state": "QLD",
      "suburb": "Beaudesert",
      "postcode": "4285"
    }
  ]
}
```

### `GET /agent/sessions`

**Search sessions at one venue** (`searchSessions`). Upcoming sessions of one course at one venue, soonest first, each listed once.

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `course` (required) | query | string | The course's id, unit code, workshops course id or name, as getCourseDetails accepts. |
| `location` (required) | query | string | The venue's id or name from listLocations, or a suburb only one venue has. |
| `date_from` | query | string (date) | The first date to search, YYYY-MM-DD in Australia/Brisbane time. Defaults to today; a past date means today. |
| `date_to` | query | string (date) | The last date to search, YYYY-MM-DD. Defaults to 60 days after date_from and is capped at 365 days after it. |
| `limit` | query | integer, default 10, at most 50 | How many sessions to return. Larger values are capped at 50; values below 1 use the default. |

| Status | Response |
| --- | --- |
| 200 | The sessions. |
| 400 | A date isn't YYYY-MM-DD, or date_to is before date_from. |
| 404 | course or location is missing or matches nothing. The error says what to call instead. |
| 502 | The sessions are unavailable just now; try again shortly. |

Example request:

```sh
curl 'https://www.australiawidefirstaid.com/agent/sessions?course=first-aid&location=brisbane-cbd'
```

Example response (trimmed to the first item of each list and some of its fields; from the live catalogue):

```json
{
  "sessions": [
    {
      "session_id": "2062917",
      "course": "first-aid",
      "course_name": "HLTAID011 Provide first aid + HLTAID009 Provide cardiopulmonary resuscitation",
      "date": "2026-10-20",
      "date_display": "Tuesday 20 October",
      "time": "9:00 am - 1:00 pm",
      "seats": "5+",
      "venue": {
        "id": "brisbane-cbd",
        "name": "Brisbane CBD",
        "state": "QLD"
      },
      "booking_page": "https://www.australiawidefirstaid.com/?course=92956&location=brisbane-cbd#find-course"
    }
  ]
}
```

### `GET /agent/nearby-sessions`

**Search sessions near a place** (`searchNearbySessions`). Upcoming sessions of one course at the venues closest to a postcode or suburb, merged soonest first, each with its venue's distance_km. An empty near uses the caller's approximate location from their IP address. If one venue's sessions can't be fetched, the others are still returned.

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `course` (required) | query | string | The course's id, unit code, workshops course id or name, as getCourseDetails accepts. |
| `near` | query | string | A postcode or suburb, optionally with its state. Empty means near the caller's IP address. |
| `date_from` | query | string (date) | The first date to search, YYYY-MM-DD in Australia/Brisbane time. Defaults to today; a past date means today. |
| `date_to` | query | string (date) | The last date to search, YYYY-MM-DD. Defaults to 60 days after date_from and is capped at 365 days after it. |
| `venues` | query | integer, default 3, at most 5 | How many of the closest venues to search. Larger values are capped at 5; values below 1 use the default. |
| `limit` | query | integer, default 10, at most 50 | How many sessions to return. Larger values are capped at 50; values below 1 use the default. |

| Status | Response |
| --- | --- |
| 200 | The sessions and the venues searched. |
| 400 | A date isn't YYYY-MM-DD, or date_to is before date_from. |
| 404 | course is missing or matches nothing, or near matched no place. The error says what to pass instead. |
| 409 | near is a suburb in more than one state. Retry with the state or postcode from candidates. |
| 502 | The sessions or the postcode/suburb lookup are unavailable. The error says to try again or what to use instead. |

Example request:

```sh
curl 'https://www.australiawidefirstaid.com/agent/nearby-sessions?course=cpr&near=4510'
```

Example response (trimmed to the first item of each list and some of its fields; from the live catalogue):

```json
{
  "near": {
    "postcode": "4510",
    "state": "QLD",
    "suburb": "Caboolture"
  },
  "venues_searched": [
    {
      "id": "caboolture",
      "name": "Caboolture",
      "distance_km": 4
    }
  ],
  "sessions": [
    {
      "session_id": "2063701",
      "course": "cpr",
      "course_name": "HLTAID009 Provide cardiopulmonary resuscitation",
      "date": "2026-10-20",
      "date_display": "Tuesday 20 October",
      "time": "9:00 am - 11:00 am",
      "seats": "Almost sold out!",
      "venue": {
        "id": "north-lakes",
        "name": "North Lakes",
        "state": "QLD",
        "distance_km": 19
      },
      "booking_page": "https://www.australiawidefirstaid.com/?course=92955&location=north-lakes#find-course"
    }
  ]
}
```

### `GET /agent/faqs`

**Get FAQs** (`getFaqs`). The site-wide frequently asked questions, each question once. With topic, only those mentioning the topic's meaningful words, best matches first.

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `topic` | query | string | A question or topic, such as How do I renew my certificate. |

| Status | Response |
| --- | --- |
| 200 | The FAQs. |

Example request:

```sh
curl 'https://www.australiawidefirstaid.com/agent/faqs?topic=cpr'
```

Example response (trimmed to the first item of each list and some of its fields; from the live catalogue):

```json
{
  "faqs": [
    {
      "question": "What first aid course do I need for work in Australia?",
      "answer": "Most workplaces require HLTAID011 Provide First Aid (includes CPR). Some roles also require HLTAID009 Provide CPR refreshed yearly, and childcare roles require HLTAID012 First Aid in an Education and Care Setting."
    }
  ]
}
```
