Errores y rate limits

La API de PlacApi usa códigos HTTP estándar y, en cada error, un campo code estable en el JSON. La regla corta: un 4xx significa que la consulta ya tiene respuesta definitiva y reintentar no la cambia; un 5xx significa que no pudimos consultar y reintentar sí sirve.

Códigos de error

Programa contra el campo code, no contra el texto de error: el code es estable y el texto puede cambiar sin aviso.

Algunos endpoints mandan además errorCode con el mismo valor. Es un alias que se conserva por compatibilidad: usa code.

HTTPcodeSignificadoQué hacer
400bad_requestLos datos de la petición no pasan validación de formato (placa, documento, correo, etc.).Corrige la petición. El detalle por campo viene en details.
400apellido_requeridoSolo en /api/licencia: la consulta exige el primer apellido del titular y no pudimos resolverlo. También puede salir cuando el apellido enviado no coincide con el titular.Reenvía con primerApellido (solo el primer apellido, p. ej. "PÉREZ"). Esta respuesta NO cobra crédito.
400tipo_documento_no_soportadoEse endpoint no maneja el tipo de documento enviado (p. ej. un NIT en una consulta de persona natural).Usa uno de los docType que lista la documentación del endpoint. Reintentar igual da lo mismo. NO cobra crédito.
400consulta_invalidaLa búsqueda no se puede responder tal como se envió (p. ej. un radicado mal formado, o un criterio con demasiados resultados). El mensaje dice qué ajustar.Corrige o acota la búsqueda. NO cobra crédito.
401unauthorizedFalta la API key, o es inválida o revocada.Envía x-api-key: pk_live_… válida. Genérala en /integracion.
402no_creditsLa cuenta no tiene créditos suficientes para el precio de ese endpoint. El body trae costo (créditos que pide la consulta), saldo (los que tiene la cuenta), comprar (el enlace para recargar) y desde (el paquete mínimo con su precio).Compra créditos en el enlace de comprar. No se cobró nada; reintenta cuando haya saldo.
404propietario_no_coincideLa consulta se hizo: el documento enviado no es de un propietario activo de esa placa.Verifica el número de documento. Reintentar da el mismo resultado.
404vehiculo_no_registradoLa consulta se hizo: no hay información registrada para ese vehículo.Verifica la placa. Reintentar da el mismo resultado.
404consulta_sin_resultadoLa consulta se hizo y no hay resultados para lo consultado (p. ej. un documento sin licencias). En /api/licencia con primerApellido, también puede significar que ese apellido no es el del titular: con algunas personas la respuesta es la misma.No reintentes igual: no hay datos que entregar. En /api/licencia, verifica primero el primer apellido; con otro apellido la consulta se hace de nuevo.
404no_encontradoEndpoints de Perú, Chile y México: la placa o el documento no figura en el registro de ese país.Verifica el dato. Reintentar da el mismo resultado. NO cobra crédito.
429rate_limitedSe superó el límite de consultas.Aplica backoff exponencial. Respeta el header Retry-After.
500internal_errorError interno inesperado de nuestro lado.Reintenta; si persiste, contáctanos.
502source_errorNo fue posible consultar el dato en este momento (no hubo respuesta a tiempo).Reintenta más tarde. La consulta no se cobró nunca.
503fuente_saturadaLa consulta se limitó por cupo (por minuto, o por documento y día según el endpoint). No es una caída ni un "no existe": es un "ahora no".Espera lo que diga el header Retry-After y reintenta. Esta respuesta NO cobra crédito, y con otro documento la consulta responde normal.
503identidad_no_disponibleSolo en /api/licencia sin primerApellido: no pudimos averiguar el apellido del titular en este momento. Tu petición está bien.Reintenta pasado el Retry-After (60 s) o envía primerApellido. Esta respuesta NO cobra crédito.
503session_requiredEl servicio de ese endpoint no está disponible temporalmente por una falla de nuestro lado. Tu petición está bien.Reintenta en unos minutos. NO cobra crédito.
503captcha_no_configuradoEse endpoint no está operativo en este momento por configuración nuestra; la consulta no se intentó.Reintenta más tarde; si persiste, contáctanos. NO cobra crédito.
503fuente_no_disponibleEse endpoint no está disponible en este momento; la consulta no se intentó.Reintenta más tarde; si persiste, contáctanos. NO cobra crédito.

404 no es un fallo nuestro

Un 404 quiere decir que la consulta sí se hizo, y la respuesta es que no hay datos para esa combinación. El caso más común es un dígito equivocado en el documento: no corresponde a un propietario activo del vehículo.

Por eso el 404 no se reintenta: el resultado sería idéntico. Distinguirlo del 502 te evita bucles de reintento sobre consultas que nunca van a devolver datos.

