Polystash
ContentsAuthenticationThe coverage field

API reference

Public holidays and business-day arithmetic for 200+ countries and territories, with regional coverage: state, province and canton level holidays for 20 countries via ISO 3166-2 subdivision codes. Calendars are precomputed for 2000 through 2060 from curated open data. Every country in GET /countries carries a coverage flag (full or partial) so you can tell where the national list is known to be incomplete. Settlement Calendar adds exchange sessions, T+0 through T+3 arithmetic, and payment scheme value dates under /v1/markets, /v1/settlement, /v1/valuedate and /v1/schemes.

Base URL: https://api.polystash.com. Machine-readable spec: /openapi.json.

Authentication

Requests go through RapidAPI. Send your RapidAPI key on every request as the X-RapidAPI-Key header, together with the X-RapidAPI-Host header for this API. RapidAPI forwards the call and counts it against your plan.

X-RapidAPI-Key: YOUR_RAPIDAPI_KEY
X-RapidAPI-Host: api.polystash.com

Keys are issued and rotated on RapidAPI: Subscribe on RapidAPI.

The coverage field

Is coverage the same for every country?

No, and the API says so. Every entry in /countries carries a coverage field: full means the national list is complete and reviewed through 2060; partial means the national list is known to be incomplete or lunar-calendar holidays are missing for some years. India, Thailand and Malaysia are partial today and are being upgraded. Check the flag before relying on a country for payroll or legal deadlines.

Business Days and Holidays

GET /countries

List supported countries

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/countries'

Example response

[
  {
    "code": "DE",
    "name": "DE",
    "regionCount": 16,
    "coverage": "full"
  },
  {
    "code": "IN",
    "name": "IN",
    "regionCount": 35,
    "coverage": "partial"
  },
  {
    "code": "US",
    "name": "US",
    "regionCount": 37,
    "coverage": "full"
  }
]

GET /v1/holidays/{country}/{year}

Holidays for a country and year

Parameters

NameInRequiredDescriptionExample
country path yes US
year path yes 2026
region query no ISO 3166-2 subdivision code, e.g. US-TX US-TX
type query no Comma-separated holiday types: public,bank,school,authorities,optional,observance. Matches any requested type (OR); whitespace is trimmed. Takes precedence over types when both are supplied. public,optional
types query no Alias for type: comma-separated holiday types with OR semantics. Used only when type is absent.
lang query no Preferred name language (falls back to English) local

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/holidays/US/2026?region=US-TX&type=public%2Coptional&lang=local'

GET /v1/holidays/{country}/{year}.ics

iCalendar holidays for a country and year

RFC 5545 VCALENDAR with one all-day VEVENT per holiday on its observed date. English SUMMARY, local name and types in DESCRIPTION, exclusive next-day DTEND, and UID <id>@polystash.com. Uses CRLF and UTF-8 lines folded at 75 octets.

Parameters

NameInRequiredDescriptionExample
country path yes DE
year path yes 2027
region query no ISO 3166-2 subdivision code; includes nationwide holidays DE-BY

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/holidays/DE/2027.ics?region=DE-BY'

GET /v1/holidays/{country}.ics

iCalendar holidays over a range of years

Same all-day VEVENT format as the year feed. Defaults to the current UTC year through current year + 2. The range is inclusive and may contain at most five years. Years absent from the country data contribute no events.

Parameters

NameInRequiredDescriptionExample
country path yes US
from query no First year, inclusive; defaults to the current UTC year 2027
to query no Last year, inclusive; defaults to current UTC year + 2 2029
region query no ISO 3166-2 subdivision code; includes nationwide holidays US-TX

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/holidays/US.ics?from=2027&to=2029&region=US-TX'

GET /v1/businessdays/sla

Calculate an SLA deadline in business days or working hours

All arithmetic uses local wall-clock dates in start's fixed offset; no DST adjustment. Uses the country's weekend and country/region holidays. For days, first roll a non-business start to the next business day at dayStart, then advance offset business days, preserving time. For hours, snap to a working period and count only within [dayStart, dayEnd), carrying remainder forward; a deadline may equal dayEnd. Missing calendar years have no known holidays.

Parameters

NameInRequiredDescriptionExample
country query yes DE
region query no DE-BY
start query yes ISO 8601 YYYY-MM-DDTHH:MM[:SS[.sss]] followed by Z or +/-HH:MM. Seconds are optional; up to three fractional digits. Encode a positive offset's + as %2B. 2027-03-05T16:40:00+01:00
offset query yes Positive safe integer in decimal digits. Deadlines beyond ISO year 9999 return INVALID_OFFSET. 2
unit query yes hours
dayStart query no Opening time; must precede dayEnd
dayEnd query no Exclusive closing time; overnight windows are not supported

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/businessdays/sla?country=DE&region=DE-BY&start=2027-03-05T16%3A40%3A00%2B01%3A00&offset=2&unit=hours'

GET /v1/businessdays/add

Add N business days to a date

Parameters

NameInRequiredDescriptionExample
country query yes US
date query yes 2026-07-02
days query yes Positive or negative, non-zero 10
region query no US-TX

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/businessdays/add?country=US&date=2026-07-02&days=10&region=US-TX'

GET /v1/businessdays/between

Count business days between two dates

