Quickstart
-
1
Crea tu cuenta en dashboard.multasmx.com/register
-
2
Copia tu API key desde el dashboard principal.
-
3
Llama a los endpoints con el header
x-api-key. -
4
Prueba gratis con la placa
PRUEBA-ADEUDOSantes de comprar créditos.
Base URL
La especificación completa está en openapi.json
(OpenAPI 3.1, con un operationId por endpoint y los webhooks), y el resumen para agentes en
llms.txt. Esta página también se puede
pedir en Markdown: docs.md, o con el header
Accept: text/markdown.
Autenticación
Todas las rutas requieren el header x-api-key con tu API key del dashboard.
Pruebas sin costo
Para integrar sin gastar créditos, usa una placa de prueba con tu API key de siempre.
La consulta es gratis y devuelve datos ficticios con la misma forma que una consulta real:
el 201 con su requestId, los webhooks firmados y
GET /lookup/:requestId. Sirve con cualquier estado o servicio de GET /states.
| plate · niv (REPUVE) | Qué devuelve |
|---|---|
|
PRUEBA-ADEUDOS
PRUEBA0000000002
|
Con hallazgos
Multas y adeudos por pagar. En REPUVE, un reporte de robo.
|
|
PRUEBA-LIMPIA
PRUEBA0000000001
|
Todo en orden
Sin multas, adeudos ni reportes de robo.
|
|
PRUEBA-NOREG
PRUEBA0000000003
|
No registrada
El servicio no tiene la placa en su padrón.
|
|
PRUEBA-FALLA
PRUEBA0000000004
|
Sin respuesta
El servicio no contestó. Así llega un resultado pendiente.
|
sandbox: trueen la respuesta dePOST /lookup, enGET /lookup/:requestIdy en la raíz de cada webhook. Las consultas reales no lo traencreditsCharged: 0: no cambia tu saldo, y funciona aunque tu saldo esté en 0- Los webhooks
state_completedycompletedllegan a tus URLs con la misma firmaX-Multas-Signatureque los reales: sirven para probar tu endpoint - El resultado se puede consultar con
GET /lookup/:requestIddurante 7 días. No aparece en el historial del dashboard - Un estado que en ese momento no está dando servicio se salta en
skipped[], igual que en una consulta real - Hasta 200 consultas de prueba por día por cuenta (
429 sandbox_limit_exceeded). Cuentan para tu límite por minuto - Toda placa que empiece con
PRUEBAes de prueba: si no está en la tabla, la respuesta es400 unknown_test_plate, y combinar una de prueba con una real da400 test_identifier_mismatch
| Servicio | PRUEBA-LIMPIA Todo en orden |
PRUEBA-ADEUDOS Con hallazgos |
PRUEBA-NOREG No registrada |
|---|---|---|---|
| Multas | Sin infracciones | Multas o adeudos pendientes | Sin infracciones. En sinaloa, extra.plateRegistryStatus; en cdmx, extra.circulationCardStatus "Placa no localizada" |
| Tenencia (EdoMex) | Sin adeudos | Con adeudo | found: false |
| Tenencia (Chihuahua, Guanajuato, Aguascalientes) | Placa no registrada | Adeudo en debts[] | Placa no registrada |
| Vigencia de placa | VIGENTE | VENCIDA | found: false |
| Verificación (EdoMex) | Verificó en el semestre | found: false | found: false |
| Verificación (Jalisco) | Aprobada y vigente | Aprobada, ya vencida | found: false |
| REPUVE | Sin reportes | Con reporte de robo | No inscrito |
Con PRUEBA-FALLA, cada estado termina en QUEUED_RETRY con
errorCode: "scrape_failed" y la consulta en PARTIAL. En pruebas no se reintenta.
Construye sobre los campos base.
En varios estados de multas, cada infracción de prueba trae sólo folio,
date, amount, unit y status.
Una respuesta real puede traer además descripción, artículo o datos del vehículo cuando el portal del estado los publica:
trátalos como opcionales (ver Resultado de multas).
Si reenvías placas que escriben tus usuarios, una que empiece con
PRUEBA devuelve datos de prueba: revisa el campo sandbox antes de mostrarlos.
Créditos y costos
Cada consulta descuenta créditos según su tipo. Un POST /lookup puede
combinar varios estados y servicios: el cargo es la suma de sus costos, y se aplica
antes de ejecutar la consulta. Las consultas con
placas de prueba no cuestan.
| Consulta | stateCode | Créditos |
|---|---|---|
| Multa estatal | edomex, cdmx, guadalajara, … | 1 |
| Tenencia | tenencia-edomex, tenencia-chihuahua, tenencia-guanajuato, tenencia-aguascalientes | 1 |
| Vigencia de placa | vigencia-edomex | 1 |
| Verificación vehicular | verificacion-edomex, verificacion-jalisco | 1 |
| REPUVE (reporte de robo) | repuve | 3 |
El costo vigente siempre se puede consultar en vivo: GET /billing/pricing
lo devuelve en creditCosts, y GET /states incluye
el campo creditCost en cada estado.
Caducidad
Los créditos vencen 12 meses después de la compra. El consumo es FIFO por caducidad: se gastan primero los que están más próximos a vencer, de modo que ningún lote se pierda mientras haya uso.
nextExpiry es el lote que vence antes, que es el próximo en consumirse.
Es null si no tienes saldo. Cada respuesta de
POST /lookup incluye también el saldo restante en
balance.
Saldo insuficiente
Si el saldo no cubre el costo del request, se rechaza completo con
402 y no se ejecuta ninguna consulta. La respuesta dice cuántos
créditos faltaban:
POST /lookup
Solicita la consulta de una placa en uno o más estados. La respuesta es inmediata con un
requestId. El resultado completo llega vía webhook.
plate— alfanumérico, 1–16 caracteresstates— array destateCodes únicos, al menos uno, de los que listaGET /states
creditsBreakdown.
Estados en DOWN / MAINTENANCE aparecen en skipped[] y no se cobran.
GET /lookup/:requestId
Consulta el estado actual de un request. Útil para poll si no usas webhooks.
status puede ser PROCESSING, COMPLETED, PARTIAL o QUEUED_RETRY.
GET /states
Lista de los estados y servicios disponibles ahora: los que en este momento no están dando servicio no aparecen.
stateCode— el código que va enstates[]dePOST /lookupstateName— nombre legible del estado o serviciotype— tipo de consulta:tenencia,vigencia,verificacionorepuve; en los estados de multas varía según el estado (p. ej.infracciones)creditCost— créditos que cuesta consultarlo (ver Créditos y costos)
count es el número de entradas de states. La respuesta puede traer campos adicionales que no forman
parte del contrato: no dependas de ellos, pueden cambiar o desaparecer sin aviso.
Resultado de multas
Cada estado de multas entrega en data.infractions[] una entrada por infracción, pendiente o pagada.
Los campos opcionales sólo aparecen cuando el portal del estado publica ese dato.
folio·date(ISO 8601) ·amount+unit— importe y su unidad ("MXN"por defecto; CDMX usa"UC")status—"pending"o"paid". Las pagadas también se entregan: es el historial completodescription— el porqué de la infracción: texto del reglamento, tal como lo publica el portalarticle— artículo y fracción. Si la infracción cita varios, vienen unidos con"; "articles[]— los mismos artículos por separado, cada uno con sudescription(cuando hay más de uno)type— clasificación del portal (programa y conducta) ·regulation— ámbito del reglamento ·paymentDate— fecha de pago, si está pagada
edomex, description, article y articles[] se entregan para las tres infracciones más recientes de la placa;
las anteriores llevan folio, fecha, importe y type. Un campo ausente significa que el dato no está disponible, nunca que esté vacío.
Datos extra de CDMX y Sinaloa
Las consultas de multas de cdmx y sinaloa entregan, además,
datos del vehículo que publica el portal del estado. Van en data.extra, sin costo
adicional, y cada clave aparece sólo cuando el portal publica ese dato.
fotocivicaPoints— puntos de fotocívicas de la placa, de 0 a 10circulationCardStatus— estatus de la tarjeta de circulación:"Vigente","Vencida"o"Placa no localizada"(el portal de CDMX no localizó la placa; es lo habitual con placas de otros estados)circulationCardValidUntil— fecha ISO del fin de vigencia de la tarjeta de circulación (ya pasada si está"Vencida"). No viene con"Placa no localizada"
plateRegistryStatus—"deregistered"si la placa está dada de baja;"not_registered"si no está en el padrón vehicular del estado. Son casos distintos: estar fuera del padrón no significa estar dado de bajaplateRegistryMessage— el aviso del portal, tal cual
sinaloa es exitoso y sin adeudos: revisa
plateRegistryStatus antes de leer "sin adeudos" como "al corriente".
data.extra puede traer otras claves. Sólo las documentadas aquí forman parte del contrato;
las demás pueden cambiar o dejar de enviarse.
Vigencia de placa (Estado de México)
Además de multas, puedes verificar la vigencia de una placa de EdoMex usando el
pseudo-estado vigencia-edomex en el mismo POST /lookup.
Cuesta 1 crédito y es combinable con estados de multas en el mismo request.
found—falsesi la placa no está registrada en el padrón (respuesta definitiva del portal, no un error)plateStatus—VIGENTE·VENCIDA·INACTIVA·EN_PROCESOvalidityStart/validityEnd— fechas ISO de inicio y fin de vigencia (la placa dura 5 años)previousPlate— placa anterior si hubo reemplacamiento
hasInfractions y totalDebt vienen en null: no es una consulta de multas.
Verificación vehicular (Estado de México)
Consulta si un vehículo ya cumplió con la verificación del semestre usando el
pseudo-estado verificacion-edomex en el mismo POST /lookup.
Cuesta 1 crédito y es combinable con estados de multas en el mismo request.
Devuelve el holograma obtenido, la fecha, el folio del certificado y el verificentro.
found—falsesi no hay verificaciones registradas para la placa (respuesta definitiva del portal, no un error). En ese casoverificationviene ennullverifiedThisSemester—truesi la verificación del semestre en curso ya está hechaverification.certificate— holograma obtenido, tal como lo publica el portal ("Cero","Doble Cero", …)verification.date— fecha ISO de la verificación ·folio— folio del certificado ·center— verificentro ·reason— motivo ·vin— número de serie
hasInfractions y totalDebt vienen en null: no es una consulta de multas.
Suele tardar más que el resto de consultas de EdoMex: el resultado llega por webhook cuando termina.
Verificación vehicular (Jalisco)
Consulta la verificación vehicular registrada para una placa en Jalisco usando el
pseudo-estado verificacion-jalisco en el mismo POST /lookup.
Cuesta 1 crédito y es combinable con estados de multas en el mismo request.
Devuelve el resultado, la fecha, hasta qué mes es válida y los datos básicos del vehículo.
found—falsesi no hay verificación registrada para la placa (respuesta definitiva del portal, no un error). En ese casocurrent,verificationyvehiclevienen ennullymessagedice"Sin verificación registrada"current—truesi la verificación está aprobada y suvalidUntilno ha pasado;falsesi no fue aprobada o ya venció. Para evaluarla con tu propia fecha de corte, usaverification.validUntilverification.result—"APROBADO"o"NO APROBADO", tal como lo publica el portalverification.date— fecha ISO de la verificación ·validUntil— mes hasta el que es válida,"AAAA-MM"(el portal no publica el día) ·type— tipo de verificación, tal como lo publica el portal ·center— clave del verificentro. Cualquiera puede venir ennullsi el dato no está disponiblevehicle— marca, modelo, año y combustible
found:false no significa que el vehículo no haya verificado.
La verificación no es obligatoria en todos los municipios de Jalisco, hay vehículos exentos, y un vehículo
que cambió de placa puede tener su verificación registrada con la placa anterior.
verificacion-edomex, no incluye holograma, folio del certificado ni número de serie.
En este servicio hasInfractions y totalDebt vienen en null: no es una consulta de multas.
Adeudo de tenencia (Estado de México)
Consulta si una placa de EdoMex tiene adeudos de tenencia usando el
pseudo-estado tenencia-edomex en el mismo POST /lookup.
Cuesta 1 crédito y es combinable con estados de multas en el mismo request.
Además del adeudo, devuelve datos del vehículo (NIV, clave vehicular, factura) y la vigencia de la placa.
tenencia-cdmx: la tenencia de CDMX viene incluida en la consulta de multas
cdmx, en data.debts[] junto a las infracciones, sin costo adicional.
found—falsesi la placa no existe en el padrón vehicular o está dada de baja (respuesta definitiva del portal, no un error)plateStatus—"registered","not_registered"o"deregistered"(dada de baja); confound:false,messagetrae el aviso del portalhasDebt—truesi la placa tiene adeudos de tenencia pendientesdebtDescription— texto del portal tal cual (p.ej."SIN ADEUDOS")totalDebt— monto total del adeudo en MXN (dentro dedata)vehicle— modelo, descripción, NIV, clave vehicular, cilindros, fecha e importe de facturaplateValidityStart/plateValidityEnd— vigencia de la placa (fechas ISO)
hasInfractions y totalDebt del resultado (nivel superior) vienen en null: no es una consulta de multas.
Tenencia en Chihuahua, Guanajuato y Aguascalientes
Tres pseudo-estados consultan el adeudo vehicular estatal de cada entidad en el mismo
POST /lookup. Cada uno cuesta 1 crédito y es combinable con estados de multas en el mismo request.
| stateCode | Qué consulta |
|---|---|
| tenencia-chihuahua | Tenencia y revalidación vehicular del Gobierno del Estado. |
| tenencia-guanajuato | Tenencia y refrendo vehicular del Gobierno del Estado. |
| tenencia-aguascalientes | Derechos de control vehicular del Gobierno del Estado. Es estatal: las multas de aguascalientes son las del municipio. |
A diferencia de tenencia-edomex, el resultado tiene la misma forma que una consulta de multas:
si el portal publica un adeudo, llega en data.debts[] con sus totales, e
infractions[] viene vacío. El nivel de detalle depende de lo que publique cada portal.
hasDebts/debts[]— el adeudo que publica el portal. Cada entrada traeconcept,amount+unit,totalystatus("pending"o"paid"), másyearysurchargescuando el portal los datotalDebt/totalPendingDebt— suma de los adeudos y de los pendientes, dentro dedataextra.plateRegistryStatus—"not_registered": el portal no dio información de la placa;extra.plateRegistryMessagetrae su aviso tal cual. En ese casodebts[]viene vacío, y no significa "sin adeudo"extra.paymentStatus— sólotenencia-aguascalientes:"al_corriente"si el portal indica que la placa está al corriente de pagos, con su aviso enextra.paymentMessageextra.plateReplacementRequired— sólotenencia-guanajuato:truesi el portal indica que la placa debe canjearse
hasInfractions y totalDebt del resultado (nivel superior) vienen en null: no son consultas de multas. El adeudo se lee dentro de data.
REPUVE — reporte de robo (nacional)
Consulta el Registro Público Vehicular con el pseudo-estado
repuve en el mismo POST /lookup.
Cuesta 3 créditos —es la consulta más costosa de servir— y es combinable
con estados de multas en el mismo request. Devuelve si el vehículo tiene
reporte de robo (FGJ, OCRA y Robo USA/CAN) más sus datos de registro.
Es el único servicio que acepta placa o NIV: manda el campo
niv —con o sin plate— y podrás consultar
vehículos que todavía no tienen placa. La cobertura es nacional, no estatal.
registered—falsesi el vehículo no está inscrito en el registro (respuesta definitiva del portal, no un error)hasTheftReport— atajo:truesi alguna de las tres fuentes reporta robo,falsesi FGJ y OCRA respondieron sin reporte, ynullsi ninguna reporta robo pero FGJ u OCRA no respondieron (no se puede confirmar)complete—falsesi alguna sección no respondió;missingSectionsdice cuáles ynextRetryAtcuándo se vuelven a consultarvehicle— marca, modelo, año, clase, tipo, NIV, placa, entidad de emplacamiento, armadora y másfgj— Fiscalía General de Justicia, con el detalle de cada reporte enrecords[](estatus, entidad, fecha de robo y de recuperación)ocra— Oficina Coordinadora de Riesgos AseguradosroboUsaCan— robo reportado en Estados Unidos o CanadáavisosMinisteriales— avisos por delitos distintos del robo
status: con_reporte,
sin_reporte, requiere_niv (esa fuente necesita el NIV
para responder), pendiente (esa fuente no respondió y la volvemos a consultar:
el valor va a cambiar) o desconocido (no respondió en ninguno de los reintentos).
Trata pendiente y desconocido como
dato ausente, no como vehículo limpio; el message de la sección lo explica.
pendiente (complete: false),
lo volvemos a consultar en las siguientes horas sin costo y la consulta queda como PARTIAL.
Cuando se completa recibes otra vez el webhook completed, con el mismo
requestId, el resultado actualizado y la consulta en COMPLETED.
Si al final una sección no responde, pasa a desconocido, también te avisamos por webhook
y, si las que faltan son FGJ u OCRA, se te devuelven los créditos de esa consulta.
hasInfractions y totalDebt
del resultado (nivel superior) vienen en null.
Webhook
Cuando un request completa, la API hace un POST a cada URL de webhookUrls configurada en el dashboard
(hasta 3 endpoints: producción, staging, un colector interno…). Todos reciben el mismo payload,
firmado con HMAC-SHA256 usando tu webhookSecret.
Verificar la firma (Node.js)
Si tu endpoint responde con error, reintentamos 3 veces con backoff (0s, 2s, 6s). Después de eso
webhookSent = false y puedes recuperar los datos con GET /lookup/:id.
Rate limits
Default 60 req/min por API key, en una ventana fija de 60 s que empieza con la primera petición. Si necesitas más, escríbenos a contacto@multasmx.com.
Cada respuesta autenticada dice cuánto te queda, con las cabeceras de
draft-ietf-httpapi-ratelimit-headers.
Léelas para espaciar tus peticiones en vez de esperar al 429.
RateLimit-Policy— tu cuota:qpeticiones por ventana dewsegundosRateLimit— cómo vas: te quedanrpeticiones y la ventana se reinicia entsegundosRetry-After— sólo en el429: segundos que debes esperar antes de reintentar. Es el mismo valor queretryAfterSecondsdel cuerpo
GET /billing/pricing no lleva API key y no cuenta para el límite.
Códigos de error
| Status | Código | Descripción |
|---|---|---|
| 400 | invalid_body / unknown_states | Payload inválido o estado no reconocido. |
| 400 | unknown_test_plate · test_identifier_mismatch | Placa o NIV de prueba que no existe, o combinado con uno real (ver Pruebas sin costo). |
| 401 | Missing / Invalid API key | Header x-api-key ausente o incorrecto. |
| 402 | insufficient_credits · trial_expired | Saldo insuficiente (incluye required, available, missing y el desglose por estado). trial_expired sólo aparece en cuentas con el periodo de prueba anterior. |
| 404 | request_not_found | El requestId no existe o no pertenece a tu cuenta. |
| 429 | rate_limit_exceeded | Superaste el límite de requests por minuto. |
| 429 | sandbox_limit_exceeded | Superaste el límite diario de consultas de prueba. |
| 502 | scrape_failed | Error interno al comunicarse con el portal del estado. |
| 503 | sandbox_disabled | Las consultas de prueba no están disponibles en este momento. |
Disponibilidad del servicio
Multas MX es un servicio best-effort. No ofrecemos garantía de disponibilidad ni SLA.
La API depende de portales gubernamentales de terceros que no controlamos. Esos portales
pueden cambiar su estructura, entrar en mantenimiento, bloquear el acceso o dejar de
responder sin previo aviso. Cuando eso ocurre, el estado afectado se marca como
DOWN, MAINTENANCE o
BLOCKED y deja de aparecer en GET /states
hasta que se recupera.
No garantizamos tiempos de respuesta, tasas de éxito, ni la cobertura continua de un
estado en particular. Diseña tu integración asumiendo que cualquier estado puede no
estar disponible en un momento dado: revisa siempre skipped[]
en la respuesta de POST /lookup y el estado de cada resultado
en el webhook.
Los estados que no se pudieron procesar no se cobran.