Saltar al contenido

API de RESET Verifica

API REST con autenticación por llave. Toda operación devuelve JSON con el resultado, su fuente y un verification_id auditable.

Alta en línea. Regístrate: al confirmar tu correo recibes tu llave de sandbox gratuita y tu llave de producción. Tu saldo, tus movimientos, tus datos fiscales y tus facturas viven en el panel (y por API en /v1/wallet, /v1/uso y /v1/organizacion). Base de la API: https://api.resetparatodos.com.

Formatos de esta documentación

En esta página

Autenticación y sandbox

La llave, el prefijo rv_test_ y los datos de prueba.

Endpoints

Qué expone la API, con su verbo y su ruta.

Screening AML

Sanciones, PEP y listas nacionales, con constancia y monitoreo.

Cálculo fiscal y laboral

ISR, IMSS, finiquito y aguinaldo, con su fundamento y vigencia.

Legislación mexicana

El texto exacto de 198 ordenamientos, federales y de los 32 estados.

Validadores y catálogos

CLABE, RFC, CURP, NSS, tarjeta, catálogos SAT y tipo de cambio.

Pago por llamada (x402)

Diez productos en USDC, sin cuenta ni llave, para agentes.

Catálogo de respuestas

Cuerpos reales de un caso limpio, uno con hallazgo y cada error.

Úsalo desde una IA

Servidor MCP, cómo conectarlo y las 27 herramientas.

Integra en tu lenguaje

Python, JavaScript, PHP, C# y cURL, listos para copiar.

Precios y wallet

Modelo prepago, tarifas y códigos de servicio.

Autenticación

Incluye tu llave en el header X-Api-Key en cada petición. Las llaves se emiten por organización y nunca se almacenan en claro.

curl -H "X-Api-Key: rv_live_..." {BASE}/v1/salud

Sandbox

Las llaves con prefijo rv_test_ activan el modo sandbox: respuestas sintéticas y deterministas, sin tocar ninguna fuente real y sin costo. Las validaciones locales de CFDI (XSD, Anexo 20) sí son reales. Datos de prueba:

EntradaResultado sintético
EFO010101AA169-B Definitivo
PRE010101AA1 / DES010101AA1 / SEN010101AA169-B Presunto / Desvirtuado / Sentencia favorable
CON010101AA12 contratos públicos sintéticos
SAN010101AA1Proveedor sancionado
UUID CFDI 11111111… / 22222222…Estado SAT Vigente / Cancelado
Cualquier otro RFC/UUID válidoSin coincidencia / No encontrado

Endpoints

GET /v1/salud

Estado del servicio, versión del motor, frescura de cada fuente y última corrida de cada job. No requiere autenticación.

GET /v1/empresa/{rfc}

Verificación de persona moral: 69-B (con historial de eventos), contratación pública y sancionados. Parámetro opcional sancionados=false para omitir la consulta al directorio.

curl -H "X-Api-Key: $KEY" {BASE}/v1/empresa/ABC010203XX1

POST /v1/empresa/lote

Verifica un padrón completo de RFCs en una sola llamada — hasta 500. Pensado para revisar de golpe los proveedores de un cliente contra el 69-B y el artículo 69, en vez de hacer una llamada por cada uno.

Los RFCs repetidos se cobran una vez, los mal formados no se cobran, y si el saldo se agota se detiene y te dice cuántos alcanzó a verificar en vez de fallar entero. sancionados va en false por omisión: en lote lo que se busca es el semáforo fiscal del padrón, y el screening contra listas es una consulta mucho más lenta que casi nunca se necesita para las 500.

curl -X POST -H "X-Api-Key: $KEY" -H "Content-Type: application/json"   -d '{"rfcs":["ABC010203XX1","DEF040506YY2"]}'   {BASE}/v1/empresa/lote

La respuesta trae un resumen con cuántos salieron con hallazgo, la lista hallazgos con sólo los que aparecen en algún listado, y el detalle completo en resultados. Cada uno con su verification_id, con el que puedes pedir la constancia del que la necesite.

GET /v1/empresa/{rfc}/contratos

Detalle de contratos públicos del RFC (datos abiertos Compras MX). Parámetro limite (máx. 500).

POST /v1/factura/verificar

Envía el XML del CFDI como cuerpo (Content-Type: application/xml). Valida formato, XSD oficial, Anexo 20; consulta el estado en SAT y cruza el emisor contra 69-B. Parámetro consultar_sat=false para validación solo local. El XML no se almacena.

