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:
/agent/openapi.json(also at/openapi.json) - API catalog (RFC 9727):
/.well-known/api-catalog - Server:
https://www.australiawidefirstaid.com
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 /mcp/server-card (also
/.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.
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
/.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 /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. |
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. |
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. |
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. |
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. |
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. |