GEThttps://api.veriko.mx/v1/public/spei-calendar/{year}

Get the calendar of SPEI non-business days for a year

Audience
public

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 in YYYY-MM-DD format.
  • 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.

Parameters
ParameterInTypeRequiredDescription
year*pathintegerrequired

Calendar year, four digits.

e.g. 2026
If-None-Matchheaderstringoptional

ETag received in a previous response, sent as is (weak W/"…" on a validation, strong on the public catalogs). If the resource has not changed, the server responds 304 Not Modified (no body) and avoids sending the data again.

e.g. "9b2d4c7e1f0a3b6d8e5c2a7f4b1d9e0c3a6f8b2d"
Request
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;
Response 200SpeiCalendarResponse — SPEI non-business-day calendar of the year, with its source.
FieldTypeDescription
dataobject

Main response payload. Shape varies by endpoint (object, array, or JSON:API envelope with type, id, attributes).

type*string

JSON:API resource type. Always spei_calendar.

e.g. 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 id.

e.g. 2026
non_business_days*array

Non-business days that fall from Monday to Friday (YYYY-MM-DD), from lowest to highest. Saturdays and Sundays are also non-business days and are not repeated here.

e.g. ["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.

e.g. CNBV
published_in*string

Acronym of the official gazette that published the provision, for example DOF.

e.g. DOF
published_on*string (date)

Publication date of the provision (YYYY-MM-DD).

e.g. 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
metaobject

Response metadata including API version, route prefix, unique request identifier, and the server timestamp in UTC.

versionstring

API version that processed the request.

e.g. 1.47.0
api_versionstring

API route prefix version (e.g. v1).

e.g. v1
request_idstring

Unique request identifier (hex).

e.g. a1b2c3d4e5f66f5e4d3c2b1a
datetimeobject

Companion descriptor present in the meta block of every response (and in the meta of outgoing webhook bodies). Lets clients assert the timezone contract without re-reading the spec.

e.g. {"timezone":"UTC","format":"ISO 8601"}
timezone*string

Always UTC: The canonical timezone for every datetime field in the body.

e.g. UTC
format*string

Always ISO 8601: Explicit Z suffix on every datetime.

e.g. ISO 8601
linksobject

Pagination or related links, present only when the endpoint returns a paginated collection.

Response status codesGET /v1/public/spei-calendar/{year}
StatusClassDescriptionBody
2002xxSPEI non-business-day calendar of the year, with its source.SpeiCalendarResponse
3043xxNot modified: the calendar has not changed per the sent ETag.No body
4044xxThe year has no calendar (code spei_calendar_year_not_covered). meta.covered_years lists the available years.ErrorResponse
4224xxThe year does not have four digits (code spei_calendar_year_invalid).ErrorResponse
4294xxRate limit exceededErrorResponse
Response headers200
HeaderTypeDescription
Cache-ControlstringClient cache TTL (1 h).
ETagstringFingerprint of the current calendar. Pass as If-None-Match on subsequent requests.
Errors from GET /v1/public/spei-calendar/{year}
StatusCodeExample
404spei_calendar_year_not_covered

We do not have the calendar for 2030. The available years run from 2024 to 2026.

Envelope
meta.request_id
c1d2e3f4a5b66b5a4f3e2d1c
422spei_calendar_year_invalid

The year must have four digits, for example 2026.

Envelope
meta.request_id
d2e3f4a5b6c77c6b5a4f3e2d
429rate_limit_exceeded

Rate limit exceeded. Try again in 45 seconds.

Envelope
meta.request_id
f7a8b9c0d1e22e1d0c9b8a7f
Response headers
  • Retry-After: integer — Seconds to wait before retrying. Matches the endpoint's rate-limit window (typically 60s for list endpoints, 1-5s for in-flight idempotent operations).
  • X-RateLimit-Limit: integer — Configured request cap for this bucket. It is emitted on every 429 and, on the authenticated API, also on successful responses, where it is the per-key cap of the account plan.
  • X-RateLimit-Remaining: integer — Requests remaining in the current window. Always 0 at the moment of the 429; on a successful response of the authenticated API it is what is left of the per-key cap.
  • X-RateLimit-Reset: integer — Absolute Unix epoch (seconds) when the window resets. Emitted on every 429, alongside Retry-After, and on successful responses of the authenticated API. Per-endpoint overrides exist (e.g. `rate_limited_login`).