---
title: "Public holiday calendar for a country, with sub-national calendars (free)"
method: GET
path: "/v1/{country}/public-holidays"
tags: ["Free"]
---

# Public holiday calendar for a country, with sub-national calendars (free)

`GET /v1/{country}/public-holidays`

## Request

- Base URL: `https://afriref.dev`
- URL: `https://afriref.dev/v1/{country}/public-holidays`
- Auth: none required

National public holidays in `value`; regional extra days are under `subdivisions` (ISO 3166-2). For a regional calendar applied for you, POST /v1/answers/working-days. `date: null` + `pending_window` marks a day not yet gazetted (never invented); `name` is stable.

## Path parameters

- `country` 'ao' | 'bf' | 'bj' | 'bw' | 'cd' | 'cf' | 'cg' | 'ci' | 'cm' | 'dz' | 'eg' | 'et' | 'ga' | 'gh' | 'gq' | 'ke' | 'ls' | 'ma' | 'ml' | 'mu' | 'mz' | 'na' | 'ne' | 'ng' | 'rw' | 'sn' | 'sz' | 'td' | 'tg' | 'tn' | 'tz' | 'ug' | 'za' | 'zm', required

## Response `200`

Holiday calendar, plus `subdivisions` where the country has regions

- object
  - `country` string, required: ISO 3166-1 alpha-2 country code
  - `series` string, required
  - `value` unknown, required
  - `unit` string
  - `effective_from` string, date, nullable, required
  - `effective_from_basis` 'restatement': Optional. Absent: effective_from is the date the value became the law (a genuine change point). 'restatement': effective_from is the date the value's CURRENT LEGAL BASIS took effect (a new tax code, an annual finance law) while the value itself is older and its true origin is not primary-verifiable — a verified floor, not a change. Do not read a restatement row as the value having changed on that date.
  - `last_confirmed` string, date, required: When this value was last verified against the official source
  - `source` object, required
    - `name` string, required
    - `url` string, uri, required
  - `stale` boolean, required: True when past the expected update cycle — treat with caution
  - `notes` string
  - `effective_rate` number: Optional. Combined effective rate where statutory levies stack on top of the standard rate (e.g. Ghana VAT 15% + NHIL 2.5% + GETFund 2.5% = 20%). Present only where it differs from value.
  - `components` object[]: Optional. Breakdown of a composite rate into its named statutory components (present only where applicable, e.g. Ghana VAT).
    - `name` string, required
    - `rate` number, required
  - `confidence_label` 'high' | 'medium' | 'low': Derived from source type, verification age, stale. Rules: /label-rules
  - `coverage_label` 'ready' | 'partial' | 'gap': ready=complete, partial=limited, gap=no number. Rules: /label-rules
  - `label_basis` object: Inputs and rule ids behind both labels

## Other responses

- `404`: Unknown country

---

[API](https://skmtc.dev/afriref/apis/afriref-pan-african-government-reference-data.md) · [All operations](https://skmtc.dev/afriref/apis/afriref-pan-african-government-reference-data/llms.txt) · [OpenAPI document](https://skmtc.dev/afriref/apis/afriref-pan-african-government-reference-data/revisions/d78528e9f644?raw)
