Try the structural validation free, right here. When you need to know whether the RFC exists at SAT, is active and can invoice, the API answers it in a single call, with a risk level ready for your logic.
Technical questions? Talk to an engineer on WhatsApp — 0% bots.
Structural validation in your browser — we don't send your RFC to any server. The SAT status is answered by the API.
Every validation returns the RFC's status in the SAT registry and classifies it into a risk level. Your code uses it directly to approve, flag or stop —no parsing messages.
NONE
Valid and invoiceable
Exists in the registry and is authorized to issue and receive invoices. Safe for automated approval.
type: "SUCCESS" · isBillable: true
LOW
Exists, but restricted
It's in the registry but can't invoice today —typically a company that hasn't completed its fiscal onboarding, or is suspended. The taxpayer is real.
type: "RFC_NOT_INVOICEABLE"
CRITICAL
Not registered
The RFC is not in the SAT registry: never issued, or a typo or fabricated value. Don't invoice or extend credit without verifying.
type: "RFC_NOT_FOUND"
Beyond the risk, the response includes the taxpayer type (individual or legal entity), the isBillable flag and the official SAT message. One switch over the risk level and your onboarding decides on its own.
We query SAT on every call, no cache: the status is from this moment, not yesterday's copy. Same envelope as every OrigoID service.
INVALID_REQUEST and billable: false — you don't spend a credit on junk.const res = await fetch("https://api.origoid.com/mex/fiscal/v1/rfc-validations", { method: "POST", headers: { "x-api-key": process.env.ORIGOID_API_KEY, "content-type": "application/json", }, body: JSON.stringify({ rfc: "GARM900101HDF" }), }); const result = await res.json();
import os, requests res = requests.post( "https://api.origoid.com/mex/fiscal/v1/rfc-validations", headers={ "x-api-key": os.environ["ORIGOID_API_KEY"], "content-type": "application/json", }, json={"rfc": "GARM900101HDF"}, timeout=30, ) result = res.json()
curl -X POST https://api.origoid.com/mex/fiscal/v1/rfc-validations \ -H "x-api-key: $ORIGOID_API_KEY" \ -H "content-type: application/json" \ -d '{"rfc": "GARM900101HDF"}'
{
"status": "OK",
"type": "SUCCESS",
"data": {
"rfc": "GARM900101HDF",
"isValid": true, "isBillable": true,
"taxpayerType": "PERSONA_FISICA",
"riskLevel": "NONE",
"officialMessage": "RFC válido, y susceptible de recibir facturas"
},
"billable": true
}
Several providers validate RFC. What changes: how fresh the data is, whether they turn it into a ready decision, and what happens to your counterparty's data afterward.
Two levels: the structural validation (12 or 13-character format, date and homoclave) works offline — the demo above does it free in your browser. The real validation against SAT — whether it exists in the registry, is active and can invoice — is answered by the API in a single call.
Whether the RFC is valid, the taxpayer type (individual or legal entity), whether it can invoice (isBillable) and a risk level: NONE (valid and invoiceable), LOW (exists but restricted) and CRITICAL (not registered at SAT).
An RFC with perfect format may not exist at SAT or may not be able to invoice. Validating it first avoids SAT rejections and operating with counterparties who aren't who they claim to be.
No. Every query is validated, answered and discarded, without storing the data. Zero retention across all our regions.
You start free: courtesy credits, no card. Then the price per validation drops with your volume. All plans published. Invalid format = billable: false, no charge.
Courtesy credits to validate real RFCs in production. Access is enabled after a brief validation of your company.