Parameters

NameInRequiredDescriptionExample
country query yes DE
start query yes 2026-12-20
end query yes 2027-01-10
region query no

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/businessdays/between?country=DE&start=2026-12-20&end=2027-01-10'

Settlement Calendar and Payment Value Dates

GET /v1/markets

List exchange calendars

31 MICs: 26 generated for 2000–2060; XHKG through 2049, XKRX through 2050, and XSES/XBOM/XSHG through 2026. XCBO is absent upstream and omitted. Exchange coverage full means the upstream rules generate the entire range; future ad hoc closures and rule changes require regeneration. The timezone is the upstream trading clock (XBOG uses America/New_York).

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/markets'

Example response

[
  {
    "mic": "BVMF",
    "name": "B3 Brasil Bolsa Balcao",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "America/Sao_Paulo"
  },
  {
    "mic": "XAMS",
    "name": "Euronext Amsterdam",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Amsterdam"
  },
  {
    "mic": "XASX",
    "name": "Australian Securities Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Australia/Sydney"
  },
  {
    "mic": "XBOG",
    "name": "Colombia Stock Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "America/New_York"
  },
  {
    "mic": "XBOM",
    "name": "BSE India",
    "coverage": "partial",
    "from": "2000-01-01",
    "to": "2026-12-31",
    "timezone": "Asia/Kolkata"
  },
  {
    "mic": "XBRU",
    "name": "Euronext Brussels",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Brussels"
  },
  {
    "mic": "XCSE",
    "name": "Nasdaq Copenhagen",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Copenhagen"
  },
  {
    "mic": "XDUB",
    "name": "Euronext Dublin",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Dublin"
  },
  {
    "mic": "XETR",
    "name": "Xetra",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Berlin"
  },
  {
    "mic": "XHEL",
    "name": "Nasdaq Helsinki",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Helsinki"
  },
  {
    "mic": "XHKG",
    "name": "Hong Kong Stock Exchange",
    "coverage": "partial",
    "from": "2000-01-01",
    "to": "2049-12-31",
    "timezone": "Asia/Hong_Kong"
  },
  {
    "mic": "XJSE",
    "name": "Johannesburg Stock Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Africa/Johannesburg"
  },
  {
    "mic": "XKRX",
    "name": "Korea Exchange",
    "coverage": "partial",
    "from": "2000-01-01",
    "to": "2050-12-31",
    "timezone": "Asia/Seoul"
  },
  {
    "mic": "XLIS",
    "name": "Euronext Lisbon",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Lisbon"
  },
  {
    "mic": "XLON",
    "name": "London Stock Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/London"
  },
  {
    "mic": "XMAD",
    "name": "Bolsa de Madrid",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Madrid"
  },
  {
    "mic": "XMEX",
    "name": "Mexican Stock Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "America/Mexico_City"
  },
  {
    "mic": "XMIL",
    "name": "Borsa Italiana",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Rome"
  },
  {
    "mic": "XNAS",
    "name": "Nasdaq Stock Market",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "America/New_York"
  },
  {
    "mic": "XNYS",
    "name": "New York Stock Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "America/New_York"
  },
  {
    "mic": "XNZE",
    "name": "New Zealand Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Pacific/Auckland"
  },
  {
    "mic": "XOSL",
    "name": "Oslo Bors",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Oslo"
  },
  {
    "mic": "XPAR",
    "name": "Euronext Paris",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Paris"
  },
  {
    "mic": "XSES",
    "name": "Singapore Exchange",
    "coverage": "partial",
    "from": "2000-01-01",
    "to": "2026-12-31",
    "timezone": "Asia/Singapore"
  },
  {
    "mic": "XSHG",
    "name": "Shanghai Stock Exchange",
    "coverage": "partial",
    "from": "2000-01-01",
    "to": "2026-12-31",
    "timezone": "Asia/Shanghai"
  },
  {
    "mic": "XSTO",
    "name": "Nasdaq Stockholm",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Stockholm"
  },
  {
    "mic": "XSWX",
    "name": "SIX Swiss Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Zurich"
  },
  {
    "mic": "XTAE",
    "name": "Tel Aviv Stock Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Asia/Tel_Aviv"
  },
  {
    "mic": "XTKS",
    "name": "Tokyo Stock Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Asia/Tokyo"
  },
  {
    "mic": "XTSE",
    "name": "Toronto Stock Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "America/Toronto"
  },
  {
    "mic": "XWBO",
    "name": "Vienna Stock Exchange",
    "coverage": "full",
    "from": "2000-01-01",
    "to": "2060-12-31",
    "timezone": "Europe/Vienna"
  }
]

GET /v1/markets/{mic}/holidays

Exchange holidays and early closes

Precomputed actual exchange closures, with a name only where upstream exposes one. Includes named weekend holidays; ordinary weekends are implicit. Early closes include local close times. Unavailable years return OUT_OF_COVERAGE.

Parameters

NameInRequiredDescriptionExample
mic path yes MIC, case-insensitive. XNAS uses the upstream XNYS alias. XCBO is unavailable. XNYS
year query yes Required year within the calendar’s coverage. 2027

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/markets/XNYS/holidays?year=2027'

Example response

