africacompliancedata-com Private mode API

Signed country-year bundles for computing on your own machine (the SDKs' private mode). Holiday parts on all plans; tax parts on Pro (countries of its pack) and Compliance.

Operations 1

GET /v1/countries/{country}/bundle Signed country-year bundle, to compute holidays, business days, VAT on a date… #

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/africacompliancedata-com:africacompliancedata-com-private-mode-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

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

africacompliancedata-com-private-mode-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Africacompliancedata Com Private mode API
  version: 1.0.0
  contact:
    name: Africa Compliance Data
    email: support@africacompliancedata.com
    url: https://africacompliancedata.com
  license:
    name: 'Proprietary: use under the Terms of Service'
    url: https://africacompliancedata.com/terms
  termsOfService: https://africacompliancedata.com/terms
  description: 'Operations tagged Private mode across 2 of this provider''s published API definitions: africacompliancedata-com-openapi.json, africacompliancedata-com.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.africacompliancedata.com
security:
- ApiKey: []
- Bearer: []
tags:
- name: Private mode
  description: Signed country-year bundles for computing on your own machine (the SDKs' private mode). Holiday parts on all plans; tax parts on Pro (countries of its pack) and Compliance.
paths:
  /v1/countries/{country}/bundle:
    get:
      tags:
      - Private mode
      operationId: getCountryBundle
      summary: Signed country-year bundle, to compute holidays, business days, VAT on a date…
      description: 'What the SDKs'' private mode needs for one country and year: the year''s holidays with their status (rule, confirmed, estimated, observed, bridge) in every scope, the weekend, coverage, the sources with their confidence, and the disclaimer; with the tax parts, also the VAT rates, the dated VAT history, the filing-deadline rules and the payroll data (PAYE bands and contributions in dated periods, with the currency). The client computes the answers itself, so the dates, ranges, months and day counts of its queries are not sent: the only details of its queries in the request are the country and the year. Plans: Free and Developer get the holiday parts; Compliance gets everything; Pro gets the tax parts for the countries of its pack. On Pro, parts=all uses the pack as a tax endpoint does: a country joins a pack that has room; with a full pack that does not hold it, the answer has the holiday parts and bundle.not_included.tax gives the reason. parts=holidays never changes the pack. Signed with Ed25519 (the same key as GET /v1/tax-id/rules) over the canonical JSON of ''bundle'' (object keys sorted, no whitespace, strings as JSON.stringify writes them, integers and plain decimals such as 7.5 only). The top-level ''disclaimer'' is the key''s own copy, outside the signature; it equals bundle.disclaimer apart from invisible characters. Do not use a bundle past bundle.expires_at: 1 day after issued_at for the current and later years (holiday statuses change when an estimated date is confirmed), 30 days for past years. Counts as one request against the monthly quota and as a read of that country. Cache-Control: private.'
      parameters:
      - $ref: '#/components/parameters/Country'
      - name: year
        in: query
        required: true
        schema:
          type: integer
          minimum: 2025
          maximum: 2030
      - name: parts
        in: query
        required: false
        description: 'all (default): the parts the plan includes for this country; holidays: the holiday parts only (never changes a Pro pack)'
        schema:
          type: string
          enum:
          - all
          - holidays
          default: all
      responses:
        '200':
          description: Signed bundle
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CountryBundle'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Paused'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          description: Signed bundles not available on this server yet (or the key check is temporarily unavailable)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    servers:
    - url: https://api.africacompliancedata.com
components:
  schemas:
    Coverage:
      type: string
      enum:
      - ready
      - partial
      - gap
    VatPeriod:
      type: object
      properties:
        rate:
          type: number
        from:
          type:
          - string
          - 'null'
          format: date
        to:
          type:
          - string
          - 'null'
          format: date
        from_note:
          type: string
          description: When the period started before the documented history, e.g. 'in force on 2015-01-01 (earlier start not covered)'
        legal_basis:
          type: string
        source_url:
          type:
          - string
          - 'null'
        confidence:
          type: string
          enum:
          - high
          - medium
          - low
        notes:
          type: string
    DataRevision:
      type: string
      description: 'Short commit id of the data the answer was built from (e.g. 928cb72b). dataset_version is the build date: the daily rebuild changes it with no data change, while data_revision changes only when the data does. Keep it with saved results to know exactly which data you used.'
      example: 928cb72b
    Error:
      type: object
      properties:
        error:
          type: string
      required:
      - error
    Holiday:
      type: object
      properties:
        date:
          type: string
          format: date
        name:
          type: string
        rule_id:
          type:
          - string
          - 'null'
          description: Absent for ad-hoc days off
        status:
          type: string
          enum:
          - rule
          - confirmed
          - estimated
          - observed
          - bridge
        scope:
          type: string
          description: national, or the group a holiday is limited to
        observed_for:
          type: string
          format: date
          description: 'For a substitute day: the date of the holiday it replaces'
        moved_from:
          type: string
          format: date
          description: Original date of a holiday officially moved
        bridge_for:
          type: string
          format: date
          description: 'For a bridge day: the holiday it bridges to'
        estimated:
          type: boolean
          description: 'true on a weekend substitute of an estimated (moon-sighted) date: it moves with the announced date'
        source_url:
          type:
          - string
          - 'null'
          description: Official announcement (confirmed dates); null when the official text is not online (source_note says where it was published)
        source_note:
          type: string
          description: Where the announcement was made when it is not published online, or that the date is known from a press report of the official announcement
    Source:
      type: object
      properties:
        url:
          type:
          - string
          - 'null'
          description: null when the official text is not available online; 'note' then explains it
        note:
          type: string
          description: Present when url is null
        legal_basis:
          type: string
        source_type:
          type: string
          description: e.g. statute, gazette, revenue_authority; 'secondary' when no official text has been confirmed
        effective_date:
          type:
          - string
          - 'null'
        confidence:
          type: string
          enum:
          - high
          - medium
          - low
        last_verified:
          type: string
          format: date
    CountryBundle:
      type: object
      required:
      - bundle
      - signature
      - disclaimer
      properties:
        bundle:
          type: object
          description: The signed payload
          required:
          - format
          - kind
          - country
          - year
          - years
          - parts
          - dataset_version
          - issued_at
          - expires_at
          - key_id
          - disclaimer
          - country_data
          - calendar
          properties:
            format:
              type: integer
              enum:
              - 1
            kind:
              type: string
              enum:
              - country_year
            country:
              type: string
            year:
              type: integer
            years:
              type: array
              items:
                type: integer
              description: First and last year the dataset covers
            parts:
              type: array
              items:
                type: string
                enum:
                - holidays
                - tax
            dataset_version:
              type: string
            data_revision:
              $ref: '#/components/schemas/DataRevision'
            issued_at:
              type: string
              format: date-time
            expires_at:
              type: string
              format: date-time
              description: '1 day after issued_at for the current and later years, 30 days for past years: do not use the bundle after this'
            key_id:
              type: string
              description: First 16 hex digits of the SHA-256 of the signing public key
            disclaimer:
              type: string
            country_data:
              type: object
              description: 'The country''s fields as the API uses them: iso2, name, weekend (ISO weekday numbers, 1 = Monday), coverage, holidays (source_ref, weekend_rule, notes), holiday_announcements, calendar_incomplete_years, calendar_any (whether any year has a holiday), sources (with confidence); with the tax parts also vat, vat_history, deadlines, currency and payroll (payroll_tax and contributions periods, as in /payroll-tax and /social-security)'
              properties:
                weekend:
                  type: array
                  items:
                    type: integer
                coverage:
                  type: object
                  additionalProperties:
                    $ref: '#/components/schemas/Coverage'
                sources:
                  type: object
                  additionalProperties:
                    $ref: '#/components/schemas/Source'
                vat_history:
                  type: object
                  properties:
                    covered_from:
                      type:
                      - string
                      - 'null'
                    periods:
                      type: array
                      items:
                        $ref: '#/components/schemas/VatPeriod'
            calendar:
              type: object
              description: The year's holidays (every scope), keyed by the year
              additionalProperties:
                type: array
                items:
                  $ref: '#/components/schemas/Holiday'
            not_included:
              type: object
              properties:
                tax:
                  type: string
                  description: Why the tax parts are not included (the plan, or a full Pro pack)
        signature:
          type: object
          properties:
            alg:
              type: string
              enum:
              - Ed25519
            key_id:
              type: string
            value:
              type: string
              description: Base64 Ed25519 signature of the UTF-8 canonical JSON of 'bundle'
        disclaimer:
          type: string
          description: The disclaimer as in every answer for this key (outside the signature)
  responses:
    Paused:
      description: Key paused for review after unusual bulk access ('Access paused')
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    BadRequest:
      description: Missing or invalid parameter
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Unknown country, path or webhook id
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: 'Monthly quota reached (until 00:00 UTC on the 1st; X-Quota-Limit and X-Quota-Remaining: 0), rate limit for the plan exceeded, or key checks busy (many new keys from your network); see Retry-After'
      headers:
        Retry-After:
          schema:
            type: integer
        X-Quota-Limit:
          schema:
            type: integer
        X-Quota-Remaining:
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  parameters:
    Country:
      name: country
      in: path
      required: true
      description: ISO 3166-1 alpha-2 code, e.g. KE, NG, ZA.
      schema:
        type: string
        pattern: ^[A-Za-z]{2}$
      example: KE
  securitySchemes:
    ApiKey:
      type: apiKey
      in: header
      name: x-api-key
    Bearer:
      type: http
      scheme: bearer
      description: The same API key as a bearer token.
x-refined-from:
- africacompliancedata-com-openapi.json
- africacompliancedata-com.json