Pruebas de integración
Muchos de nuestros trámites requieren una interacción manual del equipo de Punto: revisar documentación, avanzar el trámite o resolver una incidencia. Para que puedas validar tu integración sin depender de nosotros, tienes disponibles en desarrollo unos endpoints de test que emulan esas acciones.
Objetivo
Esta guía define el proceso para validar tu integración con la API de Punto. Cubre, en orden:
- Configurar tus webhooks antes de empezar las pruebas.
- Emulación de acciones — los endpoints de test que sustituyen las acciones manuales del equipo de Punto (avanzar el estado de un trámite, añadir un documento, crear o resolver una incidencia).
- Flujos a validar para cada tipo de trámite: matriculación, transferencia y notificación.
Como anexo, encontrarás también un listado de documentos de ejemplo por si no quieres usar tus propios PDFs.
Configuración de los webhooks
Para poder recibir los eventos de los trámites es necesario que configures tus webhooks antes de empezar las pruebas. Los webhooks se configuran de forma independiente por entorno.
Envíanos un email a developers@punto.ai indicándonos, para cada entorno:
- URL.
- Tipos de eventos que quieres recibir. Si no especificas nada, te enviamos todos.
- Opcionalmente, una cabecera HTTP para validar que los eventos son legítimos.
Más detalle en la guía de Webhooks.
Emulación de acciones
Muchas de las acciones sobre el trámite — cambiar el estado, añadir un documento generado, crear o resolver una incidencia— las realiza normalmente el equipo de Punto. Para que puedas probarlas sin depender de nosotros, en el entorno de desarrollo tienes disponibles los siguientes endpoints de test.
Cambiar el estado de un trámite
Cambia el estado de un trámite, del mismo modo que lo haría el equipo de Punto. Se recibe un evento procedure.status_changed con el nuevo estado. Los valores válidos son los mismos que los del listado de estados de un trámite.
PUT /v1/test/procedures/{id}/status{
"status": "IN_PROGRESS"
}Añadir un documento generado a un trámite
Añade un documento de ejemplo al trámite indicando únicamente su tipo. El documento se añade a generatedDocuments y dispara un evento procedure.document.added. Documentos disponibles:
| Tipo | Documento |
|---|---|
es_576_doc | Modelo 576 IEDMT |
es_iedmt_payment_proof | Justificante de pago IEDMT |
es_ivtm_doc | Modelo IVTM |
es_ivtm_payment_proof | Justificante de pago IVTM |
submission_proof | Justificante de presentación |
procedure_invoice | Factura del trámite |
es_itp_doc | Modelo 620 ITP |
es_itp_payment_proof | Justificante de pago ITP |
POST /v1/test/procedures/{id}/documents{
"type": "es_ivtm_payment_proof"
}Crear una incidencia a nivel de trámite
Añade una incidencia a nivel de trámite, de nivel blocker o hold. El trámite pasa a BLOCKED y se reciben los eventos procedure.status_changed y procedure.incident.added. Algunos tipos disponibles:
Nivel blocker — el trámite está bloqueado por algo que el cliente puede desbloquear
| Tipo | Descripción |
|---|---|
ownership-hold | El vehículo tiene reserva de dominio |
seizure | El vehículo está embargado |
sealed-vehicle | El vehículo tiene un precinto |
unpaid-ivtm-tax | IVTM impagado — el titular debe pagar los recibos pendientes |
pending-document | Falta un documento requerido |
Nivel hold — el trámite espera una respuesta de una entidad externa
| Tipo | Descripción |
|---|---|
transfer-rejected | Vehículo con denegatoria |
waiting-gestores-validation | Esperando validación del Colegio de Gestores |
waiting-620-validation | Esperando validación del modelo 620 |
waiting-iedmt-validation | Esperando que Hacienda valide el IEDMT |
POST /v1/test/procedures/{id}/incidents{
"type": "unpaid-ivtm-tax"
}Crear una incidencia a nivel de documento
Añade una incidencia a nivel de documento. El trámite pasa a BLOCKED y se reciben los eventos procedure.status_changed y procedure.incident.added. Algunos tipos disponibles:
| Tipo | Descripción |
|---|---|
expired-document | Documento caducado |
unreadable-document | Documento no legible |
invalid-document | Documento no válido |
incomplete-document | Documento incompleto — falta alguna página |
out-of-validity-document | Documento fuera del periodo de vigencia |
POST /v1/test/procedures/{id}/documents/{documentId}/incidents{
"type": "invalid-document"
}Resolver cualquier tipo de incidencia
Marca como resuelta cualquier incidencia — de nivel hold o blocker — de un trámite o de un documento. El body de la petición va vacío. Se reciben los eventos procedure.status_changed (de vuelta a PENDING si no quedan más incidencias) y procedure.incident.solved.
POST /v1/test/procedures/{id}/incidents/{incidentId}/solve{}Pruebas de trámites DGT
A continuación recogemos los flujos que puede seguir un trámite en la operativa diaria. Te animamos a validarlos en el entorno de pruebas para comprobar que tu integración funciona correctamente y que recibes la información necesaria para mantener actualizado el estado del trámite por tu lado. No hace falta que ejecutes los tres: prueba uno o varios según los flujos con los que te vayas a encontrar. Los pasos marcados como (emulación) se ejecutan con los endpoints de test de la sección anterior.
Flujo 1 — Crea trámite pendiente de confirmar
- Crea un trámite no confirmado con los datos mínimos —
POST /v1/procedures/registration(o el endpoint equivalente de transferencia/notificación) con"confirmed": false. - Modifica el trámite añadiendo o cambiando algunos datos —
PATCH /v1/procedures/registration/{id}. - Confirma el trámite —
POST /v1/procedures/{id}/confirm. Se recibeprocedure.status_changed→PENDING. - Valida que el trámite está confirmado —
GET /v1/procedures/{id}. - Añade un documento de tipo generado (emulación). Se recibe
procedure.document.added; el documento es descargable a través deevent.data.downloadUrl. - Avanza el trámite hasta un estado final (emulación). Se reciben, en orden,
procedure.status_changed→IN_PROGRESSyprocedure.status_changed→DONE.
Flujo 2 — Crea un trámite confirmado
- Crea un trámite ya confirmado, con todos los datos necesarios —
POST /v1/procedures/registration(o equivalente). Se recibeprocedure.status_changed→PENDING. - Valida que el trámite está confirmado —
GET /v1/procedures/{id}. - Añade un documento de tipo generado (emulación). Se recibe
procedure.document.added, descargable víaevent.data.downloadUrl. - Avanza el trámite hasta un estado final (emulación). Se reciben, en orden,
procedure.status_changed→IN_PROGRESSyprocedure.status_changed→DONE.
Flujo 3 — Resuelve incidencias
Ejecuta este flujo con uno cualquiera de los tipos de trámite.
- Crea un trámite confirmado, con todos los datos necesarios —
POST /v1/procedures/registration(o equivalente). Se recibeprocedure.status_changed→PENDING. - Añade una incidencia a nivel de trámite (emulación). Se reciben
procedure.status_changed→BLOCKEDyprocedure.incident.added. - Resuelve la incidencia vía API —
POST /v1/procedures/{id}/incidents/{incidentId}/solve. Se recibenprocedure.status_changed→PENDINGyprocedure.incident.solved. - Añade una incidencia a nivel de documento (emulación). Se reciben
procedure.status_changed→BLOCKEDyprocedure.incident.added. - Resuelve la incidencia vía API con el mismo endpoint. Se reciben
procedure.status_changed→PENDINGyprocedure.incident.solved. - Avanza el trámite hasta un estado final (emulación). Se reciben, en orden,
procedure.status_changed→IN_PROGRESSyprocedure.status_changed→DONE.
Pruebas de informes DGT
Los informes DGT tienen dos tipos —reducido y completo— y se crean con POST /v1/reports/reduced y POST /v1/reports/complete. El informe se genera de forma asíncrona: la creación responde con status: "processing" y el resultado llega vía el webhook report.completed o consultando GET /v1/reports/{id}.
Para que puedas validar los distintos desenlaces —vehículo no transferible, con avisos, no registrado en la DGT, error técnico— sin depender de la DGT, en el entorno de desarrollo tienes reservadas unas matrículas sentinel. Al crear un informe con una de ellas, se devuelve el desenlace asociado en lugar del resultado real. Cualquier otra matrícula válida devuelve un informe correcto (transferabilityStatus: transferable).
Las matrículas sentinel son distintas para cada tipo de informe.
Informe reducido
| Matrícula | Escenario | Resultado (GET /v1/reports/{id}) |
|---|---|---|
0000BBB | Vehículo no transferible | status: completed, transferabilityStatus: not_transferable |
0000CCC | Transferible con avisos | status: completed, transferabilityStatus: transferable_with_alerts |
0000DDD | No registrado en la DGT | status: error |
0000FFF | Error técnico | status: error |
Con cualquier otra matrícula válida el informe reducido se resuelve como status: completed y transferabilityStatus: transferable (vehículo transferible).
POST /v1/reports/reduced{
"vrm": "0000BBB"
}Cuando el estado del informe reducido es completed se emiten los webhook events report.completed y report.status_changed. Cuando el estado del informe reducido es error sólo se emite el webhook event report.status_changed
Informe completo
| Matrícula | Escenario | Resultado (GET /v1/reports/{id}) |
|---|---|---|
8888BBB | Vehículo no transferible | status: completed, transferabilityStatus: not_transferable |
9999DDD | Matrícula no válida / no registrada | status: error, failureReason: null |
9999FFF | Error técnico | status: error, failureReason: service_unavailable |
Con cualquier otra matrícula válida el informe completo se resuelve como status: completed y transferabilityStatus: transferable (vehículo transferible).
POST /v1/reports/complete{
"vrm": "9999FFF"
}El informe completo nunca devuelve transferable_with_alerts: las incidencias no bloqueantes se listan en chargesAndLiens, no en el veredicto. Para diferenciar un error transitorio de uno permanente, revisa failureReason — service_unavailable es reintentable, null no lo es.
Documentos de ejemplo
Si no quieres usar tus propios PDFs para las pruebas, puedes usar estos documentos de ejemplo.
Documentos de entrada
Matriculación
| Documento | Tipo | Enlace |
|---|---|---|
| DNI comprador | national_id | Descargar |
| Mandato de representación | representation_auth | Descargar |
| Factura de venta | invoice | Descargar |
| Ficha técnica | technical_sheet | Descargar |
Transferencia y notificación
| Documento | Tipo | Enlace |
|---|---|---|
| DNI comprador | national_id | Descargar |
| Certificado de empadronamiento | residence_registration_cert | Descargar |
| Contrato de compraventa | sales_agreement | Descargar |
| Ficha técnica | technical_sheet | Descargar |
| Permiso de circulación | veh_registration_cert | Descargar |
Documentos generados
Matriculación
| Documento | Tipo | Enlace |
|---|---|---|
| Modelo 576 IEDMT | es_576_doc | Descargar |
| Justificante de pago IEDMT | es_iedmt_payment_proof | Descargar |
| Modelo IVTM | es_ivtm_doc | Descargar |
| Justificante de pago IVTM | es_ivtm_payment_proof | Descargar |
| Justificante de presentación | submission_proof | Descargar |
Transferencia y notificación
| Documento | Tipo | Enlace |
|---|---|---|
| Modelo 620 ITP | es_itp_doc | Descargar |
| Justificante de pago ITP | es_itp_payment_proof | Descargar |
| Justificante de presentación | submission_proof | Descargar |
Siguientes pasos
Una vez hayas validado el proceso, o mientras lo estés validando, podemos organizar una sesión conjunta entre nuestros equipos de ingeniería para revisar la integración y comprobar juntos qué se recibe en cada lado. Escríbenos a developers@punto.ai para coordinarla.