Try the structural validation free, right here. When you need the real status at RENAPO —who it belongs to, whether it's active or deactivated— the API answers it in a single call.
Technical questions? Talk to an engineer on WhatsApp — 0% bots.
Structural validation with the official check-digit algorithm — it runs in your browser, we don't send your CURP to any server. The RENAPO status is answered by the API.
A validation against RENAPO returns the holder's record and the document's exact status. That's where fraud detection lives: a CURP can have perfect format and belong to a deceased person.
ANNormal registrationActive and in good standing. The happy path.type: "SUCCESS"AHRegistration with homonymyThe first 16 characters match another CURP.type: "CURP_HOMONYMY"RCCRegistration with correctionA data correction changed the key.type: "SUCCESS"RCNRegistration with noteMinor data correction.type: "SUCCESS"BDDeregistered — deathThe holder has died — top alert before extending credit.type: "CURP_DECEASED"BAPApocryphal documentDeregistered over a falsified supporting document.type: "CURP_APOCRYPHAL"BJDFinal judicial deregistrationDeregistered by court order.type: "CURP_JUDICIAL_SUSPENSION"BSUUnusedExists but has never been used — inactive; reactivated at a RENAPO office.type: "CURP_INACTIVE"BDMDeath (manual)Deregistered over a manually recorded death.type: "CURP_DECEASED"BDPPresumed deathDeregistered over a presumed death (no confirmed certificate).type: "CURP_DECEASED"And you don't have to interpret codes: the envelope names the case in the type field. The three death variants (BD, BDM, BDP) arrive as a single CURP_DECEASED; active records and their corrections, as SUCCESS. Your code is a switch over type — not a catalog of RENAPO codes to memorize.
Beyond the status: names, sex, date and state of birth, registration data and —with generateRfc: true— the 13-character RFC in the same call. Need the official certificate? That's another service in the same catalog: the certified CURP as a PDF, with its data already parsed — same API, same envelope, different endpoint.
We query the official source on every call, no cache: the status you get is today's, not yesterday's copy.
INVALID_REQUEST and billable: false — you don't spend a credit on junk.import { OrigoidApiClient } from "@origoid/sdk"; const client = new OrigoidApiClient({ apiKey: process.env.ORIGOID_API_KEY }); const result = await client.renapo.validateCurp({ curp: "TEST900101HDFRRN09", generateRfc: true, });
from origoid import OrigoID client = OrigoID(api_key=os.environ["ORIGOID_API_KEY"]) result = client.renapo.validate_curp( curp="TEST900101HDFRRN09", generate_rfc=True, )
import ( sdkgo "github.com/origoid/sdk-go" "github.com/origoid/sdk-go/client" "github.com/origoid/sdk-go/option" ) c := client.NewClient(option.WithAPIKey(os.Getenv("ORIGOID_API_KEY"))) result, err := c.Renapo.ValidateCurp(context.Background(), &sdkgo.ValidateCurpRequest{ Curp: "TEST900101HDFRRN09", GenerateRfc: sdkgo.Bool(true), })
curl -X POST https://api.origoid.com/mex/renapo/v1/curp-validations \ -H "x-api-key: $ORIGOID_API_KEY" \ -H "content-type: application/json" \ -d '{"curp": "TEST900101HDFRRN09", "generateRfc": true}'
{
"status": "OK",
"type": "SUCCESS",
"message": "CURP found and validated",
"data": {
"personalInfo": { "givenNames": "JUAN", "rfc": "PELJ900101AB7", … },
"documentDetails": { "curpStatus": "AN", … }
},
"billable": true
}
Validating the CURP is the first step. With that same value you can ask IMSS about the person's employment, without asking them for anything else.
Not sure which one you need? Compare the three IMSS services →
Several providers validate CURP. What changes: how fresh the data is, what happens to your user's data afterward, and how much it costs to integrate.
Two levels: the structural validation (format, state, date and check digit) works offline — the demo above does it free in your browser. The real validation against RENAPO — whether it exists, who it belongs to and its status — is answered by the API in a single call.
Four active — AN (normal registration), AH (registration with homonymy), RCC and RCN (data corrections) — and six inactive: BD (death), BAP (apocryphal document), BJD (final judicial deregistration), BSU (unused — inactive, reactivable) and BDM/BDP (manual and presumed death). The API returns the exact status and its type — the three deaths arrive as a single CURP_DECEASED — a CURP with perfect format can belong to a deceased person, and you only know that by querying the registry.
Yes: send generateRfc: true and the same response includes the 13-character RFC. One call, two data points.
It's another service in the catalog: the certified CURP — the official certificate PDF with its data already parsed. Same API and same envelope as Validate CURP, different endpoint: validation tells you the status; the certificate hands you the document.
No. Every query is validated, answered and discarded, without storing the data.
You start free: courtesy credits to validate real CURPs in production, no card. Then 1 validation = 1 credit, and the price drops with your volume — as low as $0.28 per validation. All plans are published, no "contact us". And invalid format isn't charged (billable: false).
Courtesy credits to validate real CURPs in production. Access is enabled after a brief validation of your company.