curl -X POST -H "X-Api-Key: $KEY" -H "Content-Type: application/xml" \
     --data-binary @factura.xml {BASE}/v1/factura/verificar

POST /v1/pago/obligaciones

Registra una obligación a conciliar. Cuerpo JSON: {"referencia":"F-1001","monto":11600.00,"descripcion":"...","moneda":"MXN"}

GET /v1/pago/obligaciones

Lista tus obligaciones. Parámetro opcional estado (abierta, liquidada, sobrepagada).

POST /v1/pago/cep

Envía el XML del CEP como cuerpo. Parámetro opcional refs con referencias de obligaciones separadas por coma. Extrae y minimiza la evidencia, concilia y devuelve el tipo de match. El XML no se almacena.

curl -X POST -H "X-Api-Key: $KEY" --data-binary @cep.xml \
     "{BASE}/v1/pago/cep?refs=F-1001"

POST /v1/pago/cep-lote

Conciliación masiva: un ZIP con hasta 500 CEP XML (multipart/form-data, campo zip, máx. 50 MB). Cada uno se procesa y concilia por separado; la respuesta trae el resumen, el detalle archivo por archivo y los ignorados con su motivo. Solo se cobra cada CEP procesado con éxito; los duplicados no cobran y, si el saldo se agota a medio lote, se detiene e informa el avance.

curl -X POST -H "X-Api-Key: $KEY" -F "zip=@ceps.zip" {BASE}/v1/pago/cep-lote

POST /v1/factura/lote — revisar las facturas del mes

Un ZIP con los CFDI recibidos (multipart/form-data, campo zip, hasta 2,000 XML y 50 MB). Dice cuáles están cancelados en el SAT y qué emisores aparecen en el 69-B o en el artículo 69. Se procesa en segundo plano: contesta 202 con lote_id, y el avance y el reporte se leen en GET /v1/factura/lote/{lote_id} (el Excel en /excel). Cada XML se cobra como una verificación CFDI; uno que tu cuenta ya revisó y pagó no se vuelve a cobrar, aunque su estado se reconsulte. El cruce contra las listas no cuesta. Los XML no se guardan.

curl -X POST -H "X-Api-Key: $KEY" -F "zip=@recibidas_del_mes.zip" {BASE}/v1/factura/lote

POST /v1/pago/spei/validar — ¿este SPEI es real?

Valida una transferencia sin el XML del CEP: con fecha, clave_rastreo, emisor y receptor (claves de GET /v1/pago/bancos), cuenta que recibió y monto, Banco de México confirma si existe y se liquidó, y se coteja contra su CEP oficial. Resultado: SPEI_REAL_CONFIRMADA, SPEI_REAL_NO_COINCIDE, SPEI_REAL_NO_ENCONTRADA o SOURCE_UNAVAILABLE. Se cobra SPEI cuando Banxico contesta, la encuentre o no. POST /v1/pago/spei/leer (campo archivo: PDF o imagen) saca esos datos del comprobante sin costo, para revisarlos antes de validar.

curl -X POST -H "X-Api-Key: $KEY" -H "Content-Type: application/json" \
     -d '{"fecha":"2026-10-01","clave_rastreo":"MBAN01002610010012345678","emisor":"40012","receptor":"40072","cuenta":"072180001234567897","monto":"12500.00"}' \
     {BASE}/v1/pago/spei/validar

POST /v1/transaccion/verificar

Transacción completa en una sola llamada (precio COMBO): empresa + factura + pago. multipart/form-data con cfdi y cep (archivos XML, obligatorios), rfc (opcional; por defecto el emisor del CFDI) y refs (opcional). Devuelve los tres resultados completos más un verification_id de la transacción que referencia los tres individuales.

curl -X POST -H "X-Api-Key: $KEY"      -F "cfdi=@factura.xml" -F "cep=@cep.xml"      -F "rfc=ABC010203XX1" -F "refs=F-1001"      {BASE}/v1/transaccion/verificar

GET /v1/verificaciones/{verification_id}

Recupera una verificación previa de tu organización, con su resultado completo tal como se generó.

Monitoreo 69-B: aviso por correo o por webhook

Da de alta los RFC de tus proveedores (POST /v1/monitoreo/rfcs, hasta 100,000 por cuenta) y te avisamos cuando alguno entre, cambie o salga de los listados 69-B o del artículo 69.

