{"components":{"schemas":{"Certificate":{"properties":{"cer_base64":{"description":"Base64 DER of the .cer file. Null when SAT's CDN did not serve it.","type":["string","null"]},"curp":{"description":"Persona física certs only","type":["string","null"]},"email":{"type":["string","null"]},"legal_representative_curp":{"description":"Persona moral certs only","type":["string","null"]},"legal_representative_rfc":{"description":"Persona moral certs only","type":["string","null"]},"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"},"CfdiRecord":{"description":"A CFDI as SAT's Verifica CFDI portal prints it. Values are the portal's text, unparsed; blank cells are null.","properties":{"efecto_comprobante":{"description":"Voucher type: Ingreso, Egreso, Traslado, Nómina, or Pago.","example":"Ingreso","type":["string","null"]},"es_cancelable":{"description":"Whether and how the CFDI can be cancelled.","example":"Cancelable sin aceptación","type":["string","null"]},"estado":{"description":"SAT's state, unchanged: Vigente or Cancelado.","example":"Vigente","type":["string","null"]},"estatus_cancelacion":{"description":"Cancellation request status, when one exists.","type":["string","null"]},"fecha_cancelacion":{"description":"Cancellation date, when cancelled.","type":["string","null"]},"fecha_certificacion":{"description":"Stamping (certification) date, SAT's format, no time zone.","example":"2024-05-06T17:46:06","type":["string","null"]},"fecha_emision":{"description":"Issue date, SAT's format, no time zone.","example":"2024-05-06T17:45:57","type":["string","null"]},"folio_sustitucion":{"description":"UUID of the replacing CFDI, for reason 01.","type":["string","null"]},"motivo":{"description":"Cancellation reason code (01–04), when cancelled.","type":["string","null"]},"nombre_emisor":{"description":"Issuer name as SAT prints it.","example":"ACME CONSULTORES","type":["string","null"]},"nombre_receptor":{"description":"Receiver name as SAT prints it.","example":"PUBLICO EN GENERAL","type":["string","null"]},"rfc_emisor":{"description":"Issuer RFC.","example":"ACM010101AAA","type":["string","null"]},"rfc_pac":{"description":"RFC of the PAC that stamped the CFDI.","example":"ACM010101AAA","type":["string","null"]},"rfc_receptor":{"description":"Receiver RFC.","example":"XAXX010101000","type":["string","null"]},"sello_cfdi":{"description":"Issuer seal verdict (e.g. Válido). Only for XML uploads.","type":["string","null"]},"sello_timbre_fiscal":{"description":"Stamp seal verdict (e.g. Válido). Only for XML uploads.","type":["string","null"]},"total":{"description":"Total as SAT prints it, currency-formatted.","example":"$1,000.00","type":["string","null"]},"uuid":{"description":"Folio fiscal (UUID).","example":"5FB2822E-396D-4725-8521-CDC4BDD20CCF","type":["string","null"]}},"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":{"type":["string","null"]},"document_number":{"type":["string","null"]},"filed_at":{"description":"Fecha de ingreso","type":["string","null"]},"form":{"description":"Forma precodificada","type":["string","null"]},"modality":{"type":["string","null"]},"nci":{"description":"Número de control interno","type":["string","null"]},"registered_at":{"description":"Fecha de inscripción","type":["string","null"]}},"type":"object"},"type":"array"},"business_line":{"description":"Giro","type":["string","null"]},"corporate_purpose":{"description":"Objeto social","type":["string","null"]},"curp":{"type":["string","null"]},"domicile":{"description":"Domicilio social","type":["string","null"]},"duration":{"description":"Duración de la sociedad","type":["string","null"]},"fme":{"description":"Folio mercantil electrónico","type":"string"},"legal_regime":{"description":"Régimen jurídico","type":["string","null"]},"municipality":{"type":["string","null"]},"name":{"description":"Razón social as registered","type":"string"},"nationality":{"type":["string","null"]},"person_type":{"enum":["moral","fisica",null],"type":["string","null"]},"prior_registration":{"description":"Antecedente registral","type":["string","null"]},"registered_at":{"description":"Fecha de inscripción","type":["string","null"]},"registry_office":{"description":"Oficina registral","type":["string","null"]},"rfc":{"type":["string","null"]},"shareholders":{"items":{"properties":{"birth_date":{"description":"YYYY-MM-DD, individual shareholders","type":["string","null"]},"curp":{"type":["string","null"]},"first_surname":{"type":["string","null"]},"incorporation_date":{"description":"YYYY-MM-DD, company shareholders","type":["string","null"]},"name":{"description":"Given names, or the company name","type":["string","null"]},"nationality":{"type":["string","null"]},"rfc":{"type":["string","null"]},"second_surname":{"type":["string","null"]},"series":{"type":["string","null"]},"share_value":{"description":"MXN amount per share as a decimal string, e.g. \"500.00\"","type":["string","null"]},"shares":{"type":["integer","null"]},"status":{"type":["string","null"]},"total_value":{"description":"MXN amount as a decimal string, e.g. \"49500.00\"","type":["string","null"]}},"type":"object"},"type":"array"},"state":{"description":"Entidad federativa","type":["string","null"]},"status":{"description":"Estatus FME, e.g. Abierto","type":["string","null"]},"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"},"type":["array","null"]},"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","type":["string","null"]},"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.","type":["boolean","null"]},"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":{"type":["string","null"]},"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":{"type":["string","null"]},"anio_registro":{"type":["string","null"]},"cic":{"type":["string","null"]},"clave_elector":{"type":["string","null"]},"distrito_federal":{"type":["string","null"]},"distrito_local":{"type":["string","null"]},"en_lista_nominal":{"type":["boolean","null"]},"en_padron_electoral":{"type":["boolean","null"]},"fecha_actualizacion":{"description":"When INE last updated the record, local time without offset.","type":["string","null"]},"fecha_consulta":{"format":"date","type":["string","null"]},"found":{"type":"boolean"},"mensaje":{"description":"INE's headline sentence, in Spanish.","type":["string","null"]},"modelo":{"enum":["d","e"],"type":"string"},"numero_emision":{"type":["string","null"]},"ocr":{"type":["string","null"]},"puede_votar":{"description":"True only when INE also places the holder in the Lista Nominal.","type":["boolean","null"]},"status":{"type":"string"},"vigencia":{"description":"Expiry date.","format":"date","type":["string","null"]},"vigente":{"description":"INE reports the credential as valid identification.","type":["boolean","null"]}},"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"},"type":["array","null"]},"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","type":["string","null"]},"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.","type":["boolean","null"]},"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":{"type":["string","null"]},"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"},"first_publication_date":{"description":"Date SAT first published the listing, when the list provides one","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://rfccheck.com/docs"},"info":{"contact":{"email":"help@rfccheck.com","name":"RFCCheck Support","url":"https://rfccheck.com/docs"},"description":"REST API to validate Mexican RFC (Registro Federal de Contribuyentes) numbers against the SAT database in real time. Returns registration status, taxpayer name, postal code, digital certificate information, and SAT published contributor-list presence. Optional `include_curp: true` adds RENAPO identity for the taxpayer or legal representative and costs 10 additional credits (20 total).\n\n## Endpoints by use case\n\nEach endpoint trades work for speed depending on what the caller already knows:\n\n- `/rfc/validate`: full pipeline (cert lookup + zip search + SAT lists). Returns registration status, name, zip, digital certificates, and SAT-list presence. Optional `include_curp: true` adds RENAPO identity for 10 additional credits (20 total). ~30 s, or **~12 s** if you pass an optional `name` (cert + zip run in parallel).\n- `/rfc/profile`: RFC → SAT-registered name, CURP (individuals) or legal representative RFC + CURP (companies), and the contact email on file. ~1–3 s. Use for KYC, account onboarding, or pre-filling customer records.\n- `/rfc/find-zip`: RFC + name → zip. ~10–15 s. Use for invoicing flows where the name is known but the zip is missing.\n- `/rfc/verify`: RFC + name + zip → valid (or RFC alone for a quick padrón check). ~1–2 s. Use to confirm a customer-supplied combination.\n- `/rfc/sat-lists`: RFC → 69-B / 69 listings. ~ms. Use for compliance dashboards.\n- `/rfc/verify-batch`: bulk verification of up to 5000 records. ~10–15 s. Webhook-only.\n- `/rfc/commerce-registry`: company RFC → Registro Público de Comercio records (general data, shareholders, registered acts). ~20–60 s. Use for supplier due diligence and company onboarding.\n- `/cfdi/verify`: CFDI folio (UUID) + issuer and receiver RFCs, or the CFDI XML → whether SAT reports the invoice as current or cancelled, with its cancellation status. ~3 s. Use to check an invoice before paying or deducting it.\n\n## Identity enrichment\n\nDisabled by default. Set `include_curp: true` to enable RENAPO identity lookup for 10 additional credits (20 total, $0.30 USD pay-as-you-go).\n\n- **Companies (persona moral):** `legal_representative` is the primary identity enrichment and contains the representative's verified identity details.\n- **Individuals (persona física):** `person` is a secondary enrichment available only when the taxpayer has an applicable CURP in the source data. Not every individual response includes it.\n- Identity details are verified through RENAPO. If the government lookup is unavailable, RFC validation still completes without the corresponding identity object.\n\n## Names: company vs. person\n\n`name` fields submitted to `/find-zip`, `/verify`, and `/verify-batch` must match SAT's registered name.\n\n- **Companies (persona moral):** Submit the razón social **without** legal-entity suffixes. Strip `S.A. de C.V.`, `SA DE CV`, `SAPI de C.V.`, `SAB de C.V.`, `S de RL de CV`, `SOFOM`, `AC`, `SC`, `SAS`, etc.\n  - ✅ `ACME CONSULTORES`\n  - ❌ `ACME CONSULTORES S.A. de C.V.`\n- **Persons (persona física):** Submit the legal name as registered with SAT: `apellido paterno + apellido materno + nombres`. No honorifics.\n  - ✅ `JUAN PEREZ LOPEZ`\n  - ❌ `Sr. Juan Pérez López`\n\nThe server safety-cleans known company suffixes, but pre-cleaned names yield faster, more reliable matches.\n\n## CURP and INE endpoints\n\nThe same API key also calls `/curp/lookup` (RENAPO identity by CURP) and `/curp/search` (find a CURP by personal data), documented on CURPCheck, and `/ine/verify` (whether INE reports a voter ID as current), documented on INECheck.","termsOfService":"https://rfccheck.com/terms-and-conditions","title":"RFCCheck API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/cfdi/verify":{"post":{"description":"Asks SAT's Verifica CFDI portal whether a CFDI (factura) is registered and whether it is current or cancelled. Send either the folio search (`uuid`, `rfc_emisor`, `rfc_receptor`) or the CFDI itself as `xml`, never both. Upload the XML file as multipart/form-data (`curl -F xml=@factura.xml`), or send it as a string in a JSON body. Sending the XML also has SAT check the CFDI's seals (`sello_cfdi`, `sello_timbre_fiscal`). An answer without a record (`found: false`) costs 5 credits; `found: null` means SAT could not be reached and is not charged. ~3 s.","externalDocs":{"description":"Endpoint guide","url":"https://rfccheck.com/docs/endpoints/cfdi-verify"},"operationId":"cfdiVerify","requestBody":{"content":{"application/json":{"example":{"rfc_emisor":"ACM010101AAA","rfc_receptor":"XAXX010101000","uuid":"5FB2822E-396D-4725-8521-CDC4BDD20CCF"},"schema":{"oneOf":[{"properties":{"rfc_emisor":{"description":"RFC of the issuer (emisor).","example":"ACM010101AAA","type":"string"},"rfc_receptor":{"description":"RFC of the receiver (receptor).","example":"XAXX010101000","type":"string"},"uuid":{"description":"Folio fiscal (UUID) of the CFDI, any case.","example":"5FB2822E-396D-4725-8521-CDC4BDD20CCF","format":"uuid","type":"string"}},"required":["uuid","rfc_emisor","rfc_receptor"],"title":"Folio search","type":"object"},{"properties":{"xml":{"description":"The CFDI XML document as a string, as stamped by the PAC (with its tfd:TimbreFiscalDigital).","type":"string"}},"required":["xml"],"title":"XML upload","type":"object"}]}},"multipart/form-data":{"schema":{"properties":{"xml":{"contentMediaType":"application/xml","description":"The CFDI XML file as stamped by the PAC (with its tfd:TimbreFiscalDigital).","type":"string"}},"required":["xml"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cfdi":{"anyOf":[{"$ref":"#/components/schemas/CfdiRecord"},{"type":"null"}]},"found":{"description":"true = SAT returned the CFDI in `cfdi`; false = SAT answered without one (charged); null = SAT unreachable (not charged).","type":["boolean","null"]},"message":{"description":"Plain-language summary. For `no_encontrado` and `rechazado` it is SAT's own message, in Spanish.","type":"string"},"status":{"description":"`vigente` or `cancelado` when found, `no_encontrado` when SAT has no such CFDI, `rechazado` when the portal refused the request itself (e.g. an XML it could not read), null when `found` is null. A status SAT adds later is passed through lowercased, so treat unknown values as neither current nor cancelled.","examples":["vigente","cancelado","no_encontrado","rechazado"],"type":["string","null"]},"uuid":{"description":"Folio fiscal asked about, uppercased. For an XML upload it is read from the stamp; null when the XML carries none and SAT found nothing.","type":["string","null"]}},"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. Sending both the folio fields and `xml` lists the ones sent."},"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"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway Timeout: the lookup did not finish within 90 seconds. Body is `{\"error\": \"request_timeout\"}`. Not charged."}},"security":[{"apiKey":[]}],"summary":"Verify a CFDI with SAT"}},"/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).","type":["boolean","null"]},"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":{"anyOf":[{"$ref":"#/components/schemas/CurpIdentity"},{"type":"null"}]}},"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"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway Timeout: the lookup did not finish within 90 seconds. Body is `{\"error\": \"request_timeout\"}`. Not charged."}},"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).","type":["boolean","null"]},"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":{"anyOf":[{"$ref":"#/components/schemas/CurpIdentity"},{"type":"null"}]}},"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"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway Timeout: the lookup did not finish within 90 seconds. Body is `{\"error\": \"request_timeout\"}`. Not charged."}},"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":{"anyOf":[{"$ref":"#/components/schemas/IneCredential"},{"type":"null"}]},"found":{"description":"true = INE returned the record in `credential`; false = INE answered without a record (charged); null = INE unreachable (not charged).","type":["boolean","null"]},"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],"type":["string","null"]}},"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"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway Timeout: the lookup did not finish within 90 seconds. Body is `{\"error\": \"request_timeout\"}`. Not charged."}},"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 90 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":{"type":["boolean","null"]},"generic":{"description":"true for SAT's generic RFCs (XAXX010101000, XEXX010101000, EXTF900101NI1, EXT990101NI1), which identify no taxpayer and are answered without querying SAT.","type":"boolean"},"message":{"type":"string"},"name":{"description":"The company name that was searched.","type":["string","null"]},"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"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway Timeout: the lookup did not finish within 90 seconds. Body is `{\"error\": \"request_timeout\"}`. Not charged."}},"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":{"generic":{"description":"true for SAT's generic RFCs (XAXX010101000, XEXX010101000, EXTF900101NI1, EXT990101NI1), which identify no taxpayer and are answered without querying SAT.","type":"boolean"},"message":{"type":"string"},"rfc":{"type":"string"},"valid":{"description":"true = zip found; false = combination not in SAT registry; null = SAT unreachable for some batches.","type":["boolean","null"]},"zip":{"type":["string","null"]}},"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"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway Timeout: the lookup did not finish within 90 seconds. Body is `{\"error\": \"request_timeout\"}`. Not charged."}},"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.","type":["boolean","null"]},"generic":{"description":"true for SAT's generic RFCs (XAXX010101000, XEXX010101000, EXTF900101NI1, EXT990101NI1), which identify no taxpayer and are answered without querying SAT.","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":{"type":["string","null"]},"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"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway Timeout: the lookup did not finish within 90 seconds. Body is `{\"error\": \"request_timeout\"}`. Not charged."}},"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"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway Timeout: the lookup did not finish within 90 seconds. Body is `{\"error\": \"request_timeout\"}`. Not charged."}},"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"},"generic":{"description":"true for SAT's generic RFCs (XAXX010101000, XEXX010101000, EXTF900101NI1, EXT990101NI1), which identify no taxpayer and are answered without querying SAT.","type":"boolean"},"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":{"type":["string","null"]},"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)","type":["boolean","null"]},"zip":{"type":["string","null"]}},"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"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway Timeout: the lookup did not finish within 90 seconds. Body is `{\"error\": \"request_timeout\"}`. Not charged."}},"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":{"generic":{"description":"true for SAT's generic RFCs (XAXX010101000, XEXX010101000, EXTF900101NI1, EXT990101NI1), which identify no taxpayer and are answered without querying SAT.","type":"boolean"},"message":{"type":"string"},"rfc":{"type":"string"},"valid":{"description":"true = SAT confirms; false = SAT rejects; null = SAT unreachable.","type":["boolean","null"]}},"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"},"504":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Gateway Timeout: the lookup did not finish within 90 seconds. Body is `{\"error\": \"request_timeout\"}`. Not charged."}},"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://rfccheck.com/v1"}]}