📘 2025 Report:Mexico Economic Review 2025 — outlook, charts, and sector signalsRead

    SAT API Integration in Mexico

    Connect SAT fiscal data to your product via CIEC: key endpoints, JSON responses, continuous monitoring, and a technical FAQ — all in one hub.

    Developer resources

    Five resources, five purposes. Pick the one that matches where you are in your integration.

    What the SAT API exposes

    Mexico's SAT (Servicio de Administración Tributaria) provides authenticated SOAP services to access taxpayer fiscal data. These include issued and received CFDIs, the 32-D compliance opinion, fiscal status certificate, tax regimes and obligations, the 69-B list (EFOS/EDOS), and RFC validation. Direct integration requires credential handling, XML/SOAP parsing, session token management, and handling SAT maintenance windows.

    CRiskCo abstracts all that complexity behind a modern REST/JSON API with apiId/apiKey authentication, webhooks, automatic retries, and continuous monitoring. It's the standard way used by banks, SOFOMs, fintechs, and accounting firms in Mexico to connect SAT data to their systems.

    SAT authorization methods: CIEC and e.firma

    SAT allows two ways to authorize access to fiscal data. Here we explain both and which one CRiskCo uses today.

    CRiskCo runs SAT onboarding with CIEC

    We currently accept only the taxpayer's CIEC password. We do not require or store e.firma .cer/.key files. CIEC is sufficient for all services we offer: CFDI extraction, RFC validation, 32-D compliance opinion, fiscal certificate, FinScore, and continuous monitoring.

    Attribute CIEC e.firma
    What it is 8-character SAT password Digital certificate (.cer + .key + password)
    Validity Indefinite (until the taxpayer changes it) 4 years, renewable
    Can sign documents No Yes (advanced electronic signature)
    Read fiscal data Yes (CFDI, RFC, regimes, 32-D opinion, certificate) Yes (same data)
    Supported by CRiskCo today Yes No

    Onboarding flow (CIEC)

    1. 1Collect RFC, CIEC password, email, and terms acceptance from the taxpayer.
    2. 2Call POST /OnboardingSatIntegration with the payload {IsAgreeTerms, DateAgreeTerms, VersionAgreeTerms, Email, User, Password, RefApplicantId}.
    3. 3Poll GET /get-applicants?taxId=RFC&onboardingStatus=true every 5–10 seconds until status='Available'.
    4. 4Call data endpoints: /applicantinfo, /GetCompanyTaxStatus, /GetCompanyFiscalDetails, /GetHistoricalFinscore.
    5. 5Register a webhook with POST /Subscriptions to receive automatic updates.

    Runnable snippets at Code Samples.

    Key endpoints with JSON responses

    Base URL: https://service.criskco.com/apiservice.svc. Required headers on every call: apiId, apiKey, Content-Type: application/json.

    OnboardingSatIntegration

    Applicant onboarding with their CIEC password.

    Request
    POST /apiservice.svc/OnboardingSatIntegration
    Headers: apiId, apiKey, Content-Type: application/json
    
    {
      "IsAgreeTerms": true,
      "DateAgreeTerms": "2026-04-16",
      "VersionAgreeTerms": "1",
      "Email": "contact@empresa.com",
      "User": "GAPXXXXXXXXX",
      "Password": "CIEC_PASSWORD",
      "RefApplicantId": "loan-app-00482"
    }
    Response
    {
      "success": true,
      "applicantId": "1000143693",
      "RefApplicantId": "loan-app-00482",
      "message": "Applicant onboarding initiated"
    }

    GET /get-applicants

    List applicants and their onboarding status (poll after OnboardingSatIntegration).

    Request
    GET /apiservice.svc/get-applicants?taxId=GAPXXXXXXXXX&onboardingStatus=true
    
    Query params: refApplicantId · taxId · onboardingStatus · fullResponse
    Response
    {
      "responseDetails": "Data retrieved successfully",
      "success": true,
      "ApiApplicantData": {
        "applicantId": "1000143693",
        "taxId": "GAPXXXXXXXXX",
        "onboardingStatus": "Available"
      }
    }
    // Use fullResponse=true for the complete dataset (financials, blackLists).
    // See full schema at api-docs.criskco.com.

    GET /ValidateRFC

    Validates a single RFC against SAT (existence, status, and name match).

    Request
    GET /apiservice.svc/ValidateRFC?rfc=GAPXXXXXXXXX&name=GAP&postal=06600
    Response
    {
      "Success": true,
      "message": "RFC valid and active",
      "rfc": "GAPXXXXXXXXX"
    }

    POST /ValidateRFCBulk

    Bulk validation: up to 5,000 RFCs in one call (plain text, one RFC per line).

    Request
    POST /apiservice.svc/ValidateRFCBulk
    Headers: apiId, apiKey
    Content-Type: multipart/form-data
    
    file=@rfcs.txt   // one RFC per line, or RFC|Name|Postal pipe-separated
    Response
    // Returns plain-text results, one line per RFC.
    // See API Docs for the exact format and runnable snippets in Code Samples.

    GET /GetCompanyTaxStatus

    Compliance Opinion (32-D). Returns PayingTax (POSITIVO/NEGATIVO) and pending obligations.

    Request
    GET /apiservice.svc/GetCompanyTaxStatus?taxId=GAPXXXXXXXXX
    Response
    {
      "CompanyTaxStatus": [
        {
          "taxId": "GAPXXXXXXXXX",
          "PayingTax": "NEGATIVO",
          "RetrievedAt": "2026-04-15T08:30:00Z",
          "CompanyObligationsList": [
            { "Obligation": "ISR Mensual", "Month": 2, "Year": 2026 },
            { "Obligation": "IVA Mensual", "Month": 2, "Year": 2026 }
          ]
        }
      ]
    }

    GET /GetCompanyFiscalDetails

    Fiscal Status Certificate: legal name, regimes, obligations, and fiscal address.

    Request
    GET /apiservice.svc/GetCompanyFiscalDetails?taxId=GAPXXXXXXXXX
    Response
    // Shape varies. See full reference at api-docs.criskco.com.
    // Includes: legalName, regimes[], obligations[], fiscalAddress, registrationDate.

    GET /GetHistoricalFinscore

    Monthly history of the FinScore (CRiskCo's proprietary credit model).

    Request
    GET /apiservice.svc/GetHistoricalFinscore?taxId=GAPXXXXXXXXX
    Response
    // Returns a HistoricalFinscores array with monthly entries
    // (Year, Month, FinScore). See full schema at api-docs.criskco.com.

    POST /Subscriptions

    Register a webhook to receive applicant updates (FileType: JSON or JSON_LINK).

    Request
    POST /apiservice.svc/Subscriptions
    Headers: apiId, apiKey, Content-Type: application/json
    { "CallbackUrl": "https://yourdomain.com/webhooks/criskco" }
    
    // CRiskCo issues a GET to CallbackUrl for validation —
    // your server must reply HTTP 200 within 2 seconds.
    Response
    {
      "success": true,
      "responseDetails": "Subscription 1 created successfully",
      "ApiSubscriptionData": [
        {
          "Active": true,
          "CallbackUrl": "https://yourdomain.com/webhooks/criskco",
          "ReferrerId": "your_referrer_id",
          "SubscriptionId": 1
        }
      ]
    }

    Full endpoint catalog in the API Integration Guide and detailed reference at api-docs.criskco.com.

    Frequently asked questions

    Technical answers to the most common questions about integrating with the SAT API.

    Ready to integrate the SAT API

    Get free sandbox credentials and start testing in minutes. No credit card required.

    Explore More