Si no tienes servidor, no necesitas configurar nada: el aviso llega por correo a la dirección de tu cuenta, con un solo mensaje por corrida que lista todos los cambios —no uno por RFC—. Es el camino para un despacho que vigila proveedores sin infraestructura propia.

Y tampoco hace falta llamar a la API para dar de alta los RFC: en Mi padrón subes tu lista en Excel o CSV y quedan vigilados desde ahí. Los endpoints de abajo siguen existiendo para quien prefiera automatizarlo.

La vigilancia es una suscripción por RFC vigilado, con tarifa marginal como la del ISR: los primeros 25 por $99 al mes, del 26 al 100 +$2 por RFC, del 101 al 500 +$1, del 501 al 1,000 +$0.80, del 1,001 al 2,000 +$0.60, del 2,001 al 5,000 +$0.50, del 5,001 al 10,000 +$0.35 y en centavos de ahí en adelante (+$0.20 hasta 25,000, +$0.12 después): 27 RFC = $103, 100 = $249, 500 = $649, 2,000 = $1,649, 10,000 = $4,899. Mes de calendario; anual 12 meses por el precio de 10. El cupo es conjunto: cuenta los RFC vigilados en el 69-B más los nombres vigilados en listas internacionales. Cada cambio llega con su constancia con folio, emitida sola (va en el correo y en el evento del webhook); la primera revisión de la lista se cobra una vez por RFC. Las cifras vigentes siempre salen en GET /v1/precios. Cotiza con GET /v1/monitoreo/cotizar?rfcs=N (público, sin llave), contrata con POST /v1/monitoreo/suscripcion indicando {"rfcs": 27} (o "anual": true) y amplía a mitad de mes con POST /v1/monitoreo/ampliar pagando sólo la diferencia por los días que faltan. Se cobra de tu saldo; sin contrato ni permanencia.

Si prefieres integrarlo, registra tu endpoint (POST /v1/webhooks) y recibirás un POST firmado con HMAC-SHA256 (header X-Reset-Firma) por cada cambio. El webhook es el canal formal —tiene reintentos—; el correo es la cortesía para quien no puede recibirlos. Con /v1/webhooks/{id}/probar pruebas tu integración al momento. También puedes completar tus datos fiscales en PUT /v1/organizacion para recibir el CFDI de tus fondeos.

Constancias, uso y auditoría

POST /v1/verificaciones/{vid}/constancia emite una constancia con validación pública: documento imprimible con folio único, fuentes con su SHA-256 y sello de integridad, verificable por cualquiera en GET /v1/constancias/{folio}/validar sin llave. GET /v1/uso entrega el log de consumo por mes o rango (máx. un año) con totales y detalle por consulta. GET /v1/auditoria/expediente genera el paquete probatorio completo de un periodo — incluyendo la descarga del snapshot original de cada fuente oficial — para responder auditorías. Además, el día 1 de cada mes se envía por correo el reporte de consumo del mes anterior.

Screening AML — sanciones y PEP

Cotejo de un nombre o identificador fiscal contra listas de sanciones y personas políticamente expuestas. La respuesta trae un ledger con cada lista consultada y si hubo o no coincidencia, las coincidencias con su score y su fuente, un resumen y, si lo pides, una constancia PDF sellada. Un resultado limpio en todas las listas es el entregable: sirve como evidencia de debida diligencia. El cotejo de nombre es aproximado (fuzzy): cada coincidencia debe revisarse.

POST /v1/screen

Cuerpo: {"name":"Nombre o razón social","country":"MX","tax_id":"..."} — name obligatorio (mínimo 3 caracteres significativos); country y tax_id son opcionales y afinan las listas nacionales. Con "certificate": true la respuesta incluye la constancia PDF en base64.

Cubre, por corrida: sanciones OFAC (SDN + Consolidated), UE (FSF), Reino Unido (OFSI) y Canadá (SEMA/JVCFOA); listas nacionales de México, Brasil, Colombia, Argentina y República Dominicana; y PEP — políticos nacionales de los países con servicio (MX, BR, CO, AR, DO, CA y US), vivos o de muerte reciente (Wikidata, CC0). No cubre la Lista de Personas Bloqueadas (LPB) de la SHCP, que es una fuente restringida.

Monitoreo continuo de screening

POST /v1/screen/monitoreo (mismo cuerpo que el screening) da de alta la entidad en vigilancia periódica: la primera corrida fija la línea base y a partir de ahí solo te avisa, por webhook MONITOREO_SCREEN, cuando cambia el conjunto de coincidencias. GET /v1/screen/monitoreo lista lo vigilado con su última revisión y DELETE /v1/screen/monitoreo/{watch_id} lo retira.