{
  "mic": "XNYS",
  "timezone": "America/New_York",
  "year": 2027,
  "count": 10,
  "holidays": [
    {
      "date": "2027-01-01",
      "name": "New Year's Day"
    },
    {
      "date": "2027-01-18",
      "name": "Dr. Martin Luther King Jr. Day"
    },
    {
      "date": "2027-02-15",
      "name": "President's Day"
    },
    {
      "date": "2027-03-26",
      "name": "Good Friday"
    },
    {
      "date": "2027-05-31",
      "name": "Memorial Day"
    },
    {
      "date": "2027-06-18",
      "name": "Juneteenth National Independence Day"
    },
    {
      "date": "2027-07-05",
      "name": "July 4th"
    },
    {
      "date": "2027-09-06",
      "name": "Labor Day"
    },
    {
      "date": "2027-11-25",
      "name": "Thanksgiving"
    },
    {
      "date": "2027-12-24",
      "name": "Christmas"
    }
  ],
  "earlyCloses": [
    {
      "date": "2027-11-26",
      "close": "13:00"
    }
  ]
}

GET /v1/markets/{mic}/sessions

Exchange trading sessions

Inclusive date range shorter than from + one calendar year (a complete leap year is allowed). Returns only trading days. Local clock times accompany ISO datetimes with the IANA timezone’s actual offset, including DST. Breaks, early closes, late opens and historical changes follow the upstream regular trading segment; extended sessions and product-specific auctions are outside this calendar.

Parameters

NameInRequiredDescriptionExample
mic path yes MIC, case-insensitive. XNAS uses the upstream XNYS alias. XCBO is unavailable. XNYS
from query yes 2027-11-25
to query yes 2027-11-28

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/markets/XNYS/sessions?from=2027-11-25&to=2027-11-28'

Example response

{
  "mic": "XNYS",
  "timezone": "America/New_York",
  "from": "2027-11-25",
  "to": "2027-11-28",
  "count": 1,
  "sessions": [
    {
      "date": "2027-11-26",
      "openLocal": "09:30",
      "closeLocal": "13:00",
      "open": "2027-11-26T09:30:00-05:00",
      "close": "2027-11-26T13:00:00-05:00",
      "breakStart": null,
      "breakEnd": null,
      "earlyClose": true
    }
  ]
}

GET /v1/markets/{mic}/is-open

Exchange status at an instant

datetime must include Z or +/-HH:MM; positive offsets must be URL-encoded. Converted to the exchange timezone before choosing the calendar date. Trading intervals include opening and exclude closing; lunch breaks are closed. nextOpen/nextClose are strictly future interval boundaries, including lunch resumption/start, or null when no boundary is known within coverage. When already open, nextOpen is the next interval’s opening.

Parameters

NameInRequiredDescriptionExample
mic path yes MIC, case-insensitive. XNAS uses the upstream XNYS alias. XCBO is unavailable. XNYS
datetime query yes 2027-03-26T15:00:00Z

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/markets/XNYS/is-open?datetime=2027-03-26T15%3A00%3A00Z'

Example response

{
  "open": false,
  "reason": "holiday",
  "nextOpen": "2027-03-29T09:30:00-04:00",
  "nextClose": "2027-03-29T16:00:00-04:00"
}

GET /v1/markets/{mic}/calendar.ics

Exchange holiday and early-close iCalendar

Reuses the holiday API’s RFC 5545 all-day events, CRLF, TEXT escaping and UTF-8 folding at 75 octets. Early-close events include local closing time and timezone in SUMMARY. Use year, or inclusive from/to years (at most five); defaults to current UTC year through current year + 2. The complete requested range must be covered; partial calendars are not silently truncated. UIDs contain MIC, date and event kind.

Parameters

NameInRequiredDescriptionExample
mic path yes MIC, case-insensitive. XNAS uses the upstream XNYS alias. XCBO is unavailable. XNYS
year query no Single year; mutually exclusive with from/to. 2027
from query no First year, inclusive; default current UTC year.
to query no Last year, inclusive; default current UTC year + 2.

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/markets/XNYS/calendar.ics?year=2027'

POST /v1/settlement

Calculate an exchange settlement date

tradeDate must itself be a trading day (otherwise NON_TRADING_DAY, including T+0). Count cycle subsequent exchange trading days; early closes count as business days. T+0 returns tradeDate. Holidays on weekends count only as weekends. This is explicitly exchange-calendar arithmetic; separate securities depository, clearinghouse, currency and instrument settlement rules are not applied. Any result beyond coverage returns OUT_OF_COVERAGE.

JSON request body

NameInRequiredDescriptionExample
tradeDate body yes Exchange-local trading date. 2027-05-28
mic body yes MIC, case-insensitive. XNYS
cycle body yes Number of subsequent exchange trading days. T+1

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     -X POST \
     -H 'Content-Type: application/json' \
     --data-raw '{"tradeDate":"2027-05-28","mic":"XNYS","cycle":"T+1"}' \
     'https://api.polystash.com/v1/settlement'

Example response

{
  "settlementDate": "2027-06-01",
  "businessDaysCounted": 1,
  "holidaysSkipped": 1,
  "weekendDaysSkipped": 2
}

POST /v1/valuedate

Calculate a payment value date

