https://api.veriko.mx/v1/public/spei-calendar/{year}Get the calendar of SPEI non-business days for a year
Returns the calendar of SPEI non-business days for a year, with the official provision it comes from.
The response includes:
non_business_days: The non-business days that fall from Monday to Friday, in order and inYYYY-MM-DDformat.source: The provision of the Comisión Nacional Bancaria y de Valores (CNBV) published in the Diario Oficial de la Federación (DOF), with its title and publication date.
Saturdays and Sundays are also non-business days, always, and are not repeated in non_business_days.
The calendar determines the operation day of a transfer. SPEI operates every day, but the business day changes at 18:00 (Mexico central time): what is sent from that hour on, on a Saturday, on a Sunday, or on a non-business day operates on the next business day. That day is the operationDate of banxico_result, and it can differ from the sending date.
The request does not consume validation quota. A year without a calendar responds with an HTTP status 404 (with spei_calendar_year_not_covered in the body), and meta.covered_years lists the available years. The calendar of each year is added when the CNBV publishes its provision, normally in December of the previous year.
The response is cacheable: it includes the ETag header, which can be sent in another request as If-None-Match; if the calendar has not changed, it returns an HTTP status 304 (no body).
The difference between the sending date and the operation date is in dates and time zone.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
year* | path | integer | required | Calendar year, four digits. e.g.2026 |
If-None-Match | header | string | optional | ETag received in a previous response, sent as is (weak "9b2d4c7e1f0a3b6d8e5c2a7f4b1d9e0c3a6f8b2d" |
curl -X GET 'https://api.veriko.mx/v1/public/spei-calendar/{year}'import requests
year = 2026
response = requests.get(f"https://api.veriko.mx/v1/public/spei-calendar/{year}")
print(response.json())
const year = 2026;
fetch(`https://api.veriko.mx/v1/public/spei-calendar/${year}`)
.then(response => response.json())
.then(data => console.log(data));
<?php
$year = 2026;
$ch = curl_init("https://api.veriko.mx/v1/public/spei-calendar/$year");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
| Field | Type | Description |
|---|---|---|
data | object | Main response payload. Shape varies by endpoint (object, array, or JSON:API envelope with |
type* | string | JSON:API resource type. Always spei_calendar |
id* | string | Calendar year (four digits). e.g.2026 |
attributes* | object | Data of the year's calendar. |
year* | integer | Calendar year (four digits). Same value as 2026 |
non_business_days* | array | Non-business days that fall from Monday to Friday ( ["2026-01-01","2026-02-02","2026-03-16","2026-04-02","2026-04-03","2026-05-01","2026-09-16","2026-11-02","2026-11-16","2026-12-25"] |
source* | object | Official provision the calendar comes from. |
issuer* | string | Acronym of the authority that issues the provision, for example CNBV |
published_in* | string | Acronym of the official gazette that published the provision, for example DOF |
published_on* | string (date) | Publication date of the provision ( 2025-12-10 |
title* | string | Official title of the provision, in Spanish. e.g.Disposiciones de carácter general que señalan los días del año 2026 en que las entidades financieras sujetas a la supervisión de la Comisión Nacional Bancaria y de Valores deberán cerrar sus puertas y suspender operaciones |
meta | object | Response metadata including API version, route prefix, unique request identifier, and the server timestamp in UTC. |
version | string | API version that processed the request. e.g.1.47.0 |
api_version | string | API route prefix version (e.g. v1 |
request_id | string | Unique request identifier (hex). e.g.a1b2c3d4e5f66f5e4d3c2b1a |
datetime | object | Companion descriptor present in the {"timezone":"UTC","format":"ISO 8601"} |
timezone* | string | Always UTC |
format* | string | Always ISO 8601 |
links | object | Pagination or related links, present only when the endpoint returns a paginated collection. |
| Status | Class | Description | Body |
|---|---|---|---|
| 200 | 2xx | SPEI non-business-day calendar of the year, with its source. | SpeiCalendarResponse |
| 304 | 3xx | Not modified: the calendar has not changed per the sent ETag. | No body |
| 404 | 4xx | The year has no calendar (code spei_calendar_year_not_covered). meta.covered_years lists the available years. | ErrorResponse |
| 422 | 4xx | The year does not have four digits (code spei_calendar_year_invalid). | ErrorResponse |
| 429 | 4xx | Rate limit exceeded | ErrorResponse |
| Header | Type | Description |
|---|---|---|
Cache-Control | string | Client cache TTL (1 h). |
ETag | string | Fingerprint of the current calendar. Pass as If-None-Match on subsequent requests. |
| Status | Code | Example |
|---|---|---|
| 404 | spei_calendar_year_not_covered | We do not have the calendar for 2030. The available years run from 2024 to 2026. Envelope
|
| 422 | spei_calendar_year_invalid | The year must have four digits, for example 2026. Envelope
|
| 429 | rate_limit_exceeded | Rate limit exceeded. Try again in 45 seconds. Envelope
Response headers
|