GET /v1/screen/constancia/{folio}

Descarga la constancia PDF de un screening por su folio, sin llave (el folio es el token). Incluye el ledger de listas, las coincidencias y el sello SHA-256 del resultado, para que un tercero pueda comprobarlo.

Cálculo fiscal y laboral

Cálculos determinísticos con deslinde: cada resultado incluye base_calculo con el fundamento legal, la tabla y versión usadas, su vigencia, la fórmula y el aviso de que es un resultado matemático, no una resolución oficial. Si un parámetro no está vigente para la fecha pedida, la respuesta no calcula y advierte que falta actualizar. Precios: LABORAL $1/$1.50 y NOMINA $0.50/$0.75.

EndpointCuerpoFundamento
POST /v1/fiscal/aguinaldosalario_diario, dias_trabajados, dias_aguinaldoLFT art. 87
POST /v1/fiscal/prima-vacacionalsalario_diario, anios_antiguedad, porcentajeLFT arts. 80 y 76
POST /v1/fiscal/finiquitosalario_diario, fecha_ingreso, fecha_baja, dias_pendientes_salario, incluir_indemnizacionLFT
POST /v1/fiscal/isrbase_gravable, fecha_calculoLISR art. 96
POST /v1/fiscal/imsssbc_diario, dias, fecha_calculo, prima_riesgoLSS (cuotas IMSS + Infonavit; cesantía y vejez del año; tope 25 UMA)
POST /v1/fiscal/sueldo-neto · NOMINAsueldo_mensual, fecha_calculo, sbc_diario?LISR art. 96, subsidio para el empleo, LSS
POST /v1/fiscal/horas-extra · LABORALsalario_diario, horas_extra_semana, jornada, fecha_calculo, salario_minimoLFT 66 y 68 (reforma 2026), LISR 93 fr. I
POST /v1/fiscal/ptu · LABORALmonto_reparto | renta_gravable, total_dias, total_salarios, dias_trabajador, salarios_trabajador, salario_diarioLFT 117 a 127, LISR 93 fr. XIV
POST /v1/fiscal/factura · DATOsubtotal | total, tasa_iva, tipo, receptor, fleteLIVA 1-A, RLIVA 3, LISR 106, 116 y 113-J
POST /v1/fiscal/recargos · DATOmonto, fecha_limite, fecha_pagoCFF 17-A y 21, INPC, LIF de cada año
POST /v1/utilidades/rfc/calcular · UTILnombre, apellido_paterno, apellido_materno, fecha_nacimientoAlgoritmo del SAT (persona física)

Cada uno tiene su calculadora gratuita en verifica.resetparatodos.com/calculadoras, que corre en el navegador con las mismas tablas. Los siete de arriba son sólo para la API con llave: no están en x402 ni en el MCP.

Riesgos de Trabajo solo se calcula si pasas tu prima. La verificación de Factura incluye además un bloque validacion_aritmetica sin costo adicional: comprueba que el subtotal sea la suma de los conceptos, que el total cuadre y que cada impuesto sea base × tasa.

El texto exacto de la ley, en vez de alucinarlo. Corpus de 198 ordenamientos (Constitución, códigos y leyes federales, nacionales y de los 32 estados; unos 180 000 artículos), y cada respuesta trae la fuente oficial, la fecha de última reforma integrada y su deslinde. Es texto de referencia con fecha de corte, no la ley viva ni asesoría jurídica: puede no reflejar reformas posteriores y la vigencia se verifica en el DOF o la gaceta oficial. Precio LEGAL $0.10/$0.15 por consulta.

Validadores, catálogos y tipo de cambio

Validadores (UTIL): puro algoritmo, sin consultar fuentes. Incluidos sin costo mientras tengas saldo de paquete vigente; sueltos $0.10. Una entrada malformada no genera cargo.

Catálogos y datos (DATO, $0.05 por consulta, mínimo que se cobra aun con paquete porque implica mantener el catálogo; cada respuesta lleva fuente y versión):

Pago por llamada, sin cuenta (x402)

Además del prepago con llave, cada producto de verificación se ofrece por pago por llamada con x402: sin registro, sin llave y sin saldo, pensado para agentes que descubren y pagan el servicio en el momento. Pides el endpoint sin pago y recibes un 402 con los requisitos (monto exacto en USDC, red Base eip155:8453, dirección de cobro); tu wallet firma el micropago y reintentas con el header de pago; el facilitador de Coinbase verifica y liquida, y recibes el 200 con el resultado. RESET no custodia fondos.