Convert initiatedAt to the scheme’s IANA timezone. Calendar estimate using the published operating profile, applied consistently across 2000–2060, not a historical reconstruction of service availability or operating hours. TARGET/FEDWIRE/CHAPS use same eligible day; ACH models eligible same-day ACH with three submission windows; BACS uses input, processing, entry (two further business days); standard SEPA uses D+1 TARGET day after acceptance. SEPA default cutoff is 16:00 Europe/Brussels (CET/CEST), a configurable bank assumption. SEPA_INST is 24/7/365 and returns the same Europe/Brussels calendar date with nextCutoff null. Deadlines are exclusive. Fedwire’s published 19:00 cutoff includes the whole minute (operating-hours footnote 2); its effective boundary and nextCutoff are 19:01. Earlier bank overrides are exclusive. The 19:00 Fedwire and 18:00 CHAPS deadlines are system closing times; customer/bank deadlines can be earlier. Scheme directory includes source URLs and profile limitations.

JSON request body

NameInRequiredDescriptionExample
initiatedAt body yes Valid ISO datetime with Z or +/-HH:MM; converted to the scheme timezone. 2027-03-05T19:30:00-05:00
scheme body yes Scheme identifier; request matching is case-insensitive. FEDWIRE
cutoff body no Optional local HH:MM bank cutoff. SEPA default 16:00 Europe/Brussels (CET/CEST). Other defaults are in GET /v1/schemes. Overrides cannot extend a system deadline and are rejected for SEPA_INST.

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     -X POST \
     -H 'Content-Type: application/json' \
     --data-raw '{"initiatedAt":"2027-03-05T19:30:00-05:00","scheme":"FEDWIRE"}' \
     'https://api.polystash.com/v1/valuedate'

Example response

{
  "valueDate": "2027-03-08",
  "cutoffHit": true,
  "nextCutoff": "2027-03-08T19:01:00-05:00",
  "closuresSkipped": 2,
  "reason": "cutoff"
}

GET /v1/schemes

List payment scheme profiles

Seven scheme profiles, including timezones, cycle length, default/system cutoffs, same-day ACH windows, source citations and limitations. Dates represent generated calendar rules; modern service profiles are projected onto the full range, including years before service launch.

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/schemes'

Example response

