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.

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.

ToolMirrors
list_coursesGET /agent/courses
get_course_detailsGET /agent/courses/{course}
list_locationsGET /agent/locations
search_sessionsGET /agent/sessions
search_nearby_sessionsGET /agent/nearby-sessions
get_faqsGET /agent/faqs
start_bookingNo 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.

StatusMeaning
400A bad argument, such as a malformed date or an unknown state.
404Nothing matched. The message lists the valid options.
409The suburb is in more than one state. The response includes a candidates list; retry with the state or postcode.
502An upstream service failed. The message says to try again shortly or what to use instead.
404No endpoint at this path. The body adds "code": "not_found" and a hint linking this page and /llms.txt.
405The 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.

StatusResponse
200The 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.

ParameterInTypeDescription
course (required)pathstringThe course's id, unit code, workshops course id or name.
StatusResponse
200The course.
404No course matches. The error lists the valid course ids and codes.
502The 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.

ParameterInTypeDescription
statequerystringA state or territory, such as QLD, in any case. Ignored when near is given.
nearquerystringA postcode or suburb, optionally with its state, such as 4510 or Caboolture QLD.
limitqueryinteger, default 10With near, how many venues to return. Values below 1 use the default.
StatusResponse
200The venues, and with near the place it resolved to.
400The state is unknown. The error lists the valid states.
404near matched no place. Check the postcode or suburb, or list the venues by state.
409near is a suburb in more than one state. Retry with the state or postcode from candidates.
502The 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.

ParameterInTypeDescription
course (required)querystringThe course's id, unit code, workshops course id or name, as getCourseDetails accepts.
location (required)querystringThe venue's id or name from listLocations, or a suburb only one venue has.
date_fromquerystring (date)The first date to search, YYYY-MM-DD in Australia/Brisbane time. Defaults to today; a past date means today.
date_toquerystring (date)The last date to search, YYYY-MM-DD. Defaults to 60 days after date_from and is capped at 365 days after it.
limitqueryinteger, default 10, at most 50How many sessions to return. Larger values are capped at 50; values below 1 use the default.
StatusResponse
200The sessions.
400A date isn't YYYY-MM-DD, or date_to is before date_from.
404course or location is missing or matches nothing. The error says what to call instead.
502The 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.

ParameterInTypeDescription
course (required)querystringThe course's id, unit code, workshops course id or name, as getCourseDetails accepts.
nearquerystringA postcode or suburb, optionally with its state. Empty means near the caller's IP address.
date_fromquerystring (date)The first date to search, YYYY-MM-DD in Australia/Brisbane time. Defaults to today; a past date means today.
date_toquerystring (date)The last date to search, YYYY-MM-DD. Defaults to 60 days after date_from and is capped at 365 days after it.
venuesqueryinteger, default 3, at most 5How many of the closest venues to search. Larger values are capped at 5; values below 1 use the default.
limitqueryinteger, default 10, at most 50How many sessions to return. Larger values are capped at 50; values below 1 use the default.
StatusResponse
200The sessions and the venues searched.
400A date isn't YYYY-MM-DD, or date_to is before date_from.
404course is missing or matches nothing, or near matched no place. The error says what to pass instead.
409near is a suburb in more than one state. Retry with the state or postcode from candidates.
502The 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.

ParameterInTypeDescription
topicquerystringA question or topic, such as How do I renew my certificate.
StatusResponse
200The FAQs.