GET /x402/v1/discovery lista todos los productos con su precio y su endpoint, sin costo. Los productos también quedan indexados en Bazaar.

ProductoEndpoint (POST)USDCEntrada
Screening AML (LatAm + global)/x402/v1/screen$—{"name":"..."}
Verificar empresa (MX, 69-B + más)/x402/v1/company/verify$—{"rfc":"..."}
Verificar empresa UK (Companies House)/x402/v1/uk/company/verify$—{"company":"número o nombre"}
Verificar entidad SEC/EDGAR (US)/x402/v1/us/sec/verify$—{"query":"ticker o CIK"}
Verificar LEI (GLEIF, global)/x402/v1/lei/verify$—{"lei":"..."}
Validar FEL XML (GT)/x402/v1/guatemala/fel/validate$—{"xml":"..."}
Parsear FEL a JSON (GT)/x402/v1/guatemala/fel/parse$—{"xml":"..."}
Validar RFC (MX)/x402/v1/rfc/validate$—{"rfc":"..."}
Validar CLABE (MX)/x402/v1/clabe/validate$—{"clabe":"..."}
Validar CNPJ (BR)/x402/v1/brazil/cnpj/validate$—{"cnpj":"..."}

Los precios x402 se calculan solos: el precio base es el de la lista en MXN, IVA incluido, convertido al tipo de cambio FIX del día más un 10% que cubre el movimiento del peso entre que cotizas y liquidas. Es el mismo precio para todos: pagar en USDC no cambia la tarifa. Hay un mínimo de 0.03 USDC por llamada —lo que la red y el receptor permiten cobrar—, así que los productos más baratos se quedan en ese piso. Cada endpoint acepta GET (con querystring) o POST (con JSON).

Códigos de resultado

result_codeSignificado
COMPANY_OKVerificación de empresa completada; el estado de cada fuente viene en su bloque.
CFDI_OKCFDI procesado; validaciones y estado SAT en el cuerpo.
CFDI_CON_OBSERVACIONESCFDI procesado pero alguna validación de formato falló (detalle en validaciones_formato).
SPEI_OKCEP procesado y conciliación ejecutada. El desenlace de la conciliación va en conciliacion.result_code.
SCREEN_OKScreening ejecutado. El desenlace va en resultado: SIN_MATCH, MATCH_EXACT o MATCH_PARTIAL.
COMBO_OKTransacción completa ejecutada. Trae resumen con el result_code de las tres partes (empresa, factura, pago).
SPEI_DUPLICADOEse CEP ya había sido procesado por tu organización.
INPUT_INVALIDLa entrada no es procesable (RFC malformado, XML inválido, sin monto). No genera cargo.
SOURCE_UNAVAILABLEUna fuente oficial no pudo consultarse; el dato se reporta como no disponible, nunca se inventa.

Desenlaces de una conciliación de pago

Viajan dentro de conciliacion.result_code de una respuesta SPEI_OK.

ValorSignificado
MATCH_EXACTEl CEP casó con una obligación por monto y referencia.
MATCH_PARTIALCasó, pero el monto pagado es menor al esperado.
MATCH_OVERPAYMENTCasó, pero el monto pagado excede al esperado.
MATCH_ONE_TO_MANYUn solo pago cubre varias obligaciones.
MATCH_DUPLICATEEse CEP ya se había procesado antes en tu organización.
SIN_MATCHNo hay obligación registrada que corresponda al pago.

Estados de fuente dentro de un resultado

EstadoSignificado
COINCIDENCIAEl identificador aparece en la fuente; se entrega el detalle oficial.
SIN_COINCIDENCIA_EN_LA_VERSION_CONSULTADANo aparece en la versión consultada. No es un juicio de confiabilidad.
SOURCE_NOT_LOADEDLa fuente aún no está cargada en la copia local.
SOURCE_UNAVAILABLELa fuente no respondió al momento de la consulta.

Errores HTTP