[
  {
    "from": "2000-01-01",
    "to": "2060-12-31",
    "weekend": [
      6,
      7
    ],
    "settlementDays": 0,
    "cutoffKind": "scheme",
    "scheme": "TARGET",
    "name": "TARGET T2 RTGS",
    "timezone": "Europe/Brussels",
    "cutoff": "18:00",
    "sources": [
      {
        "url": "https://www.ecb.europa.eu/paym/target/t2/html/index.en.html",
        "accessed": "2026-09-13",
        "rules": "TARGET closing days: Saturdays, Sundays, 1 January, Good Friday, Easter Monday, 1 May, 25 December and 26 December."
      },
      {
        "url": "https://www.ecb.europa.eu/paym/target/shared/pdf/TARGET_System_operating_schedule.en.pdf",
        "accessed": "2026-09-13",
        "rules": "Page 1, Figure 1: RTGS interbank payments end at 18:00 Central European time; customer payments end at 17:00."
      }
    ],
    "notes": [
      "Current operating profile applied consistently to all generated years; not a historical reconstruction of service availability or bank acceptance times.",
      "18:00 is the interbank payment close; customer payments close at 17:00. This profile uses the requested six TARGET closing days throughout 2000–2060."
    ]
  },
  {
    "from": "2000-01-01",
    "to": "2060-12-31",
    "weekend": [
      6,
      7
    ],
    "settlementDays": 0,
    "cutoffKind": "scheme",
    "scheme": "FEDWIRE",
    "name": "Fedwire Funds Service",
    "timezone": "America/New_York",
    "cutoff": "19:00",
    "cutoffInclusiveMinute": true,
    "sources": [
      {
        "url": "https://www.frbservices.org/about/holiday-schedules",
        "accessed": "2026-09-13",
        "rules": "Federal Reserve holiday schedule: Saturday holidays do not close the preceding Friday; Sunday holidays close the following Monday."
      },
      {
        "url": "https://www.govinfo.gov/content/pkg/PLAW-117publ17/pdf/PLAW-117publ17.pdf",
        "accessed": "2026-09-13",
        "rules": "Public Law 117-17, approved 17 June 2021, adds Juneteenth National Independence Day, June 19, to 5 USC 6103(a). Applied from 2021 using Reserve Bank weekend observance."
      },
      {
        "url": "https://www.frbservices.org/resources/financial-services/wires/operating-hours.html",
        "accessed": "2026-09-13",
        "rules": "Processing Times: bank transfers close at 19:00 Eastern; customer transfers at 18:45. Footnote 2 includes the entire listed cutoff minute, so the 19:00 window ends immediately before 19:01."
      }
    ],
    "notes": [
      "Current operating profile applied consistently to all generated years; not a historical reconstruction of service availability or bank acceptance times.",
      "19:00 is the published bank-transfer close and includes that entire minute. The effective exclusive boundary returned as nextCutoff is 19:01. A cutoff override earlier than the published close is treated as an exclusive bank deadline.",
      "Customer transfers close at 18:45; pass the applicable bank cutoff. Uses the local civil date for the requested cutoff model; overnight next-business-day opening and message-type-specific deadlines are not automatically selected."
    ]
  },
  {
    "from": "2000-01-01",
    "to": "2060-12-31",
    "weekend": [
      6,
      7
    ],
    "settlementDays": 0,
    "cutoffKind": "scheme",
    "scheme": "ACH",
    "name": "FedACH Same Day ACH",
    "timezone": "America/New_York",
    "cutoff": "16:45",
    "sources": [
      {
        "url": "https://www.frbservices.org/about/holiday-schedules",
        "accessed": "2026-09-13",
        "rules": "Federal Reserve holiday schedule: Saturday holidays do not close the preceding Friday; Sunday holidays close the following Monday."
      },
      {
        "url": "https://www.govinfo.gov/content/pkg/PLAW-117publ17/pdf/PLAW-117publ17.pdf",
        "accessed": "2026-09-13",
        "rules": "Public Law 117-17, approved 17 June 2021, adds Juneteenth National Independence Day, June 19, to 5 USC 6103(a). Applied from 2021 using Reserve Bank weekend observance."
      },
      {
        "url": "https://www.frbservices.org/resources/resource-centers/same-day-ach/fedach-processing-schedule.html",
        "accessed": "2026-09-13",
        "rules": "Same Day Eligible Forward Items, schedule effective 12 September 2022: input deadlines 10:30, 14:45 and 16:45 Eastern; settlement at 13:00, 17:00 and 18:00 respectively. Files must be completely received by the transmission deadline."
      }
    ],
    "windows": [
      {
        "cutoff": "10:30",
        "settlement": "13:00"
      },
      {
        "cutoff": "14:45",
        "settlement": "17:00"
      },
      {
        "cutoff": "16:45",
        "settlement": "18:00"
      }
    ],
    "notes": [
      "Current operating profile applied consistently to all generated years; not a historical reconstruction of service availability or bank acceptance times.",
      "Models eligible same-day ACH transactions. Amount/type eligibility, bank-specific deadlines, returns and standard next-day ACH are not inferred from this request body."
    ]
  },
  {
    "from": "2000-01-01",
    "to": "2060-12-31",
    "weekend": [
      6,
      7
    ],
    "settlementDays": 2,
    "cutoffKind": "scheme",
    "scheme": "BACS",
    "name": "Bacs Direct Credit",
    "timezone": "Europe/London",
    "cutoff": "22:30",
    "sources": [
      {
        "url": "https://www.gov.uk/bank-holidays",
        "accessed": "2026-09-13",
        "rules": "England and Wales bank holidays, including substitute weekdays and announced one-off holidays; excludes Scotland/Northern Ireland-only holidays."
      },
      {
        "url": "https://www.bacs.co.uk/media/cmuccdew/bdc-introduction.pdf",
        "accessed": "2026-09-13",
        "rules": "Bacs Direct Credit: An introduction to the service, page 6, section 3.2: input day 1 (transmission 07:00 to 22:30 UK time), processing day 2, entry/value day 3."
      },
      {
        "url": "https://www.bacs.co.uk/media/fzwnbjt4/bacs-processing-calendar-2026-landscape.pdf",
        "accessed": "2026-09-13",
        "rules": "Bacs 2026 processing calendar: weekends and England/Wales bank holidays are non-processing days. Submit ahead of the required input day; future unannounced one-off holidays require regeneration."
      }
    ],
    "notes": [
      "Current operating profile applied consistently to all generated years; not a historical reconstruction of service availability or bank acceptance times.",
      "Input day is day one, processing day day two, and entry/value day day three. 22:30 is the scheme input deadline; banks may require earlier submission.",
      "England/Wales holidays reuse data/countries/GB.json with the existing attribution and known one-off dates."
    ]
  },
  {
    "from": "2000-01-01",
    "to": "2060-12-31",
    "weekend": [
      6,
      7
    ],
    "settlementDays": 0,
    "cutoffKind": "scheme",
    "scheme": "CHAPS",
    "name": "CHAPS",
    "timezone": "Europe/London",
    "cutoff": "18:00",
    "sources": [
      {
        "url": "https://www.gov.uk/bank-holidays",
        "accessed": "2026-09-13",
        "rules": "England and Wales bank holidays, including substitute weekdays and announced one-off holidays; excludes Scotland/Northern Ireland-only holidays."
      },
      {
        "url": "https://www.bankofengland.co.uk/-/media/boe/files/payments/chaps/chaps-reference-manual.pdf",
        "accessed": "2026-09-13",
        "rules": "CHAPS Reference Manual, page 54, sections 36.1-36.5: London time; financial institution transfers by 18:00, customer transfers by 17:40. Page 74: Business Day excludes Saturday/Sunday and requires banks open in London. Emergency extensions are outside this fixed profile."
      }
    ],
    "notes": [
      "Current operating profile applied consistently to all generated years; not a historical reconstruction of service availability or bank acceptance times.",
      "18:00 is the financial-institution-transfer deadline; the customer-transfer deadline is 17:40 and banks may set earlier cutoffs.",
      "England/Wales holidays reuse data/countries/GB.json with the existing attribution and known one-off dates."
    ]
  },
  {
    "from": "2000-01-01",
    "to": "2060-12-31",
    "weekend": [
      6,
      7
    ],
    "settlementDays": 1,
    "cutoffKind": "default",
    "scheme": "SEPA",
    "name": "SEPA Credit Transfer",
    "timezone": "Europe/Brussels",
    "cutoff": "16:00",
    "sources": [
      {
        "url": "https://www.ecb.europa.eu/paym/target/t2/html/index.en.html",
        "accessed": "2026-09-13",
        "rules": "TARGET closing days: Saturdays, Sundays, 1 January, Good Friday, Easter Monday, 1 May, 25 December and 26 December."
      },
      {
        "url": "https://www.europeanpaymentscouncil.eu/sites/default/files/kb/file/2025-09/EPC125-05%202025%20SCT%20Rulebook%20version%201.1.pdf",
        "accessed": "2026-09-13",
        "rules": "2025 SCT Rulebook v1.1: sections 4.2.1-4.2.3 (pages 26-27) define acceptance, PSP-advised cutoffs outside the rulebook, and maximum D+1 execution. Defined terms (page 82): Banking Business Day equals a T2 day for inter-PSP execution."
      }
    ],
    "notes": [
      "Current operating profile applied consistently to all generated years; not a historical reconstruction of service availability or bank acceptance times.",
      "16:00 Europe/Brussels (CET/CEST) is an API default for an unspecified bank, not a scheme-mandated cutoff; pass cutoff to override it.",
      "Standard electronic SCT modeled as D+1 TARGET day after acceptance; bank holidays, early execution and channel-specific terms are not inferred."
    ]
  },
  {
    "from": "2000-01-01",
    "to": "2060-12-31",
    "weekend": [],
    "settlementDays": 0,
    "cutoffKind": "none",
    "scheme": "SEPA_INST",
    "name": "SEPA Instant Credit Transfer",
    "timezone": "Europe/Brussels",
    "cutoff": null,
    "sources": [
      {
        "url": "https://www.europeanpaymentscouncil.eu/what-we-do/sepa-instant-credit-transfer",
        "accessed": "2026-09-13",
        "rules": "SEPA Instant Credit Transfer operates 24 hours a day, every day of the year."
      }
    ],
    "notes": [
      "Current operating profile applied consistently to all generated years; not a historical reconstruction of service availability or bank acceptance times.",
      "24/7/365; valueDate is the initiation date after conversion to Europe/Brussels. No cutoff. Availability of an individual bank is outside the calendar model."
    ]
  }
]

