Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: DataQuoll Calendars API
description: 'DataQuoll turns fragmented Australian public data into answers about locations, events and assets.
Today''s datasets: real-time emergency incidents and warnings (bushfires, floods, storms, earthquakes, rescues, and more) in one GeoJSON schema with CAP-aligned severity, urgency, and certainty fields that carry only what each agency states; disaster declarations reported by LGA as declared-area status; live river gauges with BoM flood classes; and a historical archive. DataQuoll was formerly EmergencyAPI. Standards-validated CAP output is available as an Atom feed via ?format=cap-atom and as per-incident documents via /api/v1/incidents/{id}?format=cap-au, both validated against the OASIS CAP 1.2 schema and the CAP-AU Profile v3.0. Includes real-time incidents, proximity search, and historical audit trail snapshots.
**Disclaimer:** DataQuoll provides aggregated emergency incident data for informational
purposes only. This data is sourced from
official government feeds, community-decoded SA pager feeds and an agency feed whose licence is not published (NT PFES).
It may be delayed, incomplete, or inaccurate. Do not use this API as a substitute for
official emergency warnings.'
version: 1.113.0
contact:
name: DataQuoll Support
url: https://dataquoll.io
license:
name: Proprietary
servers:
- url: https://dataquoll.io
description: Primary host
- url: https://emergencyapi.com
description: Legacy host, identical responses until the announced sunset
security:
- BearerAuth: []
tags:
- name: Calendars
description: 'Industry calendars for NSW, VIC, QLD, WA, SA, TAS, ACT and NT: RDOs, public holidays, school holidays and shutdowns, verified against the official lists, with every source disagreement recorded.'
paths:
/api/v1/calendars:
get:
operationId: listCalendars
summary: Industry calendar editions
description: Every industry-calendar edition on the platform, one per jurisdiction and year (NSW, VIC, QLD, WA, SA, TAS, ACT and NT for 2026), with its publisher, cover range and per-category counts. RDOs, public holidays, school holidays and industry shutdowns, read from each branch calendar and verified against the Fair Work Ombudsman list and the education departments' term dates.
tags:
- Calendars
security:
- BearerAuth: []
- PaymentAuth: []
x-payment-info:
offers:
- amount: '80000'
currency: '0x20C000000000000000000000b9537d11c60E8b50'
description: One request
intent: charge
method: tempo
price:
mode: fixed
currency: USD
amount: '0.08'
protocols:
- mpp:
method: tempo
intent: charge
currency: '0x20C000000000000000000000b9537d11c60E8b50'
- x402:
scheme: exact
network: eip155:8453
asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
amount: '80000'
responses:
'200':
description: The editions
headers:
Payment-Receipt:
$ref: '#/components/headers/PaymentReceipt'
content:
application/json:
schema:
type: object
properties:
count:
type: integer
calendars:
type: array
items:
type: object
properties:
jurisdiction:
type: string
year:
type: integer
title:
type: string
publisher:
type: string
source_url:
type: string
format: uri
applies_to:
type: string
description: Who the calendar is for. An RDO is the contracting industry's day, not a public holiday.
covers:
type: object
properties:
from:
type: string
format: date
to:
type: string
format: date
timezone:
type: string
example: Australia/Adelaide
counts:
type: object
additionalProperties:
type: integer
description: Rows per category
discrepancies:
type: integer
description: Recorded disagreements between the calendar and the official list
path:
type: string
example: /api/v1/calendars/sa
'402':
description: 'Pay per request: no key was sent, so the answer is a price. The WWW-Authenticate header carries an MPP Payment challenge; pay it and send the request again with Authorization: Payment. Also sent, with a fresh price, when a payment fails its checks or its price has expired. Only while pay per request is on; otherwise a request without a key gets 401.'
headers:
WWW-Authenticate:
$ref: '#/components/headers/PaymentChallenge'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/ProblemDetails'
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
/api/v1/calendars/{jurisdiction}:
get:
operationId: getCalendarDays
summary: Calendar days for a jurisdiction
description: The day rows for one jurisdiction across a date range, each date answered by exactly one edition. Defaults to the current calendar year in the jurisdiction's own time zone; a lone from or to extends to the edge of its own year. Recorded disagreements between the calendar and the official list are returned under discrepancies. Rows can be CSV with format=csv.
tags:
- Calendars
parameters:
- name: jurisdiction
in: path
required: true
description: Jurisdiction code
schema:
type: string
enum:
- nsw
- vic
- qld
- sa
- wa
- tas
- act
- nt
- name: from
in: query
description: First date, YYYY-MM-DD
schema:
type: string
format: date
- name: to
in: query
description: Last date, YYYY-MM-DD
schema:
type: string
format: date
- name: category
in: query
description: Comma-separated categories to include (default all). Values are the CalendarDay category enum.
schema:
type: string
example: rdo,public_holiday
- name: format
in: query
description: json (default) or csv. In CSV, a text cell begins with a single quote (') when its first visible character is =, +, - or @ (also after spaces or line breaks, and in fullwidth form) or it starts with a tab, carriage return or single quote, so a spreadsheet opens it as text, never as a formula; numbers, such as a negative latitude, are never changed. To get the original text, remove one single quote from the start of a cell that begins with one.
schema:
type: string
enum:
- json
- csv
security:
- BearerAuth: []
- PaymentAuth: []
x-payment-info:
offers:
- amount: '80000'
currency: '0x20C000000000000000000000b9537d11c60E8b50'
description: One request
intent: charge
method: tempo
price:
mode: fixed
currency: USD
amount: '0.08'
protocols:
- mpp:
method: tempo
intent: charge
currency: '0x20C000000000000000000000b9537d11c60E8b50'
- x402:
scheme: exact
network: eip155:8453
asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
amount: '80000'
responses:
'200':
description: The days in range
headers:
Payment-Receipt:
$ref: '#/components/headers/PaymentReceipt'
content:
application/json:
schema:
type: object
properties:
jurisdiction:
type: string
timezone:
type: string
example: Australia/Adelaide
from:
type: string
format: date
to:
type: string
format: date
count:
type: integer
days:
type: array
items:
$ref: '#/components/schemas/CalendarDay'
editions:
type: array
items:
$ref: '#/components/schemas/CalendarEdition'
discrepancies:
type: array
items:
$ref: '#/components/schemas/CalendarDiscrepancy'
text/csv:
schema:
type: string
'400':
description: Unknown jurisdiction, malformed date, unknown category, or from after to
content:
application/problem+json:
schema:
$ref: '#/components/schemas/ProblemDetails'
'402':
description: 'Pay per request: no key was sent, so the answer is a price. The WWW-Authenticate header carries an MPP Payment challenge; pay it and send the request again with Authorization: Payment. Also sent, with a fresh price, when a payment fails its checks or its price has expired. Only while pay per request is on; otherwise a request without a key gets 401.'
headers:
WWW-Authenticate:
$ref: '#/components/headers/PaymentChallenge'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/ProblemDetails'
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
/api/v1/calendars/{jurisdiction}/{date}:
get:
operationId: getCalendarDay
summary: Is this a working day
description: The answer for one date in one jurisdiction. A jurisdiction-wide public holiday wins, then the weekend, then the calendar's own entries in order (industry shutdown, RDO, part-day holiday, annual leave, industry event); otherwise working. Restricted holidays (a show day for one region, a public-service-only day) never decide it and are returned under restricted for the caller to apply to the employer's area.
tags:
- Calendars
parameters:
- name: jurisdiction
in: path
required: true
description: Jurisdiction code
schema:
type: string
enum:
- nsw
- vic
- qld
- sa
- wa
- tas
- act
- nt
- name: date
in: path
required: true
description: The date, YYYY-MM-DD
schema:
type: string
format: date
security:
- BearerAuth: []
- PaymentAuth: []
x-payment-info:
offers:
- amount: '80000'
currency: '0x20C000000000000000000000b9537d11c60E8b50'
description: One request
intent: charge
method: tempo
price:
mode: fixed
currency: USD
amount: '0.08'
protocols:
- mpp:
method: tempo
intent: charge
currency: '0x20C000000000000000000000b9537d11c60E8b50'
- x402:
scheme: exact
network: eip155:8453
asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
amount: '80000'
responses:
'200':
description: The verdict
headers:
Payment-Receipt:
$ref: '#/components/headers/PaymentReceipt'
content:
application/json:
schema:
$ref: '#/components/schemas/CalendarVerdict'
'400':
description: Unknown jurisdiction or malformed date
content:
application/problem+json:
schema:
$ref: '#/components/schemas/ProblemDetails'
'402':
description: 'Pay per request: no key was sent, so the answer is a price. The WWW-Authenticate header carries an MPP Payment challenge; pay it and send the request again with Authorization: Payment. Also sent, with a fresh price, when a payment fails its checks or its price has expired. Only while pay per request is on; otherwise a request without a key gets 401.'
headers:
WWW-Authenticate:
$ref: '#/components/headers/PaymentChallenge'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/ProblemDetails'
application/json:
schema:
$ref: '#/components/schemas/ProblemDetails'
'404':
description: No edition covers the date; the detail names the editions that exist
content:
application/problem+json:
schema:
$ref: '#/components/schemas/ProblemDetails'
components:
headers:
PaymentReceipt:
description: 'Sent only on the response to a paid request (Authorization: Payment): the receipt for the payment, naming its transaction. Never sent when a key was used.'
schema:
type: string
PaymentChallenge:
description: 'The MPP payment challenge, scheme Payment: the price, the token, where to pay, the realm (dataquoll.io) and when the price expires, 5 minutes after it is issued. Pay it with an MPP client and send the request again with Authorization: Payment.'
schema:
type: string
schemas:
ProblemDetails:
type: object
description: RFC 9457 Problem Details
properties:
type:
type: string
example: https://emergencyapi.com/errors/rate-limit-exceeded
title:
type: string
example: Rate Limit Exceeded
status:
type: integer
example: 429
detail:
type: string
instance:
type: string
CalendarEdition:
type: object
properties:
jurisdiction:
type: string
year:
type: integer
title:
type: string
publisher:
type: string
source_url:
type: string
format: uri
applies_to:
type: string
covers:
type: object
properties:
from:
type: string
format: date
to:
type: string
format: date
timezone:
type: string
CalendarVerdict:
type: object
properties:
jurisdiction:
type: string
date:
type: string
format: date
weekday:
type: string
enum:
- Mon
- Tue
- Wed
- Thu
- Fri
- Sat
- Sun
timezone:
type: string
status:
type: string
enum:
- public_holiday
- weekend
- industry_shutdown
- rdo
- part_day_public_holiday
- annual_leave
- industry_event
- working
working_day:
type: boolean
applies_to:
type: string
entries:
type: array
items:
$ref: '#/components/schemas/CalendarDay'
description: Every row on the date, including the ones that do not decide the verdict
restricted:
type: array
items:
$ref: '#/components/schemas/CalendarDay'
description: Official holidays that apply only to the area or sector in their scope
edition:
$ref: '#/components/schemas/CalendarEdition'
CalendarDiscrepancy:
type: object
properties:
date:
type: string
format: date
issue:
type: string
CalendarDay:
type: object
description: One row of an industry calendar. Null-valued fields are omitted from this description but always present in the JSON.
properties:
date:
type: string
format: date
weekday:
type: string
enum:
- Mon
- Tue
- Wed
- Thu
- Fri
- Sat
- Sun
category:
type: string
enum:
- public_holiday
- part_day_public_holiday
- restricted_public_holiday
- poster_holiday
- rdo
- industry_shutdown
- annual_leave
- industry_event
- union_event
- school_holiday
- school_term
description: public_holiday is official and jurisdiction-wide. restricted_public_holiday is official but only for the area or sector in scope. poster_holiday is a day the source calendar colours as a holiday that is not one, kept for audit.
subtype:
type:
- string
- 'null'
description: The calendar's own split where it has one (scheduled, flexible, 36_hour_week, 38_hour_week, industry, eba, contracting, award, construction); null otherwise
scope:
type:
- string
- 'null'
description: For restricted_public_holiday, the area or sector the day applies to; null otherwise
name:
type: string
poster_marking:
type:
- string
- 'null'
description: What the source calendar shows for the day; null where it has no cell
official_match:
type:
- boolean
- 'null'
description: For official holidays, whether the source calendar agrees; null where the question does not apply
part_day_from:
type:
- string
- 'null'
example: '19:00'
description: Local start time of a part-day holiday; null otherwise
range_end:
type:
- string
- 'null'
format: date
description: Last day of the range this row belongs to (a shutdown, a school break, a term); null otherwise
note:
type:
- string
- 'null'
securitySchemes:
BearerAuth:
type: http
scheme: bearer
description: 'API key in format: eak_live_... . Keys work from any origin by default. A key can optionally be restricted to specific browser origins in the dashboard; a request from a browser origin not on the allowlist is rejected with 403. Requests without an Origin header (server-side) are never blocked by this.'
PaymentAuth:
type: http
scheme: payment
description: 'Pay per request with MPP (the Machine Payments Protocol), for an agent with no API key. Send the request with no Authorization header and the 402 response carries the price in its WWW-Authenticate header. Pay it in USDC.e on Tempo with an MPP client, then send the request again with `Authorization: Payment <credential>`; the response carries a Payment-Receipt header. Offered only on the operations that list it, and only while pay per request is on. A request with a Bearer key is never charged. Prices, receipts and refunds: https://docs.dataquoll.io/machine-payments'
x-service-info:
docs:
homepage: https://dataquoll.io
apiReference: https://docs.dataquoll.io
llms: https://dataquoll.io/llms.txt