CódigoCuándo
400El cuerpo dice ser JSON pero no lo es.
401Falta X-Api-Key o la llave es inválida/inactiva.
402Sin saldo. No hay crédito de paquete ni usos del producto. Recarga en tu panel y reintenta; la consulta no se ejecutó y no se cobró.
403La llave es válida pero no tiene permiso para esa operación.
404Recurso inexistente (o verificación de otra organización).
409Conflicto (p. ej. referencia de obligación duplicada).
413El archivo enviado excede el tamaño permitido.
415Falta Content-Type: application/json donde se espera JSON.
422Entrada inválida (cuerpo vacío, JSON incompleto, RFC malformado). No genera cargo.

Estos son cuerpos reales del sandbox, no ejemplos redactados a mano: si mandas la misma entrada con tu llave rv_test_ recibes exactamente esto. Las entradas de prueba están en la tabla de Sandbox. Úsalos para escribir tus pruebas: lo que cambia entre un caso limpio y uno con hallazgo no es el código HTTP —siempre es 200— sino el estado de cada bloque de fuente.

Empresa sin hallazgos

GET /v1/empresa/AAA010101AAA → 200. Recortado a los campos que decides: cada fuente responde por separado y ninguna coincide.

{
  "verification_id": "RV-20260825-SBX0FC9AF",
  "service": "COMPANY",
  "sandbox": true,
  "rfc": "AAA010101AAA",
  "tipo_persona": "moral",
  "sat_69b":               { "estado": "SIN_COINCIDENCIA_EN_LA_VERSION_CONSULTADA",
                             "situaciones": [], "historial_eventos": [] },
  "sat_art69":             { "estado": "SIN_COINCIDENCIA_EN_LA_VERSION_CONSULTADA",
                             "listas": [] },
  "proveedores_sancionados": { "estado": "SIN_COINCIDENCIA" },
  "contratacion_publica":  { "estado": "SIN_COINCIDENCIA_EN_LA_VERSION_CONSULTADA",
                             "contratos": 0 },
  "result_code": "COMPANY_OK",
  "consultado": "2026-08-25T23:16:49.937443+00:00",
  "engine_version": "1.0.0"
}

Ojo con el nombre del estado. Decimos SIN_COINCIDENCIA_EN_LA_VERSION_CONSULTADA y no “limpio” a propósito: significa que ese RFC no aparece en la versión de la lista que se consultó, con la fecha que viene en fuente. No es un certificado de buena conducta ni un juicio sobre la empresa.

Empresa con hallazgo en el 69-B

GET /v1/empresa/EFO010101AA1 → 200. Mismo result_code; lo que cambia es el bloque de la fuente que coincidió.

{
  "verification_id": "RV-20260825-SBX18362B",
  "service": "COMPANY",
  "rfc": "EFO010101AA1",
  "sat_69b": {
    "estado": "COINCIDENCIA",
    "situaciones": [
      { "situacion": "Definitivo",
        "nombre": "EMPRESA FICTICIA OPERACIONES SA DE CV",
        "detalle": { "RFC": "EFO010101AA1",
                     "Situación del contribuyente": "Definitivo",
                     "Publicación página SAT": "2025-01-15" },
        "actualizado": "2026-08-25T23:16:49.937616+00:00" }
    ],
    "historial_eventos": [
      { "evento": "ADDED", "situacion": "Definitivo",
        "fecha": "2025-01-15T00:00:00+00:00" }
    ]
  },
  "result_code": "COMPANY_OK"
}

Las cuatro situaciones posibles del 69-B son Presunto, Definitivo, Desvirtuado y Sentencia Favorable, y no significan lo mismo: las dos últimas son a favor del contribuyente. Trátalas distinto en tu lógica — bloquear a un “Desvirtuado” es un error de negocio, no del servicio.

Estado de un CFDI ante el SAT

Dentro de una respuesta CFDI_OK, en el bloque estado_sat. En sandbox lo decide el prefijo del UUID.

UUID de pruebaEstadoCodigoEstatusQué significa
11111111-…VigenteS — Comprobante obtenido satisfactoriamenteLa factura existe y no está cancelada.
22222222-…CanceladoS — Comprobante obtenido satisfactoriamenteExiste pero fue cancelada. El SAT respondió bien: el “error” es del comprobante, no de la consulta.
cualquier otroNo EncontradoN — 602: Comprobante no encontradoEl SAT no lo reconoce. Suele ser un UUID mal capturado o un CFDI nunca timbrado.

Entrada inválida

Cuando lo que mandas no es procesable, la respuesta lo dice y no se cobra.

{
  "result_code": "INPUT_INVALID",
  "detalle": "RFC invalido: 'NOESRFC'",
  "sandbox": true
}

Sin saldo