GET /v1/schemes/{scheme}/closures

Payment scheme closing dates

Named non-settlement dates for one year, plus the recurring ISO weekend definition (Monday 1 … Sunday 7). Ordinary weekends are implicit; named weekend holidays are retained. Federal Reserve Saturday holidays do not close Friday; Sunday holidays close Monday. BACS/CHAPS use England and Wales, including observed substitutes and known one-off bank holidays. SEPA_INST returns empty closures and weekend arrays.

Parameters

NameInRequiredDescriptionExample
scheme path yes TARGET
year query yes Required year within the calendar’s coverage. 2027

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/schemes/TARGET/closures?year=2027'

Example response

{
  "scheme": "TARGET",
  "timezone": "Europe/Brussels",
  "year": 2027,
  "weekend": [
    6,
    7
  ],
  "count": 6,
  "closures": [
    {
      "date": "2027-01-01",
      "name": "New Year's Day"
    },
    {
      "date": "2027-03-26",
      "name": "Good Friday"
    },
    {
      "date": "2027-03-29",
      "name": "Easter Monday"
    },
    {
      "date": "2027-05-01",
      "name": "Labour Day"
    },
    {
      "date": "2027-12-25",
      "name": "Christmas Day"
    },
    {
      "date": "2027-12-26",
      "name": "26 December"
    }
  ]
}

Sales Tax Due Dates

US state sales-tax filing due dates by state and filing frequency, rolled past weekends and state holidays.

GET /v1/salestax/states

Sales tax filing rules for every state

The 45 states with a state sales tax plus the District of Columbia, each with the filing frequencies it offers and the due-day rule for each, and the five states with no state sales tax carrying no frequencies at all. Every record names the state revenue department page it was taken from and the date it was checked.

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/salestax/states'

Example response

