API Reference

Documentación.

Todo lo que necesitas para consumir la API: endpoints, formato del webhook y códigos de error.

Quickstart

  1. 1

    Crea tu cuenta en dashboard.multasmx.com/register

  2. 2

    Copia tu API key desde el dashboard principal.

  3. 3

    Llama a los endpoints con el header x-api-key .

Base URL

https://api.multasmx.com

Autenticación

Todas las rutas requieren el header x-api-key con tu API key del dashboard.

x-api-key: sk_live_22f5757d-26c9-4f63-...

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.

request.sh
$ curl -X POST https://api.multasmx.com/lookup \ -H "x-api-key: sk_live_..." \ -H "Content-Type: application/json" \ -d '{"plate":"ABC1234","states":["cdmx","edomex"]}'
201 Created
{ "requestId": "05f4c751-...", "status": "PROCESSING", "creditsCharged": 2, "states": [ { "stateCode": "cdmx", "status": "PENDING" }, { "stateCode": "edomex", "status": "PENDING" } ], "skipped": [] }
Body
  • plate — alfanumérico, 1–16 caracteres
  • states — array de 1 a 16 stateCodes únicos
Se cobra 1 crédito por cada estado que efectivamente se procesa. 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.

200 OK
{ "requestId": "05f4c751-...", "plate": "ABC1234", "status": "COMPLETED", "creditsCharged": 2, "webhookSent": true, "results": [ { "state": "edomex", "status": "SUCCESS", "hasInfractions": true, "totalDebt": 905, "fromCache": false, "responseTimeMs": 43120 } ] }

status puede ser PROCESSING, COMPLETED, PARTIAL o QUEUED_RETRY.

GET /states

Lista de estados activos (oculta los que están en DOWN o MAINTENANCE).

{ "states": [ { "stateCode": "cdmx", "stateName": "Ciudad de México", "captchaType": "image_flat", "avgResponseMs": 24300, "isHealthy": true } ], "count": 7 }

Webhook

Cuando un request completa, la API hace un POST a tu webhookUrl configurado en el dashboard. Cada payload se firma con HMAC-SHA256 usando tu webhookSecret.

webhook.http
POST {client.webhookUrl} Content-Type: application/json X-Multas-Signature: c6f2...3e89 X-Multas-Request-Id: 05f4c751-... { "requestId": "05f4c751-...", "plate": "ABC1234", "status": "COMPLETED", "results": [ { "state": "edomex", "totalDebt": 905, "data": { "vehicle": { "brand": "DODGE", "model": "RAM 700" }, "infractions": [ { "folio": "EDX-2024-00012345", "amount": 905 } ] } } ] }

Verificar la firma (Node.js)

verify.ts
import crypto from 'crypto'; const expected = crypto .createHmac('sha256', process.env.WEBHOOK_SECRET) .update(rawBody) .digest('hex'); const ok = crypto.timingSafeEqual( Buffer.from(expected), Buffer.from(signature) );

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. Sliding window de 60s. Si necesitás más, escribinos a [email protected].

429 Too Many Requests
{ "error": "rate_limit_exceeded", "message": "max 60 req/min", "retryAfterSeconds": 23 }

Códigos de error

Status Código Descripción
400 invalid_body / unknown_states Payload inválido o estado no reconocido.
401 Missing / Invalid API key Header x-api-key ausente o incorrecto.
402 insufficient_credits · trial_expired Saldo insuficiente o trial expirado.
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.
502 scrape_failed Error interno al comunicarse con el portal del estado.
Primeros 10 créditos gratis

Empieza a consultar
multas hoy.

Registra tu cuenta en segundos y haz tu primera consulta. Sin contratos, sin tarjeta de crédito.

Sin tarjeta · 10 consultas gratis · 7 días de trial