Único caso en que la consulta ni siquiera se ejecuta. Llega como HTTP 402 antes de tocar cualquier fuente.

HTTP/1.1 402 Payment Required

{ "detail": { "error": "Sin usos ni saldo suficiente",
              "servicio": "COMPANY",
              "saldo": "2.00",
              "precio": "9.00",
              "opciones": ["Compra saldo: …"] } }

Recarga en tu panel y reintenta la misma llamada: no se ejecutó ni se cobró nada.

Cómo leerlo en tu código

La regla corta, para no escribir if de más:

Úsalo desde una IA (MCP)

Además de la API REST, RESET Verifica habla Model Context Protocol: un agente de IA —Claude, un asistente propio, un flujo automatizado— puede verificar un RFC, validar un CFDI o correr un screening sin que le escribas el cliente HTTP.

Servidorhttps://mcp.resetparatodos.com/mcp
Transportestreamable-http
AutenticaciónHeader X-Api-Key con tu llave. Con rv_test_ el agente trabaja en sandbox y no gasta saldo.

Conectarlo a Claude Code

claude mcp add --transport http reset-verifica \
  https://mcp.resetparatodos.com/mcp \
  --header "X-Api-Key: rv_test_tu_llave"

Conectarlo a Claude Desktop u otro cliente MCP

En el archivo de configuración del cliente:

{
  "mcpServers": {
    "reset-verifica": {
      "type": "http",
      "url": "https://mcp.resetparatodos.com/mcp",
      "headers": { "X-Api-Key": "rv_test_tu_llave" }
    }
  }
}

Qué puede hacer el agente

Al conectar, el cliente descubre solo las 27 herramientas disponibles. Las principales:

HerramientaPara quéCosto
verificar_empresaRFC contra 69-B, artículo 69, contratación pública y sancionados.COMPANY
verificar_facturaXSD del Anexo 20 y estado del CFDI ante el SAT.CFDI
verificar_pagoProcesa un CEP y lo concilia contra tus obligaciones (registrar_obligacion las da de alta).SPEI
screening_listasNombre o ID fiscal contra sanciones, PEP y listas nacionales. screening_monitorear deja el nombre vigilado.SCREEN
verificacion_completaEmpresa + factura + pago en una sola llamada.COMBO
validar_clabe, validar_rfc, validar_curp, validar_nss, validar_tarjetaValidación estructural instantánea, sin consultar fuentes.UTIL
consultar_catalogo, tipo_cambioBancos SPEI, catálogos SAT, LADA; FIX de Banxico.DATO
calcular_laboral, calcular_isr, calcular_imssFiniquito y liquidación (LFT), ISR de nómina, cuotas IMSS/Infonavit.LABORAL / NOMINA
catalogo_leyes, consultar_ley, buscar_leyTexto exacto de legislación mexicana federal y de los 32 estados.LEGAL
consultar_precios, consultar_saldo, consultar_uso, estado_servicio, catalogo_serviciosTarifas, saldo, consumo y estado de las fuentes.gratis
emitir_constancia, validar_constanciaEmitir o validar constancias. Comprar saldo no es una herramienta: se hace desde el panel.gratis / UTIL

El agente no decide, reporta. Las herramientas devuelven hechos verificables con su fuente y su fecha. Si tu asistente va a recomendar bloquear a un proveedor, que cite el verification_id: es lo que después sostiene la decisión ante una auditoría.

Integra en tu lenguaje

La API es REST sobre HTTPS con JSON: sirve cualquier cliente HTTP, sin SDK. El patrón es siempre el mismo —el header X-Api-Key y leer result_code—. Empieza con tu llave rv_test_: mismo código, sin costo.

cURL

curl -s https://api.resetparatodos.com/v1/empresa/EFO010101AA1 \
  -H "X-Api-Key: rv_test_tu_llave"

Python

import os, requests

API = "https://api.resetparatodos.com"
SES = requests.Session()
SES.headers["X-Api-Key"] = os.environ["RESET_API_KEY"]

def verificar_empresa(rfc):
    r = SES.get(f"{API}/v1/empresa/{rfc}", timeout=30)
    if r.status_code == 402:
        raise RuntimeError("sin saldo: recarga en tu panel")
    r.raise_for_status()
    return r.json()

d = verificar_empresa("EFO010101AA1")
hallazgos = [f for f in ("sat_69b", "sat_art69", "proveedores_sancionados")
             if d.get(f, {}).get("estado") == "COINCIDENCIA"]