{
  "checked": "2026-09-14",
  "count": 51,
  "states": [
    {
      "state": "NY",
      "name": "New York",
      "salesTax": true,
      "holidayRegion": "US-NY",
      "rollRule": "next_business_day",
      "source": "https://www.tax.ny.gov/pubs_and_bulls/tg_bulletins/st/filing_requirements_for_sales_and_use_tax_returns.htm",
      "checked": "2026-09-14",
      "verified": true,
      "frequencies": [
        {
          "frequency": "monthly",
          "rule": "day_of_month_after_period_end",
          "dueDay": 20,
          "description": "Part-quarterly (monthly) returns are due no later than 20 days after the end of the period to which they relate.",
          "periodEndMonths": [
            1,
            2,
            3,
            4,
            5,
            6,
            7,
            8,
            9,
            10,
            11,
            12
          ],
          "periodFormat": "YYYY-MM"
        },
        {
          "frequency": "quarterly",
          "rule": "day_of_month_after_period_end",
          "dueDay": 20,
          "description": "Quarterly returns are due no later than 20 days after the end of the quarter to which they relate; the sales tax quarters end February 28/29, May 31, August 31 and November 30.",
          "periodEndMonths": [
            2,
            5,
            8,
            11
          ],
          "periodFormat": "YYYY-Qn"
        },
        {
          "frequency": "annual",
          "rule": "day_of_month_after_period_end",
          "dueDay": 20,
          "description": "The annual return covers March 1 through February 28/29 and is due by March 20 each year.",
          "periodEndMonths": [
            2
          ],
          "periodFormat": "YYYY"
        }
      ]
    },
    {
      "state": "OH",
      "name": "Ohio",
      "salesTax": true,
      "holidayRegion": "US-OH",
      "rollRule": "next_business_day",
      "source": "https://dam.assets.ohio.gov/image/upload/tax.ohio.gov/business/Ohio%20Small%20Business%20Tax%20Guide_Rev2.24.pdf",
      "checked": "2026-09-14",
      "verified": true,
      "frequencies": [
        {
          "frequency": "monthly",
          "rule": "day_of_month_after_period_end",
          "dueDay": 23,
          "description": "The UST-1 must be filed and paid by the 23rd day of the month following the reporting period.",
          "periodEndMonths": [
            1,
            2,
            3,
            4,
            5,
            6,
            7,
            8,
            9,
            10,
            11,
            12
          ],
          "periodFormat": "YYYY-MM"
        },
        {
          "frequency": "semiannual",
          "rule": "day_of_month_after_period_end",
          "dueDay": 23,
          "description": "Due by the 23rd day of the month following the close of each semiannual period: July 23 for January 1 through June 30, and January 23 for July 1 through December 31.",
          "periodEndMonths": [
            6,
            12
          ],
          "periodFormat": "YYYY-Hn"
        }
      ]
    },
    {
      "state": "TX",
      "name": "Texas",
      "salesTax": true,
      "holidayRegion": "US-TX",
      "rollRule": "next_business_day",
      "source": "https://comptroller.texas.gov/taxes/file-pay/due-dates.php",
      "checked": "2026-09-14",
      "verified": true,
      "frequencies": [
        {
          "frequency": "monthly",
          "rule": "day_of_month_after_period_end",
          "dueDay": 20,
          "description": "Reports are due on the 20th of the month following the reporting month.",
          "periodEndMonths": [
            1,
            2,
            3,
            4,
            5,
            6,
            7,
            8,
            9,
            10,
            11,
            12
          ],
          "periodFormat": "YYYY-MM"
        },
        {
          "frequency": "quarterly",
          "rule": "day_of_month_after_period_end",
          "dueDay": 20,
          "description": "Reports are due April 20, July 20, October 20 and January 20 for the preceding quarter.",
          "periodEndMonths": [
            3,
            6,
            9,
            12
          ],
          "periodFormat": "YYYY-Qn"
        },
        {
          "frequency": "annual",
          "rule": "day_of_month_after_period_end",
          "dueDay": 20,
          "description": "For yearly filers, reports of sales for the previous year are due on January 20.",
          "periodEndMonths": [
            12
          ],
          "periodFormat": "YYYY"
        }
      ]
    }
  ]
}

GET /v1/salestax/states/{state}

One state's filing rules and source

The same record as the list, with the state's roll note and any caveat about the source.

Parameters

NameInRequiredDescriptionExample
state path yes Two-letter USPS code, case-insensitive. TX

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/salestax/states/TX'

Example response

{
  "state": "TX",
  "name": "Texas",
  "salesTax": true,
  "holidayRegion": "US-TX",
  "rollRule": "next_business_day",
  "source": "https://comptroller.texas.gov/taxes/file-pay/due-dates.php",
  "checked": "2026-09-14",
  "verified": true,
  "frequencies": [
    {
      "frequency": "monthly",
      "rule": "day_of_month_after_period_end",
      "dueDay": 20,
      "description": "Reports are due on the 20th of the month following the reporting month.",
      "periodEndMonths": [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12
      ],
      "periodFormat": "YYYY-MM"
    },
    {
      "frequency": "quarterly",
      "rule": "day_of_month_after_period_end",
      "dueDay": 20,
      "description": "Reports are due April 20, July 20, October 20 and January 20 for the preceding quarter.",
      "periodEndMonths": [
        3,
        6,
        9,
        12
      ],
      "periodFormat": "YYYY-Qn"
    },
    {
      "frequency": "annual",
      "rule": "day_of_month_after_period_end",
      "dueDay": 20,
      "description": "For yearly filers, reports of sales for the previous year are due on January 20.",
      "periodEndMonths": [
        12
      ],
      "periodFormat": "YYYY"
    }
  ],
  "rollNote": "The Comptroller's due-dates page: \"When a reporting due date happens to fall on Saturday, Sunday, or a federal legal holiday, the reporting due date becomes the next business day.\"",
  "note": "Monthly and quarterly prepayment filers have a separate 15th-of-the-month schedule, which is out of scope here."
}

GET /v1/salestax/due

The due date for one filing period

Returns the statutory date the state's rule produces, the date the return is actually due once weekends and holidays are applied, and every day passed over on the way. State holidays are taken from the holiday dataset's US regions, so a state that closes for Good Friday rolls and one that does not stays put. Periods are named by the month they close in: a state whose quarters end in February, May, August and November has 2026-Q1 ending 2026-02-28.

