Skip to main content
Bulk-retrieve the CFDIs (or their metadata) that an RFC issued or received in a date range, straight from the SAT’s descarga masiva service. It is asynchronous and hemmed in by hard SAT limits — read the limits section before you design around it.
Want an ongoing feed instead of a one-off pull? Use SAT sync: register the RFC once and we backfill its history and keep it current, with none of the limits below to manage. Reach for descarga masiva when you need a specific range on demand.

Prerequisites

  • A FIEL (e.firma) registered on the fiscal profile — descarga masiva authorizes with the FIEL, not the CSD. Without one, POST /v1/downloads returns 422 download.fiel_required.
  • Descarga masiva has no SAT test environment. It runs only against a real FIEL — use a live key (sk_live_) and a current e.firma registered on the profile.

Request a download

date_from/date_to accept YYYY-MM-DD or a full ISO datetime; a bare date widens to cover the whole day. Response is a download object with status: "requested" and a metadata.warnings array carrying any SAT-limit advisories. 201 for a new request, 200 if it deduped to an identical prior request (no new SAT slot consumed).

Lifecycle

The API fires the SAT request, then a poll job checks status and, the moment SAT marks it ready, downloads the ZIP packages immediately (their URLs expire in ~5 minutes) and stores them.
Subscribe to download.ready / download.failed webhooks instead of polling.

SAT limits — design around these

The SAT (not this API) enforces the following. They are the reason descarga masiva must be planned, not fired ad hoc. Codes below map to sat.* in ../errors.md.

Fragmentation strategy

Because of both the 200k cap and the 2-identical-lifetime rule, prefer narrow, non-repeating windows:
  1. Start monthly. If a month returns 5003 (too large), split it into weeks, then days.
  2. Make every request’s date_from/date_to unique — do not resubmit a window you already requested twice. If you must reprocess, reuse the stored packages via GET /v1/downloads/:id/files rather than issuing a new SAT request.
  3. For ongoing sync, advance the window forward (yesterday, the day before…) so params never repeat.
  4. Metadata requests are cheaper (1M cap) — pull type: "metadata" first to size a range before pulling full type: "cfdi".

Notes

  • status_filter (active/cancelled) is recorded for request differentiation but is advisory — it is not currently forwarded to the SAT request.
  • The FIEL PFX is the only key material sent to the PAC — to sign the carta manifiesto and for descarga masiva. CSD private keys never leave this server.