{"components":{"schemas":{"Certificate":{"properties":{"cer_base64":{"description":"Base64 DER of the .cer file. Null when SAT's CDN did not serve it.","nullable":true,"type":"string"},"curp":{"description":"Persona física certs only","nullable":true,"type":"string"},"email":{"nullable":true,"type":"string"},"legal_representative_curp":{"description":"Persona moral certs only","nullable":true,"type":"string"},"legal_representative_rfc":{"description":"Persona moral certs only","nullable":true,"type":"string"},"serial":{"description":"20-digit SAT certificate serial number","type":"string"},"status":{"description":"Activo, Caduco, or Revocado","type":"string"},"type":{"description":"FIEL (e.firma) or SELLO (CSD)","type":"string"},"valid_from_utc":{"format":"date-time","type":"string"},"valid_to_utc":{"format":"date-time","type":"string"}},"type":"object"},"CommerceRegistryRecord":{"description":"One folio mercantil electrónico (FME). Datetimes are ISO 8601 in Mexico City local time, without an offset.","properties":{"acts":{"items":{"properties":{"act":{"nullable":true,"type":"string"},"document_number":{"nullable":true,"type":"string"},"filed_at":{"description":"Fecha de ingreso","nullable":true,"type":"string"},"form":{"description":"Forma precodificada","nullable":true,"type":"string"},"modality":{"nullable":true,"type":"string"},"nci":{"description":"Número de control interno","nullable":true,"type":"string"},"registered_at":{"description":"Fecha de inscripción","nullable":true,"type":"string"}},"type":"object"},"type":"array"},"business_line":{"description":"Giro","nullable":true,"type":"string"},"corporate_purpose":{"description":"Objeto social","nullable":true,"type":"string"},"curp":{"nullable":true,"type":"string"},"domicile":{"description":"Domicilio social","nullable":true,"type":"string"},"duration":{"description":"Duración de la sociedad","nullable":true,"type":"string"},"fme":{"description":"Folio mercantil electrónico","type":"string"},"legal_regime":{"description":"Régimen jurídico","nullable":true,"type":"string"},"municipality":{"nullable":true,"type":"string"},"name":{"description":"Razón social as registered","type":"string"},"nationality":{"nullable":true,"type":"string"},"person_type":{"enum":["moral","fisica"],"nullable":true,"type":"string"},"prior_registration":{"description":"Antecedente registral","nullable":true,"type":"string"},"registered_at":{"description":"Fecha de inscripción","nullable":true,"type":"string"},"registry_office":{"description":"Oficina registral","nullable":true,"type":"string"},"rfc":{"nullable":true,"type":"string"},"shareholders":{"items":{"properties":{"birth_date":{"description":"YYYY-MM-DD, individual shareholders","nullable":true,"type":"string"},"curp":{"nullable":true,"type":"string"},"first_surname":{"nullable":true,"type":"string"},"incorporation_date":{"description":"YYYY-MM-DD, company shareholders","nullable":true,"type":"string"},"name":{"description":"Given names, or the company name","nullable":true,"type":"string"},"nationality":{"nullable":true,"type":"string"},"rfc":{"nullable":true,"type":"string"},"second_surname":{"nullable":true,"type":"string"},"series":{"nullable":true,"type":"string"},"share_value":{"description":"MXN amount per share as a decimal string, e.g. \"500.00\"","nullable":true,"type":"string"},"shares":{"nullable":true,"type":"integer"},"status":{"nullable":true,"type":"string"},"total_value":{"description":"MXN amount as a decimal string, e.g. \"49500.00\"","nullable":true,"type":"string"}},"type":"object"},"type":"array"},"state":{"description":"Entidad federativa","nullable":true,"type":"string"},"status":{"description":"Estatus FME, e.g. Abierto","nullable":true,"type":"string"},"supported":{"description":"false when the folio is kept in a state the API does not support yet; only fme, name, and registry_office are set.","type":"boolean"}},"type":"object"},"CurpIdentity":{"properties":{"associated_curps":{"description":"CURPs listed in the PDF's correction section. Included by default on CURP lookup/search. Empty array when none are listed; null when the document could not be read.","items":{"type":"string"},"nullable":true,"type":"array"},"birthdate":{"description":"DD/MM/YYYY","type":"string"},"certification":{"description":"Certification statement printed on the official PDF. Included by default on CURP lookup/search. Null when no statement is printed or the document could not be read.","example":"CURP Certificada: verificada con el Registro Civil","nullable":true,"type":"string"},"certified":{"description":"true when the official PDF prints a CURP certification statement (Registro Civil, SRE, or INM); false when the PDF was read successfully and no statement is present; null when the document could not be read. This is not a nationality or paperwork eligibility determination.","nullable":true,"type":"boolean"},"curp":{"type":"string"},"entity_birth":{"type":"string"},"homonimo":{"example":false,"type":"boolean"},"mothers_maiden_name":{"type":"string"},"names":{"type":"string"},"nationality":{"type":"string"},"paternal_surname":{"type":"string"},"probation_document":{"nullable":true,"type":"string"},"probation_document_data":{"type":"object"},"renapo_valid":{"type":"boolean"},"sex":{"type":"string"},"status_curp":{"type":"string"}},"type":"object"},"Error":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error"],"type":"object"},"IneCredential":{"description":"The record INE returned for the credential, with INE's own field names.","properties":{"anio_emision":{"nullable":true,"type":"string"},"anio_registro":{"nullable":true,"type":"string"},"cic":{"nullable":true,"type":"string"},"clave_elector":{"nullable":true,"type":"string"},"distrito_federal":{"nullable":true,"type":"string"},"distrito_local":{"nullable":true,"type":"string"},"en_lista_nominal":{"nullable":true,"type":"boolean"},"en_padron_electoral":{"nullable":true,"type":"boolean"},"fecha_actualizacion":{"description":"When INE last updated the record, local time without offset.","nullable":true,"type":"string"},"fecha_consulta":{"format":"date","nullable":true,"type":"string"},"found":{"type":"boolean"},"mensaje":{"description":"INE's headline sentence, in Spanish.","nullable":true,"type":"string"},"modelo":{"enum":["d","e"],"type":"string"},"numero_emision":{"nullable":true,"type":"string"},"ocr":{"nullable":true,"type":"string"},"puede_votar":{"description":"True only when INE also places the holder in the Lista Nominal.","nullable":true,"type":"boolean"},"status":{"type":"string"},"vigencia":{"description":"Expiry date.","format":"date","nullable":true,"type":"string"},"vigente":{"description":"INE reports the credential as valid identification.","nullable":true,"type":"boolean"}},"type":"object"},"LegalRepresentative":{"properties":{"associated_curps":{"description":"CURPs listed in the PDF's correction section. Included by default on CURP lookup/search. Empty array when none are listed; null when the document could not be read.","items":{"type":"string"},"nullable":true,"type":"array"},"birthdate":{"description":"DD/MM/YYYY","type":"string"},"certification":{"description":"Certification statement printed on the official PDF. Included by default on CURP lookup/search. Null when no statement is printed or the document could not be read.","example":"CURP Certificada: verificada con el Registro Civil","nullable":true,"type":"string"},"certified":{"description":"true when the official PDF prints a CURP certification statement (Registro Civil, SRE, or INM); false when the PDF was read successfully and no statement is present; null when the document could not be read. This is not a nationality or paperwork eligibility determination.","nullable":true,"type":"boolean"},"curp":{"type":"string"},"entity_birth":{"type":"string"},"homonimo":{"example":false,"type":"boolean"},"mothers_maiden_name":{"type":"string"},"names":{"type":"string"},"nationality":{"type":"string"},"paternal_surname":{"type":"string"},"probation_document":{"nullable":true,"type":"string"},"probation_document_data":{"type":"object"},"renapo_valid":{"type":"boolean"},"sex":{"type":"string"},"status_curp":{"type":"string"}},"type":"object"},"SatListing":{"properties":{"article":{"description":"Article: 69, 69b, 69b_bis","type":"string"},"name":{"type":"string"},"person_type":{"description":"M (moral) or F (física)","type":"string"},"situation":{"type":"string"},"state":{"type":"string"},"sub_list":{"description":"e.g. cancelados, firmes, no_localizados","type":"string"}},"type":"object"},"WebhookAccepted":{"properties":{"message":{"type":"string"},"status":{"example":"processing","type":"string"}},"type":"object"}},"securitySchemes":{"apiKey":{"description":"API key for authenticating requests. Generate keys from your dashboard after signing up.","in":"header","name":"x-api-key","type":"apiKey"}}},"externalDocs":{"description":"Full developer documentation","url":"https://curpcheck.com/docs"},"info":{"contact":{"email":"help@curpcheck.com","name":"CURPCheck Support","url":"https://curpcheck.com/docs"},"description":"REST API for Mexican CURP (Clave Única de Registro de Población) numbers. Lookup and search return the registered identity, with certification status and CURPs associated by correction included.\n\n## Endpoints by use case\n\n- `/curp/lookup`: the identity RENAPO has registered for a CURP. ~5 s. Use to confirm who a CURP belongs to. Both CURP endpoints accept optional `include_pdf: true` to include the official PDF as `pdf_base64`.\n- `/curp/search`: names, birth date, sex, and state of birth → the CURP RENAPO has registered for that person with the registered identity. ~5 s. Use when the person doesn't know their CURP.\n\n## RFC and INE endpoints\n\nCURPCheck shares accounts with RFCCheck and INECheck. The same API key also calls the `/rfc/*` endpoints listed below (SAT registration, taxpayer profile, postal code, SAT lists, commerce registry), documented on RFCCheck, and `/ine/verify` (whether INE reports a voter ID as current), documented on INECheck.","termsOfService":"https://curpcheck.com/terms-and-conditions","title":"CURPCheck API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/curp/lookup":{"post":{"description":"Returns the identity RENAPO has registered for a CURP. The CURP is checked offline first; one that fails is rejected with `invalid_curp` without a RENAPO call and is not charged. A CURP RENAPO has no record of (`found: false`) costs 10 credits. ~5 s.","externalDocs":{"description":"Endpoint guide","url":"https://curpcheck.com/docs/endpoints/curp-lookup"},"operationId":"curpLookup","requestBody":{"content":{"application/json":{"schema":{"properties":{"curp":{"description":"The CURP (18 characters, any case)","example":"TU_CURP_REAL","type":"string"},"include_pdf":{"default":false,"description":"Include the official PDF as pdf_base64 at no extra credit cost.","type":"boolean"}},"required":["curp"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"illustrative":{"summary":"Abbreviated illustrative response; identifiers and names are placeholders.","value":{"curp":"TU_CURP_REAL","found":true,"message":"Identity retrieved from RENAPO","person":{"associated_curps":[],"certification":"CURP Certificada: verificada con el Registro Civil","certified":true,"curp":"TU_CURP_REAL","homonimo":false,"mothers_maiden_name":"APELLIDO MATERNO","names":"NOMBRES","paternal_surname":"APELLIDO PATERNO","renapo_valid":true}}}},"schema":{"properties":{"curp":{"type":"string"},"found":{"description":"true = RENAPO returned the record in `person`; false = RENAPO did not return a single record (charged; `person.homonimo` is true when RENAPO reports a problem with the key); null = RENAPO unreachable (not charged).","nullable":true,"type":"boolean"},"message":{"type":"string"},"pdf_base64":{"contentEncoding":"base64","contentMediaType":"application/pdf","description":"Official RENAPO PDF; present only when include_pdf is true and found is true.","type":"string"},"person":{"$ref":"#/components/schemas/CurpIdentity","nullable":true}},"type":"object"}}},"description":"Search completed. `found` is true / false / null."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Payment Required"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Body has `error` set to: `missing_curp` or `invalid_curp`."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Too Many Requests"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal Server Error"}},"security":[{"apiKey":[]}],"summary":"Look up a CURP in RENAPO"}},"/curp/search":{"post":{"description":"Searches RENAPO by name, birth date, sex, and state of birth (the \"Datos personales\" form on gob.mx) and returns the CURP registered for that person. Names are uppercased and stripped of accents (Ñ and Ü stay). Every invalid field is reported at once in a 422. ~5 s.","externalDocs":{"description":"Endpoint guide","url":"https://curpcheck.com/docs/endpoints/curp-search"},"operationId":"curpSearch","requestBody":{"content":{"application/json":{"schema":{"properties":{"birthdate":{"example":"1980-01-01","format":"date","type":"string"},"include_pdf":{"default":false,"description":"Include the official CURP PDF in pdf_base64 at no extra credit cost. A PDF download failure returns found: null and is not charged.","type":"boolean"},"mothers_maiden_name":{"description":"Omit when the person has a single surname.","example":"MARTINEZ","type":"string"},"names":{"example":"JUAN","type":"string"},"paternal_surname":{"example":"PEREZ","type":"string"},"sex":{"enum":["H","M","X"],"type":"string"},"state":{"description":"Two-letter state of birth code as used in CURPs (e.g. DF, JC, NL), or NE for people born abroad.","example":"DF","type":"string"}},"required":["names","paternal_surname","birthdate","sex","state"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"illustrative":{"summary":"Abbreviated illustrative response; identifiers and names are placeholders.","value":{"curp":"TU_CURP_REAL","found":true,"message":"Identity retrieved from RENAPO","person":{"associated_curps":[],"certification":"CURP Certificada: verificada con el Registro Civil","certified":true,"curp":"TU_CURP_REAL","homonimo":false,"mothers_maiden_name":"APELLIDO MATERNO","names":"NOMBRES","paternal_surname":"APELLIDO PATERNO","renapo_valid":true}}}},"schema":{"properties":{"curp":{"type":"string"},"found":{"description":"true = RENAPO returned the record in `person`; false = RENAPO did not return a single record (charged; `person.homonimo` is true when RENAPO reports a problem with the key); null = RENAPO unreachable (not charged).","nullable":true,"type":"boolean"},"message":{"type":"string"},"pdf_base64":{"contentEncoding":"base64","contentMediaType":"application/pdf","description":"Official RENAPO PDF; present only when include_pdf is true and found is true.","type":"string"},"person":{"$ref":"#/components/schemas/CurpIdentity","nullable":true}},"type":"object"}}},"description":"Search completed. `found` is true / false / null."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Payment Required"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Body has `error` set to `invalid_fields` and `fields` listing every missing or malformed field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Too Many Requests"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal Server Error"}},"security":[{"apiKey":[]}],"summary":"Find a CURP by personal data"}},"/ine/verify":{"post":{"description":"Asks INE's Lista Nominal service whether a credencial para votar is current. Send `cic` and exactly one of `id_ciudadano` (models E to J) or `ocr` (model D). Values shorter than the full length are left-padded with zeroes. An answer without a record (`found: false`) costs 10 credits; `found: null` means INE could not be reached and is not charged. ~15–40 s.","externalDocs":{"description":"Endpoint guide","url":"https://inecheck.com/docs/endpoints/ine-verify"},"operationId":"ineVerify","requestBody":{"content":{"application/json":{"example":{"cic":"123456789","id_ciudadano":"987654321"},"schema":{"properties":{"cic":{"description":"Credential identification code: the nine digits after IDMEX on the first line on the back.","example":"123456789","pattern":"^[0-9]{1,9}$","type":"string"},"id_ciudadano":{"description":"Citizen identifier, models E to J: the last nine digits of the first line on the back. Send this or `ocr`.","example":"987654321","pattern":"^[0-9]{1,9}$","type":"string"},"ocr":{"description":"OCR, model D. Send this or `id_ciudadano`.","example":"1234567890123","pattern":"^[0-9]{1,13}$","type":"string"}},"required":["cic"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cic":{"type":"string"},"credential":{"$ref":"#/components/schemas/IneCredential","nullable":true},"found":{"description":"true = INE returned the record in `credential`; false = INE answered without a record (charged); null = INE unreachable (not charged).","nullable":true,"type":"boolean"},"message":{"type":"string"},"status":{"description":"INE's verdict. `unknown` means INE returned a record without stating whether it is current.","enum":["vigente","no_vigente","no_encontrada","unknown",null],"nullable":true,"type":"string"}},"type":"object"}}},"description":"Lookup completed. `found` is true / false / null."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Payment Required"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Body has `error` set to `invalid_fields` and `fields` listing every missing or malformed field."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Too Many Requests"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal Server Error"}},"security":[{"apiKey":[]}],"summary":"Verify a voter ID with INE"}},"/rfc/commerce-registry":{"post":{"description":"Returns the company's folios (FME) in the Registro Público de Comercio (SIGER), each with its general data, shareholders, and registered acts. Act documents (PDFs) are not included.\n\nThe registry is searched by company name: the optional `name`, or else the name SAT has registered for the RFC (from the same certificate lookup as `/profile`). A record matches when its name equals the searched one once punctuation, accents, and legal-entity suffixes are ignored; records whose own RFC differs from the requested one are dropped. Not every state's registry is supported yet; more are coming soon. A folio in an unsupported state comes back with `supported: false` and only `fme`, `name`, and `registry_office` set. When every match is in an unsupported state, `message` says so and the request is not charged.\n\nCompany (persona moral) RFCs only. ~20–60 s, a few seconds less with `name`; companies with a long registry history can take a few minutes, past the 100 s synchronous limit, so use `webhook_url` for them. Webhook supported: with `webhook_url` the request is accepted with 202 and charged then, and refunded before the result is delivered if the lookup found nothing chargeable (e.g. only unsupported states, or the registry unreachable).\n\n**Beta:** pricing may change soon.","externalDocs":{"description":"Endpoint guide","url":"https://rfccheck.com/docs/endpoints/commerce-registry"},"operationId":"rfcCommerceRegistry","requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"Optional. Company name to search instead of the SAT-registered one. Legal-entity suffixes are ignored.","example":"ACME CONSULTORES","type":"string"},"rfc":{"description":"Company (persona moral) RFC, 12 characters","example":"ACM180711AB1","type":"string"},"webhook_url":{"description":"URL to receive the result asynchronously. The API returns 202 immediately and POSTs the JSON result here when complete. Must be http or https. Redirects are not followed. Max 2048 chars.","example":"https://example.com/webhooks/rfc","format":"uri","maxLength":2048,"type":"string"}},"required":["rfc"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"found":{"nullable":true,"type":"boolean"},"message":{"type":"string"},"name":{"description":"The company name that was searched.","nullable":true,"type":"string"},"records":{"items":{"$ref":"#/components/schemas/CommerceRegistryRecord"},"type":"array"},"rfc":{"type":"string"}},"type":"object"}}},"description":"Lookup completed. `found` is true / false / null (SAT or the registry unreachable, retry)."},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAccepted"}}},"description":"Accepted: async processing started. Result will be POSTed to the webhook URL."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Payment Required"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Body has `error` set to one of: `missing_rfc`, `invalid_rfc`, `company_rfc_required` (a persona física RFC)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Too Many Requests"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal Server Error"}},"security":[{"apiKey":[]}],"summary":"Look up a company in the Registro Público de Comercio (beta)"}},"/rfc/find-zip":{"post":{"description":"Searches SAT's massive consultation endpoint to find the postal code registered for an RFC + name combination. Skips the certificate lookup, so the caller must provide the cleaned name (see Names section in the API description). ~10–15 s. Webhook supported.\n\nUse this when an invoicing flow needs the zip code but the customer name is already on file.","externalDocs":{"description":"Endpoint guide","url":"https://rfccheck.com/docs/endpoints/find-zip"},"operationId":"rfcFindZip","requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"Registered taxpayer name as it appears in SAT. **Companies:** omit legal-entity suffixes (S.A. de C.V., SAPI de C.V., SOFOM, AC, SC, etc.). **Persons:** legal name with no honorifics. See top-level `Names` section.","example":"ACME CONSULTORES","type":"string"},"rfc":{"description":"The RFC number to validate (12 or 13 characters)","example":"XAXX010101000","type":"string"},"webhook_url":{"description":"URL to receive the result asynchronously. The API returns 202 immediately and POSTs the JSON result here when complete. Must be http or https. Redirects are not followed. Max 2048 chars.","example":"https://example.com/webhooks/rfc","format":"uri","maxLength":2048,"type":"string"}},"required":["rfc","name"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"},"rfc":{"type":"string"},"valid":{"description":"true = zip found; false = combination not in SAT registry; null = SAT unreachable for some batches.","nullable":true,"type":"boolean"},"zip":{"nullable":true,"type":"string"}},"type":"object"}}},"description":"Search completed (sync mode only). `valid` is true / false / null."},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAccepted"}}},"description":"Accepted: async processing started. Result will be POSTed to the webhook URL."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Payment Required"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Body has `error` set to one of: `missing_rfc`, `invalid_rfc`, `missing_name`, `invalid_webhook_url`."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Too Many Requests"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal Server Error"}},"security":[{"apiKey":[]}],"summary":"Find the SAT-registered zip for a known RFC + name"}},"/rfc/profile":{"post":{"description":"Returns the SAT-registered personal data for an RFC:\n\n- **Persona física (individual):** legal name, CURP, and contact email on file.\n- **Persona moral (company):** company name, legal representative RFC + CURP, and contact email on file.\n\nThe data is parsed from the digital certificates (CSD + FIEL) SAT publishes for the RFC. You also get serial, status, and validity dates for each certificate, plus the base64 .cer blob. Sync only, ~1–3 s. Use for KYC, account onboarding, or pre-filling customer records.","externalDocs":{"description":"Endpoint guide","url":"https://rfccheck.com/docs/endpoints/profile"},"operationId":"rfcProfile","requestBody":{"content":{"application/json":{"schema":{"properties":{"rfc":{"description":"The RFC number to validate (12 or 13 characters)","example":"XAXX010101000","type":"string"}},"required":["rfc"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"certs":{"items":{"$ref":"#/components/schemas/Certificate"},"type":"array"},"curp":{"description":"CURP of the taxpayer. Only present for persona física.","type":"string"},"email":{"description":"Contact email SAT has on file for the taxpayer.","type":"string"},"found":{"description":"true = SAT returned a registered taxpayer; false = SAT has no record; null = SAT unreachable.","nullable":true,"type":"boolean"},"legal_representative_curp":{"description":"CURP of the legal representative. Only present for persona moral.","type":"string"},"legal_representative_rfc":{"description":"RFC of the legal representative. Only present for persona moral.","type":"string"},"message":{"type":"string"},"name":{"nullable":true,"type":"string"},"rfc":{"type":"string"},"source":{"description":"sat_registry confirms registration only; it provides no certificate profile or identity details. Omitted for generic RFCs.","enum":["sat_certificates","sat_registry"],"type":"string"}},"type":"object"}}},"description":"Lookup completed. `found` is true / false / null. Missing or unavailable certificates fall back to SAT registry verification: `source` is `sat_registry`, `name` is null and `certs` is empty. An answered fallback costs 1 credit; a full certificate profile costs 3 credits. An unavailable answer costs no credits."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Payment Required"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Body has `error` set to: `missing_rfc` or `invalid_rfc`."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Too Many Requests"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal Server Error"}},"security":[{"apiKey":[]}],"summary":"Look up the registered taxpayer's personal data"}},"/rfc/sat-lists":{"post":{"description":"Returns 69-B / 69 / 69-B bis listings for an RFC. Local DB lookup, no SAT roundtrip. ~ms. Use for compliance dashboards.","externalDocs":{"description":"Endpoint guide","url":"https://rfccheck.com/docs/endpoints/sat-lists"},"operationId":"rfcSatLists","requestBody":{"content":{"application/json":{"schema":{"properties":{"rfc":{"description":"The RFC number to validate (12 or 13 characters)","example":"XAXX010101000","type":"string"}},"required":["rfc"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"rfc":{"type":"string"},"sat_lists":{"items":{"$ref":"#/components/schemas/SatListing"},"type":"array"}},"type":"object"}}},"description":"Lookup completed. `sat_lists` is empty when the RFC is in no list."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Payment Required"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Body has `error` set to: `missing_rfc` or `invalid_rfc`."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Too Many Requests"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal Server Error"}},"security":[{"apiKey":[]}],"summary":"List SAT-published contributor lists an RFC appears in"}},"/rfc/validate":{"post":{"description":"Runs the full validation pipeline: certificate lookup for the registered name, zip-code search, certificate enrichment, and SAT-list lookup. The response includes registration status, taxpayer name, postal code, digital certificates, and SAT-list presence. RENAPO identity lookup is disabled by default. Set `include_curp: true` to enable it for 10 additional credits (20 total, $0.30 USD pay-as-you-go).\n\n**Identity enrichment:**\n- **Company / persona moral:** includes `legal_representative` with the representative's verified name, surnames, birthdate, CURP status, and other identity details.\n- **Individual / persona física:** includes `person` only when a CURP is available in the source data; not every individual response includes it.\n- Identity details are verified through RENAPO. If that government lookup is unavailable, RFC validation still completes without the corresponding identity object.\n\nWebhook delivery is supported.\n\n**Latency:**\n- Without `name`: ~30 s (cert lookup + zip search run sequentially).\n- **With `name`** (recommended when you know it): ~12 s. Cert lookup and zip search run in parallel, and you also recover a zip for registered RFCs that have zero CSDs.\n- When enabled, identity lookup runs alongside zip discovery and is capped at 45 s.\n\nWhen the provided `name` doesn't match SAT records, the response is `valid: false` with a message explaining the registered name. Use the more targeted endpoints (`/profile`, `/find-zip`, `/verify`) when you already have part of the answer.","externalDocs":{"description":"Endpoint guide","url":"https://rfccheck.com/docs/endpoints/validate"},"operationId":"validateRfc","requestBody":{"content":{"application/json":{"schema":{"properties":{"include_curp":{"default":false,"description":"Enable RENAPO identity lookup for the taxpayer or legal representative when a CURP is available. Adds 10 credits to the request (20 total, $0.30 USD pay-as-you-go).","type":"boolean"},"name":{"description":"Optional. When provided, cert lookup and zip search run in parallel (~12 s instead of ~30 s) and a zip is recovered even when the RFC has zero CSDs. Registered taxpayer name as it appears in SAT. **Companies:** omit legal-entity suffixes (S.A. de C.V., SAPI de C.V., SOFOM, AC, SC, etc.). **Persons:** legal name with no honorifics. See top-level `Names` section.","example":"ACME CONSULTORES","type":"string"},"rfc":{"description":"The RFC number to validate (12 or 13 characters)","example":"XAXX010101000","type":"string"},"webhook_url":{"description":"URL to receive the result asynchronously. The API returns 202 immediately and POSTs the JSON result here when complete. Must be http or https. Redirects are not followed. Max 2048 chars.","example":"https://example.com/webhooks/rfc","format":"uri","maxLength":2048,"type":"string"}},"required":["rfc"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"certs":{"items":{"$ref":"#/components/schemas/Certificate"},"type":"array"},"curp":{"description":"CURP of the taxpayer. Only present for persona física.","type":"string"},"email":{"description":"Contact email SAT has on file for the taxpayer.","type":"string"},"legal_representative":{"$ref":"#/components/schemas/LegalRepresentative","description":"Verified identity for a persona moral's legal representative, including name, surnames, birthdate, and CURP status. Present only with `include_curp: true`, an available CURP, and a successful RENAPO lookup."},"legal_representative_curp":{"description":"CURP of the legal representative. Only present for persona moral.","type":"string"},"legal_representative_rfc":{"description":"RFC of the legal representative. Only present for persona moral.","type":"string"},"message":{"type":"string"},"name":{"nullable":true,"type":"string"},"person":{"$ref":"#/components/schemas/CurpIdentity","description":"Verified identity for a persona física taxpayer. Present only with `include_curp: true`, an available CURP, and a successful RENAPO lookup."},"rfc":{"type":"string"},"sat_lists":{"items":{"$ref":"#/components/schemas/SatListing"},"type":"array"},"valid":{"description":"true = registered, false = not registered, null = SAT unreachable (retry later)","nullable":true,"type":"boolean"},"zip":{"nullable":true,"type":"string"}},"type":"object"}}},"description":"Successful validation. `valid` is true / false / null (null = SAT unreachable)."},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAccepted"}}},"description":"Accepted: async processing started. Result will be POSTed to the webhook URL."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized: invalid or missing API key"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Payment Required: insufficient balance or no active subscription"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Body has `error` set to one of: `missing_rfc`, `invalid_rfc`, `invalid_webhook_url`."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Too Many Requests: rate limit exceeded"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal Server Error"}},"security":[{"apiKey":[]}],"summary":"Full RFC validation (cert lookup + zip search + lists)"}},"/rfc/verify":{"post":{"description":"Two modes:\n\n- **RFC only** (`{rfc}`): quick padrón check via SAT's ValidaRFC endpoint. ~1–2 s. Confirms whether the RFC is registered and active with SAT.\n- **Full combo** (`{rfc, name, zip}`): single-round-trip combo check via the massive-consultation endpoint. ~1–2 s. Confirms that the RFC + name + zip combination matches SAT's records.\n\nProvide `name` and `zip` together (combo mode), or neither (RFC-only mode). Providing only one is rejected with 422.","externalDocs":{"description":"Endpoint guide","url":"https://rfccheck.com/docs/endpoints/verify"},"operationId":"rfcVerify","requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"Optional. Requires `zip`. Registered taxpayer name as it appears in SAT. **Companies:** omit legal-entity suffixes (S.A. de C.V., SAPI de C.V., SOFOM, AC, SC, etc.). **Persons:** legal name with no honorifics. See top-level `Names` section.","example":"ACME CONSULTORES","type":"string"},"rfc":{"description":"The RFC number to validate (12 or 13 characters)","example":"XAXX010101000","type":"string"},"zip":{"description":"Optional. Requires `name`. 5-digit Mexican postal code","example":"06600","pattern":"^\\d{5}$","type":"string"}},"required":["rfc"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"},"rfc":{"type":"string"},"valid":{"description":"true = SAT confirms; false = SAT rejects; null = SAT unreachable.","nullable":true,"type":"boolean"}},"type":"object"}}},"description":"Verification completed."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Payment Required"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Body has `error` set to one of: `missing_rfc`, `invalid_rfc`, `missing_name` (zip provided without name), `missing_zip` (name provided without zip), `invalid_zip`."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Too Many Requests"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal Server Error"}},"security":[{"apiKey":[]}],"summary":"Verify an RFC, optionally against a name + zip"}},"/rfc/verify-batch":{"post":{"description":"Submits up to 5000 records to SAT in a single round-trip and returns per-record verdicts. ~10–15 s for the whole batch, so the per-record cost is tiny when amortized. **Webhook required**: there is no sync mode for this endpoint.","externalDocs":{"description":"Endpoint guide","url":"https://rfccheck.com/docs/endpoints/verify-batch"},"operationId":"rfcVerifyBatch","requestBody":{"content":{"application/json":{"schema":{"properties":{"records":{"items":{"properties":{"name":{"description":"Registered taxpayer name as it appears in SAT. **Companies:** omit legal-entity suffixes (S.A. de C.V., SAPI de C.V., SOFOM, AC, SC, etc.). **Persons:** legal name with no honorifics. See top-level `Names` section.","example":"ACME CONSULTORES","type":"string"},"rfc":{"description":"The RFC number to validate (12 or 13 characters)","example":"XAXX010101000","type":"string"},"zip":{"description":"5-digit Mexican postal code","example":"06600","pattern":"^\\d{5}$","type":"string"}},"required":["rfc","name","zip"],"type":"object"},"maxItems":5000,"type":"array"},"webhook_url":{"description":"URL to receive the result asynchronously. The API returns 202 immediately and POSTs the JSON result here when complete. Must be http or https. Redirects are not followed. Max 2048 chars.","example":"https://example.com/webhooks/rfc","format":"uri","maxLength":2048,"type":"string"}},"required":["records","webhook_url"],"type":"object"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAccepted"}}},"description":"Accepted: async processing started. Result will be POSTed to the webhook URL."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Payment Required"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Body has `error` set to one of: `missing_records`, `missing_webhook_url`, `invalid_webhook_url`, `empty_batch`, `batch_too_large`, `invalid_record` (with `index` and `reason`)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Too Many Requests"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal Server Error"}},"security":[{"apiKey":[]}],"summary":"Bulk-verify up to 5000 RFC + name + zip records"}}},"servers":[{"description":"Production server","url":"https://curpcheck.com/v1"}]}