Parameters

NameInRequiredDescriptionExample
state query yes Two-letter USPS code, case-insensitive. TX
frequency query yes A frequency the state offers. Asking for one it does not offer returns UNSUPPORTED_FREQUENCY with the list it does. monthly
period query yes YYYY-MM for monthly, YYYY-Qn for quarterly, YYYY-Hn for semiannual, YYYY for annual. 2000 through 2060. 2026-08
from query no The date businessDaysAway counts from. Defaults to today.

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/salestax/due?state=TX&frequency=monthly&period=2026-08'

Example response

{
  "state": "TX",
  "name": "Texas",
  "frequency": "monthly",
  "rule": "day_of_month_after_period_end",
  "ruleDescription": "Reports are due on the 20th of the month following the reporting month.",
  "period": "2026-08",
  "periodStart": "2026-08-01",
  "periodEnd": "2026-08-31",
  "ruleDate": "2026-09-20",
  "dueDate": "2026-09-21",
  "rolled": true,
  "rollReason": "weekend",
  "skipped": [
    {
      "date": "2026-09-20",
      "reason": "weekend",
      "holiday": null
    }
  ],
  "businessDaysAway": 5,
  "from": "2026-09-14",
  "rollRule": "next_business_day",
  "holidayRegion": "US-TX",
  "source": "https://comptroller.texas.gov/taxes/file-pay/due-dates.php",
  "checked": "2026-09-14",
  "verified": true
}

GET /v1/salestax/next

The next due dates for a state and frequency

The next periods whose due date falls on or after from, each with the same fields the single-period lookup returns.

Parameters

NameInRequiredDescriptionExample
state query yes Two-letter USPS code, case-insensitive. TX
frequency query yes A frequency the state offers. Asking for one it does not offer returns UNSUPPORTED_FREQUENCY with the list it does. monthly
from query no The first date a due date may fall on. Defaults to today. 2026-09-14
count query no How many due dates to return, 1 through 24. 6

Example request

curl -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
     -H 'X-RapidAPI-Host: api.polystash.com' \
     'https://api.polystash.com/v1/salestax/next?state=TX&frequency=monthly&from=2026-09-14&count=6'

Example response

{
  "state": "TX",
  "name": "Texas",
  "frequency": "monthly",
  "rule": "day_of_month_after_period_end",
  "ruleDescription": "Reports are due on the 20th of the month following the reporting month.",
  "from": "2026-09-14",
  "count": 6,
  "rollRule": "next_business_day",
  "holidayRegion": "US-TX",
  "source": "https://comptroller.texas.gov/taxes/file-pay/due-dates.php",
  "checked": "2026-09-14",
  "verified": true,
  "dueDates": [
    {
      "period": "2026-08",
      "periodStart": "2026-08-01",
      "periodEnd": "2026-08-31",
      "ruleDate": "2026-09-20",
      "dueDate": "2026-09-21",
      "rolled": true,
      "rollReason": "weekend",
      "skipped": [
        {
          "date": "2026-09-20",
          "reason": "weekend",
          "holiday": null
        }
      ],
      "businessDaysAway": 5
    },
    {
      "period": "2026-09",
      "periodStart": "2026-09-01",
      "periodEnd": "2026-09-30",
      "ruleDate": "2026-10-20",
      "dueDate": "2026-10-20",
      "rolled": false,
      "rollReason": null,
      "skipped": [],
      "businessDaysAway": 26
    },
    {
      "period": "2026-10",
      "periodStart": "2026-10-01",
      "periodEnd": "2026-10-31",
      "ruleDate": "2026-11-20",
      "dueDate": "2026-11-20",
      "rolled": false,
      "rollReason": null,
      "skipped": [],
      "businessDaysAway": 48
    },
    {
      "period": "2026-11",
      "periodStart": "2026-11-01",
      "periodEnd": "2026-11-30",
      "ruleDate": "2026-12-20",
      "dueDate": "2026-12-21",
      "rolled": true,
      "rollReason": "weekend",
      "skipped": [
        {
          "date": "2026-12-20",
          "reason": "weekend",
          "holiday": null
        }
      ],
      "businessDaysAway": 68
    },
    {
      "period": "2026-12",
      "periodStart": "2026-12-01",
      "periodEnd": "2026-12-31",
      "ruleDate": "2027-01-20",
      "dueDate": "2027-01-20",
      "rolled": false,
      "rollReason": null,
      "skipped": [],
      "businessDaysAway": 87
    },
    {
      "period": "2027-01",
      "periodStart": "2027-01-01",
      "periodEnd": "2027-01-31",
      "ruleDate": "2027-02-20",
      "dueDate": "2027-02-22",
      "rolled": true,
      "rollReason": "weekend",
      "skipped": [
        {
          "date": "2027-02-20",
          "reason": "weekend",
          "holiday": null
        },
        {
          "date": "2027-02-21",
          "reason": "weekend",
          "holiday": null
        }
      ],
      "businessDaysAway": 109
    }
  ]
}

Sources

Holiday data derived from Nager.Date (MIT, source 2026-09-14) and date-holidays (ISC and CC BY 3.0). Business-day logic, regional coverage and the precomputed calendars are the work of Polystash.