Introduccion
CertiVeh Partner API · Integra CertiVeh en tu aplicacion para que tus usuarios obtengan su certificado UPME sin salir de tu plataforma.
Esta API REST permite crear usuarios, iniciar tramites de certificacion UPME, subir documentos, procesar pagos y consultar el estado de cada tramite de forma programatica.
Autenticacion
Todas las solicitudes requieren el header X-API-Key con tu clave de partner.
X-API-Key: pk_live_xxxxxxxxxxxxx
Base URL
https://ykolfdgnlaxahtbuurgj.supabase.co/functions/v1/partner-api
Registra un nuevo usuario asociado a tu cuenta de partner.
Cuerpo de la solicitud · Persona Natural
| Campo | Tipo | Descripcion |
|---|---|---|
| emailrequired | string | Email del usuario |
| phoneoptional | string | Telefono formato E.164 (ej: +573001234567) |
| person_typerequired | string | "natural" o "juridica" |
| first_namesrequired | string | Nombres |
| last_namesrequired | string | Apellidos |
| cedula_numberrequired | string | Numero de cedula (solo digitos) |
| date_of_birthoptional | string | Fecha nacimiento AAAA-MM-DD |
| expedition_dateoptional | string | Fecha expedicion cedula AAAA-MM-DD |
| ciiu_codeoptional | string | Codigo CIIU 4 digitos |
| departmentrequired | string | Departamento (ej: "ANTIOQUIA") |
| municipalityrequired | string | Municipio (ej: "MEDELLIN") |
| addressrequired | string | Direccion de residencia |
Campos adicionales · Persona Juridica
| Campo | Tipo | Descripcion |
|---|---|---|
| company_namerequired | string | Razon social |
| nitrequired | string | NIT sin digito verificacion (9 digitos) |
| nit_dvoptional | string | Digito de verificacion (1 digito) |
| legal_rep_namerequired | string | Nombre representante legal |
| legal_rep_idrequired | string | Cedula representante legal |
| company_addressoptional | string | Direccion empresa |
Ejemplo de solicitud
curl -X POST \
https://ykolfdgnlaxahtbuurgj.supabase.co/functions/v1/partner-api/users \
-H "X-API-Key: pk_live_xxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@ejemplo.com",
"phone": "+573001234567",
"person_type": "natural",
"first_names": "JUAN CARLOS",
"last_names": "GARCIA LOPEZ",
"cedula_number": "1020304050",
"date_of_birth": "1990-05-15",
"expedition_date": "2010-03-20",
"ciiu_code": "4511",
"department": "CUNDINAMARCA",
"municipality": "BOGOTA D.C.",
"address": "Calle 100 #15-20 Apto 501"
}' Respuesta 201
{
"user_id": "uuid-del-usuario",
"status": "created"
} user_id existente y actualiza el perfil con los datos enviados. No se crea un usuario duplicado. Esto permite reintentos seguros.
Crea un tramite de certificacion UPME con los datos del vehiculo. Retorna el desglose de costos.
Cuerpo de la solicitud
| Campo | Tipo | Descripcion |
|---|---|---|
| user_idrequired | string | UUID del usuario (obtenido de POST /users) |
| platerequired | string | Placa, formato ABC123 o ABC12D (3 letras + 2 digitos + 1 alfanumerico) |
| vinrequired | string | VIN (exactamente 17 caracteres, no puede contener I, O, Q) |
| brandrequired | string | Marca (ej: "KIA") |
| linerequired | string | Linea/modelo (ej: "NIRO DESIRE") |
| yearrequired | number | Ano del modelo |
| engine_numberoptional | string | Numero de motor (no aplica para electricos puros) |
| displacement_kwoptional | string | Potencia en kW (ej: "150") |
| propulsion_typerequired | string | "Electrico" o "Hibrido" |
| owner_namerequired | string | Nombre propietario registrado |
| owner_idrequired | string | Cedula/NIT propietario |
| purchase_value_coprequired | number | Valor del vehiculo en COP antes de IVA (minimo 1.000.000) |
| purchase_daterequired | string | Fecha compra AAAA-MM-DD |
| dealer_namerequired | string | Nombre concesionario |
| invoice_numberrequired | string | Numero factura |
| buyer_namerequired | string | Nombre comprador en factura |
| person_typeoptional | string | "natural" o "juridica". Default: "natural". Debe coincidir con el tipo usado en POST /users. |
Ejemplo de solicitud
curl -X POST \
https://ykolfdgnlaxahtbuurgj.supabase.co/functions/v1/partner-api/tramites \
-H "X-API-Key: pk_live_xxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"user_id": "uuid-del-usuario",
"plate": "QMX060",
"vin": "KNACP81EGT5328961",
"brand": "KIA",
"line": "NIRO DESIRE",
"year": 2025,
"propulsion_type": "Hibrido",
"owner_name": "JUAN CARLOS GARCIA LOPEZ",
"owner_id": "1020304050",
"purchase_value_cop": 116805309,
"purchase_date": "2025-08-10",
"dealer_name": "KIA MOTORS BOGOTA",
"invoice_number": "FV-2025-001234",
"buyer_name": "JUAN CARLOS GARCIA LOPEZ"
}' Respuesta 201
{
"case_id": "uuid-del-tramite",
"amount_cop": 1415800,
"amount_cents": 141580000,
"breakdown": {
"costo_upme": 701812,
"honorarios": 599990,
"iva": 113998,
"discount": 0,
"total": 1415800
}
} Sube documentos requeridos. Cada documento se procesa automaticamente con IA.
multipart/form-data. Archivos soportados: JPG, PNG o PDF, max 10 MB. Campos del formulario
| Campo | Tipo | Descripcion |
|---|---|---|
| typerequired | string | Tipo de documento (ver tabla abajo) |
| filerequired | file | Archivo (JPG, PNG o PDF, max 10MB) |
Tipos de documento
| Valor de type | Descripcion |
|---|---|
| cedula-frente | Cedula ciudadania (frente) |
| cedula-reverso | Cedula ciudadania (reverso) |
| rut | RUT (persona natural) |
| tarjeta-propiedad-frente | Tarjeta propiedad vehiculo (frente) |
| tarjeta-propiedad-reverso | Tarjeta propiedad vehiculo (reverso) |
| factura | Factura compra vehiculo |
cedula-frente, cedula-reverso, tarjeta-propiedad-frente, tarjeta-propiedad-reverso y factura. El rut es opcional pero recomendado.
Ejemplo de solicitud
curl -X POST \ https://ykolfdgnlaxahtbuurgj.supabase.co/functions/v1/partner-api/tramites/uuid-del-tramite/documents \ -H "X-API-Key: pk_live_xxxxxxxxxxxxx" \ -F "type=factura" \ -F "file=@/path/to/factura.pdf"
Respuesta 200
// Documentos del vehiculo (factura, tarjeta-propiedad-*) { "case_id": "uuid", "type": "factura", "ocr_status": "pending" } // Documentos personales (cedula-frente, cedula-reverso, rut) { "document_id": "uuid", "type": "cedula-frente", "ocr_status": "pending" }
ocr_status inicia en "pending" y cambia a "done" cuando la extraccion finaliza (normalmente 5-15 segundos). Puedes verificar el estado consultando GET /tramites/:id y revisando el array documents.
Retorna el estado actual y detalles de un tramite.
Ejemplo de solicitud
curl -X GET \ https://ykolfdgnlaxahtbuurgj.supabase.co/functions/v1/partner-api/tramites/uuid-del-tramite \ -H "X-API-Key: pk_live_xxxxxxxxxxxxx"
Respuesta 200
{
"case_id": "uuid",
"status": "IN_PROGRESS",
"step": 5, // 1-7
"progress_pct": 67, // 0-100, basado en 7 pasos
"paid_at": "2026-05-20T...",
"created_at": "2026-05-15T...",
"updated_at": "2026-05-20T...",
"vehicle": {
"brand": "KIA",
"line": "NIRO DESIRE",
"year": 2025,
"plate": "QMX060",
"vin": "KNACP81EGT5328961",
"propulsion_type": "Hibrido",
"purchase_value_cop": 116805309
},
"documents": [
{ "type": "factura", "ocr_status": "done" },
{ "type": "tarjeta-propiedad-frente", "ocr_status": "done" }
],
"payment": {
"status": "APPROVED",
"amount_cents": 141580000,
"reference": "CERTIVEH-xxx-xxx",
"created_at": "2026-05-20T14:00:00Z"
}
} Pasos del pipeline (1–7)
| Paso | Etapa | Status en DB |
|---|---|---|
| 1 | En borrador | DRAFT |
| 2 | Solicitud enviada | DOCUMENT_REVIEW |
| 3 | Registro en UPME | IN_PROGRESS (UPME_REGISTER) |
| 4 | Esperando ventana UPME | IN_PROGRESS (WAITING_WINDOW) |
| 5 | Tramite en UPME | IN_PROGRESS (FILL_TRAMITE) |
| 6 | Espera de certificado | FILED, APPROVED, o REJECTED |
| 7 | Certificado emitido | COMPLETED |
Estados del tramite
| Status | Descripcion |
|---|---|
| DRAFT | Tramite creado, pendiente de pago (step 1) |
| DOCUMENT_REVIEW | Pago recibido, documentos en revision (step 2) |
| IN_PROGRESS | En tramite ante la UPME (steps 3–5) |
| FILED | Solicitud de certificado enviada a UPME (step 6) |
| APPROVED | UPME aprobo la solicitud (step 6) |
| ACTION_REQUIRED | Se necesita una accion del usuario (se resuelve al step donde estaba) |
| COMPLETED | Certificado emitido (step 7) |
| REJECTED | Solicitud rechazada por la UPME (step 6) |
Inicializa una sesion de pago y retorna los datos de integracion con Wompi.
Ejemplo de solicitud
curl -X POST \ https://ykolfdgnlaxahtbuurgj.supabase.co/functions/v1/partner-api/tramites/uuid-del-tramite/payment \ -H "X-API-Key: pk_live_xxxxxxxxxxxxx"
Respuesta 200
{
"reference": "CERTIVEH-xxx-xxx",
"amount_cents": 141580000,
"amount_cop": 1415800,
"currency": "COP",
"public_key": "pub_prod_xxx",
"signature": "sha256-hash",
"redirect_url": "https://portal.certiveh.co/tramite/confirmacion?ref=xxx"
} Integracion Widget Wompi
Usa los valores de la respuesta para renderizar el boton de pago de Wompi:
<script src="https://checkout.wompi.co/widget.js" data-render="button" data-public-key="{'{'+'public_key}'}" data-currency="{'{'+'currency}'}" data-amount-in-cents="{'{'+'amount_cents}'}" data-reference="{'{'+'reference}'}" data-redirect-url="{'{'+'redirect_url}'}" data-signature:integrity="{'{'+'signature}'}"> </script>
DRAFT a DOCUMENT_REVIEW. No necesitas hacer nada adicional. Tu plataforma puede confirmar el pago consultando GET /tramites/:id y verificando que payment.status sea "APPROVED" y que paid_at no sea null.
portal.certiveh.co. Si necesitas redirigir a una URL propia de tu plataforma, contacta al equipo para configurarlo.
Simula la aprobacion de un pago sin realizar un cobro real. Solo disponible en modo sandbox.
sk_sandbox_xxx). Retorna 403 si se usa con la API key de produccion.
Ejemplo de solicitud
curl -X POST \ https://ykolfdgnlaxahtbuurgj.supabase.co/functions/v1/partner-api/tramites/uuid-del-tramite/simulate-payment \ -H "X-API-Key: sk_sandbox_xxxxxxxxxxxxx"
Respuesta 200
{
"case_id": "uuid-del-tramite",
"payment_id": "uuid-del-pago",
"status": "APPROVED",
"case_status": "DOCUMENT_REVIEW",
"sandbox": true,
"message": "Payment simulated successfully. No real charge was made."
} POST /tramites/:id/payment antes para crear el registro de pago PENDING. Este endpoint toma ese pago pendiente y lo marca como APPROVED, avanzando el caso a DOCUMENT_REVIEW. Si tienes un webhook URL configurado, recibiras la notificacion tramite.payment_confirmed con sandbox: true.
Webhooks
CertiVeh envia notificaciones HTTP POST a tu webhook URL cuando el estado de un tramite cambia. Proporciona tu webhook URL al solicitar tu API key.
Payload
{
"event": "tramite.status_changed",
"case_id": "uuid",
"status": "DOCUMENT_REVIEW",
"timestamp": "2026-05-20T15:30:00Z"
} Transiciones de estado tipicas
| Transicion | Evento | Significado |
|---|---|---|
| DRAFT → DOCUMENT_REVIEW | Pago recibido | Wompi confirmo el pago exitosamente |
| DOCUMENT_REVIEW → IN_PROGRESS | Documentos aprobados | CertiVeh inicio el tramite ante la UPME |
| IN_PROGRESS → FILED | Solicitud radicada | Se radico la solicitud en el portal UPME |
| FILED → APPROVED | Solicitud aprobada | La UPME aprobo la solicitud, certificado en emision |
| APPROVED → COMPLETED | Certificado emitido | El certificado UPME fue emitido y esta disponible |
| * → ACTION_REQUIRED | Accion requerida | El usuario debe corregir algo (ej: documento ilegible) |
| FILED → REJECTED | Solicitud rechazada | La UPME rechazo la solicitud |
GET /tramites/:id como respaldo en caso de que un webhook falle.
Errores
Todas las respuestas de error siguen un formato consistente:
{
"error": "Description"
} Codigos HTTP
- 400 Solicitud invalida · campo faltante o formato incorrecto
- 401 API key invalida o inactiva
- 403 No autorizado · el recurso no pertenece a tu cuenta de partner
- 404 Recurso no encontrado
- 429 Demasiadas solicitudes · limite de tasa excedido
- 500 Error interno del servidor
Limite de tasa
Todos los endpoints estan limitados a 100 solicitudes por minuto por API key.
| Header de respuesta | Descripcion |
|---|---|
| X-RateLimit-Limit | Maximo de solicitudes por minuto (100) |
| X-RateLimit-Remaining | Solicitudes restantes en la ventana actual |
Cuando se excede el limite, la API retorna 429 Too Many Requests. Espera a que la ventana se reinicie antes de reintentar.
Seguridad
Todas las solicitudes a la API se registran automaticamente incluyendo direccion IP, user-agent y codigo de respuesta para auditoria y seguridad.
Descuentos de partner
Los precios retornados por POST /tramites y POST /tramites/:id/payment aplican automaticamente cualquier descuento configurado para tu cuenta de partner. El campo breakdown.discount refleja el monto del descuento aplicado. No se necesitan parametros adicionales.
Ambiente de pruebas (Sandbox)
CertiVeh provee un ambiente de sandbox completo para que puedas desarrollar y probar tu integracion sin generar cobros reales, facturas, ni emails.
Como funciona
| Aspecto | Produccion | Sandbox |
|---|---|---|
| API Key | sk_live_xxx | sk_sandbox_xxx |
| Cobros reales | Si (Wompi produccion) | No (Wompi sandbox o simulado) |
| Facturas Alegra | Si | No |
| Emails / WhatsApp | Si | No |
| Emision seguros | Si | No |
| OCR documentos | Si | Si (para testear) |
| Webhooks al partner | Si | Si (con sandbox: true) |
| Datos | Base de datos principal | Misma base, marcados sandbox=true |
| Header de respuesta | - | X-Sandbox: true |
Flujo tipico de prueba
- Usa tu API key sandbox
X-API-Key: sk_sandbox_xxx· Todos los endpoints funcionan igual, pero la data se marca como sandbox. - Crea usuario y tramite
POST /usersyPOST /tramites· Funcionan identico a produccion. Las respuestas incluyen"sandbox": true. - Sube documentos
POST /tramites/:id/documents· El OCR se ejecuta normalmente para que puedas validar la extraccion de datos. - Simula el pago
POST /tramites/:id/paymentpara crear el pago, luegoPOST /tramites/:id/simulate-paymentpara aprobar instantaneamente sin Wompi. - Recibe el webhook Tu endpoint recibe
tramite.payment_confirmedconsandbox: true. Valida tu implementacion.
POST /tramites/:id/payment en sandbox retorna la llave publica de Wompi sandbox automaticamente. Usa las tarjetas de prueba de Wompi para simular pagos.
Flujo de integracion
Integracion tipica de punta a punta en 6 pasos:
- Crear usuario
POST /users· Registra al usuario con sus datos personales. Si el email ya existe, retorna el user_id existente. - Crear tramite con datos del vehiculo
POST /tramites· Envia los datos del vehiculo y recibe el desglose de costos. El tramite se crea en estadoDRAFT. - Subir documentos
POST /tramites/:id/documents· Sube cedula (frente y reverso), tarjeta de propiedad (frente y reverso) y factura. Cada documento se procesa con OCR automaticamente. El orden no importa. - Iniciar pago
POST /tramites/:id/payment· Obtiene los parametros para renderizar el widget de Wompi. Cuando el usuario paga, el tramite cambia automaticamente aDOCUMENT_REVIEW. - Consultar estado
GET /tramites/:id· Consulta el progreso del tramite periodicamente. Usastatuspara el estado general ystep(1-7) para el progreso detallado. - Recibir webhooks Tu endpoint recibe notificaciones automaticas cada vez que el estado del tramite cambia (pago recibido, en proceso, certificado emitido, etc.).
Contacto
Para solicitar tu API key o soporte tecnico, escribe a:
contacto@certiveh.co