Holiday API documentation

This holiday API documentation covers every OpenDay endpoint with a real example. Every response is { data, meta }; dates are plain YYYY-MM-DD.

Last verified: October 16, 2026Sources & methodologyFound an error? Tell us

Getting started

  1. Open OpenDay API on Apify and sign in (or create a free Apify account).
  2. Call it as an HTTP API (Standby mode) with your Apify API token in the Authorization: Bearer header, or run up to 1,000 requests in one batch.
  3. You pay per successful request. Errors are never charged.

Regions: US (federal and banking), PR (government, legal, banking) and all 50 states plus DC as US-XX. Years: 2000–2100 for US and Puerto Rico, 2026–2100 for states.

Code examples

const url = 'https://jbstudio--openday-api.apify.actor/v1/is-business-day?date=2027-07-05&region=PR';
const res = await fetch(url, {
  headers: { Authorization: 'Bearer ' + process.env.APIFY_TOKEN },
});
const { data } = await res.json();
console.log(data.isBusinessDay); // false
import os, requests

url = "https://jbstudio--openday-api.apify.actor/v1/business-days/add"
params = {"start": "2027-12-10", "days": 10, "region": "US", "calendar": "banking"}
headers = {"Authorization": f"Bearer {os.environ['APIFY_TOKEN']}"}
print(requests.get(url, params=params, headers=headers).json()["data"]["result"])  # 2027-12-24

Endpoints

GET/v1/holidays · List holidays

Holidays for one region and year. Parameters: country (US, PR, US-TX, …), year, and optional calendar (federal, banking, government, legal, state), dateBasis (actual or observed) and include.

GET /v1/holidays?country=US&year=2027

{
  "data": [
    {
      "id": "new-years-day",
      "date": "2027-01-01",
      "observedDate": "2027-01-01",
      "nameEn": "New Year's Day",
      "nameEs": "Año Nuevo",
      "type": "federal",
      "source": "5 U.S.C. 6103",
      "sourceUrl": "https://uscode.house.gov/view.xhtml?req=granuleid:USC-prelim-title5-section6103",
      "sourceType": "official"
    },
    {
      "id": "martin-luther-king-jr-day",
      "date": "2027-01-18",
      "observedDate": "2027-01-18",
      "nameEn": "Martin Luther King Jr. Day",
      "nameEs": "Natalicio de Martin Luther King Jr.",
      "type": "federal",
      "source": "5 U.S.C. 6103",
      "sourceUrl": "https://uscode.house.gov/view.xhtml?req=granuleid:USC-prelim-title5-section6103",
      "sourceType": "official"
    }
  ],
  "meta": {
    "calendar": "federal",
    "verificationStatus": "official",
    "note": "Confirm official proclamations."
  }
}

Try it on Apify →

GET/v1/is-business-day · Check a business day

Is this date a business day on the region’s calendar? The answer lists every holiday observed that day.

GET /v1/is-business-day?date=2027-07-05&region=PR

{
  "data": {
    "date": "2027-07-05",
    "region": "PR",
    "calendar": "government",
    "isBusinessDay": false,
    "reason": "holiday",
    "holidays": [
      {
        "id": "independence-day",
        "date": "2027-07-04",
        "observedDate": "2027-07-05",
        "nameEn": "US Independence Day",
        "nameEs": "Día de la Independencia de los Estados Unidos"
      }
    ]
  }
}

Try it on Apify →

GET/v1/business-days/add · Add business days

Move forward (or backward, with a negative number) by N business days. The start date is not counted.

GET /v1/business-days/add?start=2027-12-10&days=10&region=US&calendar=banking

{
  "data": {
    "start": "2027-12-10",
    "days": 10,
    "region": "US",
    "calendar": "banking",
    "result": "2027-12-24"
  }
}

Try it on Apify →

GET/v1/business-days/between · Count business days between dates

Business days from start to end, both included. Negative when end is before start.

GET /v1/business-days/between?start=2027-01-01&end=2027-01-31&region=US-TX

{
  "data": {
    "start": "2027-01-01",
    "end": "2027-01-31",
    "region": "US-TX",
    "calendar": "state",
    "businessDays": 19,
    "inclusive": true
  }
}

Try it on Apify →

GET/v1/regions · Supported regions

Every region with its calendars, supported years, sources and verification status by year.

GET /v1/regions

{
  "data": [
    {
      "code": "PR",
      "name": "Puerto Rico",
      "defaultCalendar": "government",
      "years": {
        "min": 2000,
        "max": 2100
      }
    }
  ]
}

Try it on Apify →

GET/v1/pr/municipios · Puerto Rico municipios

All 78 municipios with their Census code, official name (with accents), ASCII name and slug. /v1/pr/municipios/{id} finds one by code or name; accents and case do not matter.

GET /v1/pr/municipios/mayaguez

{
  "data": {
    "code": "72097",
    "name": "Mayagüez",
    "nameAscii": "Mayaguez",
    "slug": "mayaguez"
  },
  "meta": {
    "dataset": "pr-municipios",
    "verificationStatus": "official"
  }
}

Try it on Apify →

GET/v1/pr/zip/{zip} · Puerto Rico ZIP code to municipio

Every municipio a ZIP code covers, with its land-area share and the primary one marked. Based on 2020 Census ZIP Code Tabulation Areas, which closely approximate USPS ZIP codes.

GET /v1/pr/zip/00680

{
  "data": {
    "zip": "00680",
    "municipios": [
      {
        "code": "72097",
        "name": "Mayagüez",
        "share": 0.9415,
        "primary": true
      },
      {
        "code": "72125",
        "name": "San Germán",
        "share": 0.0343,
        "primary": false
      },
      {
        "code": "72011",
        "name": "Añasco",
        "share": 0.0241,
        "primary": false
      }
    ]
  }
}

Try it on Apify →

GET/v1/pr/ivu · Puerto Rico IVU rates

Sales and use tax rates with the section of the Código de Rentas Internas behind each one: state 10.5%, municipal 1%, total 11.5%, and 4% on services to other merchants and designated professional services. General information, not tax advice.

GET /v1/pr/ivu

{
  "data": {
    "rates": [
      {
        "id": "state",
        "percent": 10.5,
        "components": [
          {
            "percent": 6,
            "citation": "Código de Rentas Internas de 2011, Sec. 4020.01(b)"
          },
          {
            "percent": 4.5,
            "citation": "Código de Rentas Internas de 2011, Sec. 4210.01(b) (surcharge, \"sobretasa\")"
          }
        ]
      },
      {
        "id": "municipal",
        "percent": 1,
        "components": [
          {
            "percent": 1,
            "citation": "Código de Rentas Internas de 2011, Sec. 6080.14(a)"
          }
        ]
      }
    ]
  }
}

Try it on Apify →

Errors

Invalid parameters return 400 VALIDATION_ERROR with a list of the parameters to fix. Unknown routes, municipios or ZIP codes return 404 NOT_FOUND. When your Apify spending limit is reached, the API returns 402 LIMIT_REACHED.

Results come from law and published schedules and may differ from a specific year's proclamation. Every response says so in meta.note.

Frequently asked questions

How do I check if a date is a business day in JavaScript?

Call /v1/is-business-day with the date and region (for example, PR) and read data.isBusinessDay. The example above uses fetch with your Apify token.

How do I calculate a payroll or delivery date in business days?

Use /v1/business-days/add with the start date, the number of days and the calendar (federal, banking, government or state). For ACH settlement dates, use calendar=banking.

Is there a JSON example of the holidays API?

Yes. Every endpoint above shows a real request and its JSON response. Responses are { data, meta }; errors are { error: { code, message, details } }.