print(d["verification_id"], "hallazgos:", hallazgos or "ninguno")

JavaScript / Node

const API = "https://api.resetparatodos.com";

async function verificarEmpresa(rfc) {
  const r = await fetch(`${API}/v1/empresa/${rfc}`, {
    headers: { "X-Api-Key": process.env.RESET_API_KEY },
  });
  if (r.status === 402) throw new Error("sin saldo: recarga en tu panel");
  if (!r.ok) throw new Error(`RESET ${r.status}: ${await r.text()}`);
  return r.json();
}

const d = await verificarEmpresa("EFO010101AA1");
const hallazgos = ["sat_69b", "sat_art69", "proveedores_sancionados"]
  .filter((f) => d[f]?.estado === "COINCIDENCIA");
console.log(d.verification_id, hallazgos.length ? hallazgos : "sin hallazgos");

PHP

El caso más común en despachos contables y ERPs mexicanos.

<?php
function verificar_empresa(string $rfc): array {
    $ch = curl_init("https://api.resetparatodos.com/v1/empresa/" . rawurlencode($rfc));
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_HTTPHEADER     => ['X-Api-Key: ' . getenv('RESET_API_KEY')],
    ]);
    $cuerpo = curl_exec($ch);
    $codigo = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    curl_close($ch);

    if ($codigo === 402) throw new RuntimeException('Sin saldo: recarga en tu panel.');
    if ($codigo !== 200) throw new RuntimeException("RESET $codigo: $cuerpo");
    return json_decode($cuerpo, true);
}

$d = verificar_empresa('EFO010101AA1');
foreach (['sat_69b', 'sat_art69', 'proveedores_sancionados'] as $fuente) {
    if (($d[$fuente]['estado'] ?? '') === 'COINCIDENCIA') {
        echo "Hallazgo en $fuente — folio {$d['verification_id']}\n";
    }
}

C# / .NET

using System.Net;
using System.Net.Http.Json;
using System.Text.Json;

var http = new HttpClient { BaseAddress = new Uri("https://api.resetparatodos.com") };
http.DefaultRequestHeaders.Add("X-Api-Key",
    Environment.GetEnvironmentVariable("RESET_API_KEY"));

var rfc  = "EFO010101AA1";
var resp = await http.GetAsync($"/v1/empresa/{rfc}");
if (resp.StatusCode == HttpStatusCode.PaymentRequired)
    throw new InvalidOperationException("Sin saldo: recarga en tu panel.");
resp.EnsureSuccessStatusCode();

var d     = await resp.Content.ReadFromJsonAsync<JsonElement>();
var folio = d.GetProperty("verification_id").GetString();

foreach (var fuente in new[] { "sat_69b", "sat_art69", "proveedores_sancionados" })
    if (d.TryGetProperty(fuente, out var b) &&
        b.GetProperty("estado").GetString() == "COINCIDENCIA")
        Console.WriteLine($"Hallazgo en {fuente} — folio {folio}");

Antes de pasar a producción

Especificación OpenAPI

La API publica su especificación en https://api.resetparatodos.com/openapi.json, generada del código (copia estática en esta misma carpeta).

Precios y wallet (prepago)

Modelo 100% prepago. Todos los precios ya incluyen IVA y están en MXN; los créditos tienen vigencia de 365 días. La fuente única de precios es la API: GET /v1/precios (esta tabla es una copia de referencia; ante cualquier duda, manda la API).

ServicioEn paqueteIndividual
Empresa (COMPANY)$12$14
Screen — sanciones/listas (SCREEN)$12$14
Factura / CFDI (CFDI)$2$3
Pago / SPEI (SPEI)$3$4
Transacción completa (COMBO: las 3 en una llamada)$18$22
Cálculo laboral (LABORAL)$1$1.50
Cálculo de nómina (NOMINA)$0.50$0.75
Legislación mexicana (LEGAL)$0.10$0.15
Catálogos y datos (DATO)$0.05$0.05
Validadores (UTIL)incluido con paquete$0.10

Fondeo por SPEI: POST /v1/wallet/fondeos (mínimo $500 de crédito) → transfieres el monto indicado → subes el CEP XML a /v1/wallet/fondeos/{referencia}/cep y el saldo se acredita. Solo se cobra la verificación completada: INPUT_INVALID, SOURCE_UNAVAILABLE y los CEP duplicados no generan cargo. Sin saldo, la API responde 402. El sandbox nunca cobra. Postpago: más adelante, mediante contrato.