DataQuoll Calendars API

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.

Operations 3

GET /api/v1/calendars Industry calendar editions #
GET /api/v1/calendars/{jurisdiction} Calendar days for a jurisdiction #
GET /api/v1/calendars/{jurisdiction}/{date} Is this a working day #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/dataquoll-io:dataquoll-io-calendars-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

dataquoll-io-calendars-api-openapi.yml Raw ↑
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