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 - Markdown version:
/agent/docs.md
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:
curl https://www.australiawidefirstaid.com/agent/courses
The site's statement for agents is 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 /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. |
Example request:
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):
{
"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:
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):
{
"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:
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):
{
"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:
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):
{
"sessions": [
{
"session_id": "2064651",
"course": "first-aid",
"course_name": "HLTAID011 Provide first aid + HLTAID009 Provide cardiopulmonary resuscitation",
"date": "2026-11-03",
"date_display": "Tuesday 3 November",
"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:
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):
{
"near": {
"postcode": "4510",
"state": "QLD",
"suburb": "Caboolture"
},
"venues_searched": [
{
"id": "caboolture",
"name": "Caboolture",
"distance_km": 4
}
],
"sessions": [
{
"session_id": "2065420",
"course": "cpr",
"course_name": "HLTAID009 Provide cardiopulmonary resuscitation",
"date": "2026-11-03",
"date_display": "Tuesday 3 November",
"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:
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):
{
"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."
}
]
}