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 30 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

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/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 con webhooks

Da de alta los RFC de tus proveedores (POST /v1/monitoreo/rfcs, hasta 500) y registra tu endpoint (POST /v1/webhooks): recibirás un POST firmado con HMAC-SHA256 (header X-Reset-Firma) cuando alguno entre, cambie o salga de los listados 69-B. 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)

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$0.61{"name":"..."}
Verificar empresa (MX, 69-B + más)/x402/v1/company/verify$0.61{"rfc":"..."}
Verificar empresa UK (Companies House)/x402/v1/uk/company/verify$0.03{"company":"número o nombre"}
Verificar entidad SEC/EDGAR (US)/x402/v1/us/sec/verify$0.03{"query":"ticker o CIK"}
Verificar LEI (GLEIF, global)/x402/v1/lei/verify$0.03{"lei":"..."}
Validar FEL XML (GT)/x402/v1/guatemala/fel/validate$0.03{"xml":"..."}
Parsear FEL a JSON (GT)/x402/v1/guatemala/fel/parse$0.03{"xml":"..."}
Validar RFC (MX)/x402/v1/rfc/validate$0.03{"rfc":"..."}
Validar CLABE (MX)/x402/v1/clabe/validate$0.03{"clabe":"..."}
Validar CNPJ (BR)/x402/v1/brazil/cnpj/validate$0.02{"cnpj":"..."}

Los precios x402 están en USD y los productos mexicanos también viven en el modelo prepago en MXN: es el mismo importe expresado en dos monedas al tipo de cambio FIX del día, no una tarifa distinta. 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/AAA010101AAA200. 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/EFO010101AA1200. 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": "0.00",
              "precio_individual": "14" } }

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 30 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
crear_fondeo, acreditar_fondeo, emitir_constancia, validar_constanciaComprar saldo por SPEI, acreditarlo con el CEP y emitir o validar constancias.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.