El cuerpo trae dos campos para que no tengas que adivinar la factura: charged dice si esta consulta descontó crédito, y freeNoResultsLeft, cuántas consultas sin resultado gratis te quedan este mes de ese mismo code — cada código lleva su propia cuota.

HTTP 404
{
  "error": "El documento enviado no corresponde a un propietario
            activo de esa placa.",
  "code": "propietario_no_coincide",
  "charged": false,
  "freeNoResultsLeft": 7
}

Cobro de créditos

Cada endpoint cobra su precio en créditos cuando la consulta devuelve datos (el objeto data presente, con mode: "live"). La mayoría cuesta 1 crédito; algunos cuestan 2 o 3, y el precio está en la documentación de cada endpoint. /api/licencia cobra 1 crédito más cuando no envías primerApellido y lo resolvemos nosotros. Un 5xx nunca cobra: ahí no pudimos consultar y no hay nada que facturar.

Repetir la misma consulta no vuelve a cobrar. Guardamos en caché el resultado de cada consulta (misma placa y documento). Si repites dentro de la ventana de caché, respondemos al instante desde caché — la respuesta trae fromCache: true — y no se descuenta crédito: solo cobra la primera consulta viva. La ventana depende del dato: los datos del vehículo se guardan 24 horas, y las demás fuentes van de horas a 30 días. Usa refresh: true si necesitas forzar una consulta viva.

Consultas sin resultado (404): 10 gratis cada mes por cada code. Aplica a los endpoints de vehículo por placa y documento (consulta, consulta-full, vehiculo-basico, apto-traspaso), a consulta-por-vin, licencia y catalogo; en los demás endpoints un 404 no cobra nunca. Pasadas esas 10, ese 404 cuesta lo mismo que una consulta con datos: la consulta se hizo igual y tuvo respuesta. Las cuotas son independientes: propietario_no_coincide, vehiculo_no_registrado y consulta_sin_resultado llevan cada uno sus 10, así que agotar una no empieza a cobrarte las otras. El contador es por cuenta, se reinicia el primer día de cada mes (hora de Colombia) y cada respuesta trae el de su propio código en freeNoResultsLeft.

Repetir una consulta que ya salió sin resultado no cobra durante 24 horas, ni siquiera con la cortesía agotada: la guardamos 24 horas y te la devolvemos desde caché con fromCache: true y charged: false. Pasado ese plazo se vuelve a consultar, por si el dato cambió. Si necesitas verificar de nuevo —por ejemplo si crees que el vehículo ya se matriculó—, usa refresh: true: esa sí es una consulta viva y puede cobrar.

Excepción: consulta-full siempre cobra sus 3 créditos, incluso desde caché: combina varias fuentes con vigencias distintas y no expone un único fromCache. Para pruebas repetidas de la misma placa te sale más barato usar los endpoints individuales.

Rate limits y reintentos

El límite es de 1.000 consultas por minuto por API key. Va por key y no por IP, así que puedes integrar desde un backend con una sola IP de salida sin que tus usuarios compartan cuota.

Ante un 429, aplica backoff exponencial (1s, 2s, 4s) con un tope de reintentos y respeta el header Retry-After, que trae los segundos que faltan. Lo mismo con un 503 fuente_saturada: ese cupo no depende de tu cuenta, y el Retry-After puede ser de segundos o de horas — reintentar antes vuelve a chocar con el mismo contador. Ante un 502 no pudimos consultar el dato: reintenta más tarde. Ante un 4xx, no reintentes — corrige los datos. Si necesitas más volumen, escríbenos.

Ver autenticación y la documentación.

Si llamas desde el navegador (CORS)

CORS no está habilitado. Ninguna respuesta nuestra incluye el header Access-Control-Allow-Origin, así que un fetch desde el JavaScript de una página la bloquea el navegador. La API es servidor a servidor.

Ese fallo no es uno de los códigos de esta página. No verás code ni cuerpo JSON: el navegador descarta la respuesta antes de entregártela y en la consola queda un TypeError: Failed to fetch con la nota de bloqueo por política de mismo origen. No lo reintentes: reintentar desde el navegador da siempre lo mismo.

El motivo es de seguridad: llamar desde el navegador obliga a mandar la API key en el código que descarga el visitante, y ahí la lee cualquiera que abra las herramientas de desarrollo — con ella consumiría tus créditos. Llama desde tu backend con la key en una variable de entorno y expón tu propio endpoint a tu frontend. Más detalle en autenticación y CORS.

Última revisión: 16 de septiembre de 2026 · PlacApi opera desde Colombia. PlacApi no es una entidad oficial del Gobierno.

Contacto