Certificates (e.firma / CSD)

The SAT issues two kinds of digital certificate to every taxpayer:

  • FIEL (e.firma) — the taxpayer's identity certificate, used to sign filings and authorize the CSDs.
  • Sello (CSD, Certificado de Sello Digital) — used to stamp CFDIs.

This endpoint returns every certificate registered to an RFC, with its serial number, status, type, and validity window. The result comes back synchronously — no credentials of your own required.

Use it to validate a FIEL a customer uploaded: confirm the serial number exists, its status is active, and its type is fiel.

Look up certificates

POST /v1/certificates

{ "tax_id": "XAXX010101000" }

Response (200 OK) — the certificates plus the taxpayer's legal name. One row per certificate:

{
  "tax_id": "XAXX010101000",
  "legal_name": "EMPRESA DEMO SA DE CV",
  "certificates": [
    {
      "id": "9b1f…",
      "serial_number": "00001000000500000123",
      "type": "fiel",
      "status": "active",
      "valid_from": "2025-01-15T18:30:00+00:00",
      "valid_to": "2029-01-15T18:30:00+00:00",
      "cer_available": true
    }
  ]
}

Each result is persisted. cer_url is a direct link to the certificate file (the public X.509 DER); cer_available indicates whether we also keep an archived copy you can pull via the API (see below). The lookup never fails just because a file could not be archived.

Value mapping

status meaning type meaning
active currently valid (Activo) fiel e.firma
revoked revoked by SAT (Revocado) seal CSD (Sello)
expired expired (Caduco) unknown unrecognized
unknown unrecognized state

valid_from / valid_to are the certificate's UTC validity dates, returned as ISO-8601.

Responses

Every non-2xx response carries a stable reason:

Status reason What happened What you should do
200 — Certificates retrieved Use the certificates array
404 not_found The RFC has no certificates, or it is invalid Verify the RFC
503 unavailable The CAPTCHA could not be solved Retry — the same request usually succeeds
503 upstream_error The SAT source failed or answered something unexpected Retry later; if it persists, contact support
422 — (Laravel errors) Request failed validation (missing/invalid tax_id) Fix the request body

The dashboard exposes the same lookup as a form at /dashboard/certificates.

Stored certificates (per entity)

GET /v1/certificates/{entity_id} — the certificates for one of your entities, newest first.

GET /v1/certificates/{id}/download — the certificate file as base64. Works whether or not the archived copy is present (it is retrieved on demand when needed):

{ "data": "MIIF…", "mime_type": "application/pkix-cert", "filename": "00001000000500000123.cer", "encoding": "base64" }

The certificate lookup is synchronous — the result comes back in the response, so there is no certificate webhook. Webhooks are only for asynchronous SAT extractions.