RENAPO · Validate CURP

Validating a CURP, from format to the official registry.

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.

RFC in the same callofficial RENAPO statuszero retention
valida-un-curpFREE · IN YOUR BROWSER

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.

The API response

Not just "valid or invalid": the full official status.

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.

Active
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"
Inactive
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.

Raw infrastructure · 100% REST API

One call. Always-live data.

We query the official source on every call, no cache: the status you get is today's, not yesterday's copy.

No cache, no copiesEvery validation goes to the source. If one source fails, we go to the next —without you noticing.
Invalid format = no chargeA malformed CURP is rejected with INVALID_REQUEST and billable: false — you don't spend a credit on junk.
Zero retentionThe query is validated, answered and discarded. Without storing the data.
valida-curp
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}'
Response with the official status
{
  "status": "OK",
  "type": "SUCCESS",
  "message": "CURP found and validated",
  "data": {
    "personalInfo": { "givenNames": "JUAN", "rfc": "PELJ900101AB7", … },
    "documentDetails": { "curpStatus": "AN", … }
  },
  "billable": true
}
With that same CURP

You already have the CURP. Ask IMSS.

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.

◈
Employment verificationWhether the person works today, for which employer, their base salary and the contributed days of the period.See employment verification →
§
Contribution weeksThe official PDF certificate, the full job history and signals for tenure, stability and salary evolution.See contribution weeks →
#
NSS lookupThe person's Social Security Number, without asking for the card.See NSS lookup →

Not sure which one you need? Compare the three IMSS services →

Why OrigoID

The official data is the same. The difference is everything else.

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.

◈
Always-live dataNo cache: the status is from this very moment. And with redundant sources — if one fails, we go to the next.
⊘
Zero retentionStoring queries is the industry norm. We don't store the data you query. Validated, answered, discarded.
{}
One single envelopeThe same JSON across CURP, INE, RFC, IMSS and more. You learn the contract once.
$
Published pricingAs low as $0.28 per validation depending on your volume — all plans public, no "contact us" to find out the price. See pricing
FAQ

What people usually ask us.

How do I validate a CURP against RENAPO?

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.

What status can a CURP have?

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.

Can I get the RFC from the CURP?

Yes: send generateRfc: true and the same response includes the 13-character RFC. One call, two data points.

What about the official PDF certificate?

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.

Do you store the data I validate?

No. Every query is validated, answered and discarded, without storing the data.

How much does it cost?

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).

Start free, no card.

Courtesy credits to validate real CURPs in production. Access is enabled after a brief validation of your company.

Request access