Your user takes three photos. You run identity, AML lists and address —checks that chain together on their own, straight from the official sources.
Technical questions? Talk to an engineer on WhatsApp — 0% bots.
An onboarding that verifies identity and meets AML, without endless forms. Each wave uses the previous one's response; you fire the calls and OrigoID answers; the cross-checks between responses are an if in your backend.
OCR INEINE QRFace MatchProof of addressif in your backend.your codeCURP validationLista NominalPEPsOFACFace MatchSAT 69SAT 69-BThe envelope tells you exactly what failed —FACE_MISMATCH, IMAGE_UNREADABLE, a CURP of a deceased person (CURP_DECEASED)— and you ask again for only that photo or that value. The legitimate user passes without friction; the one who doesn't, stops before costing you money.
The flow above confirms who the person is. To decide on a loan you need the other half: whether they have a job, how much their employer reports and how stable they have been. IMSS answers that, with the same CURP you already extracted from the ID.
Not sure which one you need? Compare the three IMSS services →
Every service returns the same envelope: a single JSON structure, clean and predictable. You learn the contract once and it works for INE, facial, CURP, OFAC, PEPs and SAT.
status, type, data at every step of the KYC — your parser is just one.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",
"data": {
"personalInfo": { "givenNames": "JUAN", "rfc": "PELJ900101AB7", … },
"documentDetails": { "curpStatus": "AN", … }
},
"billable": true
}
A fintech lives on approving fast without letting in who it shouldn't. Verification has to be real, meet AML and not turn you into a custodian of data you don't want to keep.
Your user takes three photos: the front and back of their INE, and a selfie (plus proof of address if your file requires it). With that you run the OCR with a normalized address, the back read, the face match, CURP-RFC against RENAPO, the Lista Nominal and the AML lists — each response feeds the next call.
OFAC (sanctions), Mexico PEPs (active, former and by affinity), and SAT's: article 69 (delinquent, unlocatable, sentenced — 14 sublists) and 69-B (EFOS: presumed, definitive and cleared). Same envelope as everything else.
No. Every query is validated, answered and discarded, without storing the data.
You start free: courtesy credits, no card. Then the price drops with your volume — down to $0.28 per verification. All plans published, without talking to sales.
Try the full KYC flow in production with courtesy credits. Access is enabled after a brief validation of your company.