API REST — Referencia de endpoints
Los endpoints de la API REST de Dinaup (webhook.dinaup.com): autenticación, informes, documentos, WriteOperations, herramientas fiscales, límites de tasa y códigos de respuesta.
La API REST de Dinaup lee y escribe tus datos con peticiones HTTP desde cualquier lenguaje. Todos los endpoints se sirven desde https://webhook.dinaup.com.
Autenticación
Toda petición (salvo el ping) lleva un Token Bearer en la cabecera HTTP:
Authorization: Bearer <token>El token no es tu Clave API en crudo. Dinaup lo deriva de la clave y su secreto, y lo antepone con el identificador de tu terminal:
<terminal>_<firma-del-secreto><firma-de-la-clave>No lo compones a mano. Genera la Clave API en dinaup.com > Claves API, marca la clave como compatible con webhooks, y copia el Token Bearer ya montado desde el Playground. El token hereda los permisos del usuario de la clave: solo accede a lo que ese usuario puede ver y escribir.
→ Ver Claves API
Usa el token solo en tu backend. Nunca lo incrustes en código público ni en el frontend de una web.
GET / — Ping
Verifica que el servidor responde. No requiere autenticación.
Request:
curl -X GET "https://webhook.dinaup.com"Response: 200 OK
"Hola :)"GET /api/whoami — Usuario de la clave
Devuelve el usuario asociado al token. Úsalo para comprobar que la autenticación funciona.
Request:
curl -X GET "https://webhook.dinaup.com/api/whoami" \
-H "Authorization: Bearer <token>"Response: 200 OK
{
"User": "..."
}El campo User trae la información de la sesión del usuario en Dinaup.
Límites de tasa
Cada endpoint limita las peticiones por tenant (identificado por el token). El control es un cubo de tokens: un saldo máximo que se repone poco a poco.
| Endpoint | Saldo máximo | Reposición | Periodo |
|---|---|---|---|
| WriteOperations | 30 | 5 | 10 s |
| Reports | 30 | 5 | 10 s |
| DynamicDocuments | 30 | 5 | 10 s |
| Whoami | 60 | 10 | 10 s |
| Herramientas (AEAT / VIES) | 10 | 2 | 10 s |
Las herramientas fiscales limitan por IP, no por token. Si superas el saldo, recibes 429 Too Many Requests con la cabecera Retry-After: 10.
POST /api/reports — Consultar informes
Ejecuta un informe de Dinaup Flex y devuelve las filas en JSON. El informe define columnas, filtros y agrupaciones; tú solo lo disparas.
Parámetros (query string):
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id | UUID | Sí | ID del informe |
page | int | No | Número de página. Por defecto 1 |
resultsPerPage | int | No | Resultados por página. Por defecto 10 |
withFiles | bool | No | Incluir URLs de archivos adjuntos. Por defecto false |
safeColumnsName | bool | No | Usar GUIDs como nombres de columna. Por defecto false |
Body (opcional): JSON plano con los valores de las variables del informe, si tiene preguntas dinámicas.
{
"variableFiltro1": "valor1",
"variableFiltro2": "valor2"
}Request:
curl -X POST "https://webhook.dinaup.com/api/reports?id=<id-del-informe>&page=1&resultsPerPage=100" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{}'Response:
{
"data": [
{"columna1": "valor1", "columna2": "valor2"},
{"columna1": "valor3", "columna2": "valor4"}
],
"currentPage": 1,
"totalPages": 5,
"totalResults": 42,
"files": []
}Activa safeColumnsName=true en producción: los nombres de columna dejan de cambiar si renombras un campo en Dinaup. Los resultados vienen paginados, así que itera con page y resultsPerPage para conjuntos grandes.
POST /api/dynamicdocuments — Documentos dinámicos
Renderiza un documento dinámico y devuelve su contenido. Los documentos dinámicos son plantillas que combinan datos de varias secciones en HTML, JSON o texto.
Parámetros (query string):
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id | UUID | Sí | ID del documento dinámico |
Body (opcional): JSON plano con las variables a sustituir en la plantilla.
{
"clienteId": "abc-123"
}Request:
curl -X POST "https://webhook.dinaup.com/api/dynamicdocuments?id=<id-del-documento>" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"clienteId": "abc-123"}'Response: 200 OK con el contenido renderizado del documento como texto.
POST /api/writeoperations — Escribir datos
Crea, edita o elimina registros en cualquier sección de Dinaup.
Parámetros (query string):
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
sectionId | UUID | Sí | ID de la sección donde escribir |
FieldPrimary | string | Sí | Campo clave que identifica registros. Normalmente id |
scripts | bool | No | Ejecutar los scripts de servidor de la sección. Por defecto false |
Headers:
Authorization: Bearer <token>
Content-Type: application/jsonCrear, editar y eliminar
La operación la decide el valor del campo id:
Valor de id | Operación | Descripción |
|---|---|---|
"" (cadena vacía) | Crear | Se crea un registro nuevo. Dinaup genera el ID |
| UUID existente | Editar | Se actualizan los campos enviados de ese registro |
Para eliminar, edita el registro con el campo eliminado a 1:
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"eliminado": "1"
}No hay endpoint DELETE. El borrado es lógico y se hace por WriteOperations.
Nombres de campo (pr_*)
Cada campo se identifica por su columna PostgreSQL, con formato pr_XXXXXXXXX. Consulta los nombres de cada sección desde:
- Play Dinaup → módulo Desarrollo → Esquema
- Dinaup Desktop (app Windows) → configuración de la sección
- doc-flex.dinaup.com → referencia de todas las secciones
- SDK .NET (MyDinaup) → la librería tipada de tu esquema; cada columna
pr_XXXXXXXXXcon un nombre legible
Los valores viajan siempre como texto ("100.00", "1"), no como números ni booleanos.
Formato 1: Objeto simple
Un solo registro como diccionario de campos:
{
"id": "",
"pr_cliente": "id-del-cliente",
"pr_importe": "100.00"
}Formato 2: Objeto con lista (padre + hijos)
Para secciones con una sección lista asociada (por ejemplo, Factura + Líneas):
{
"Main": {
"id": "",
"pr_cliente": "id-del-cliente"
},
"List": [
{"pr_item": "producto-1", "pr_cantidad": "10"},
{"pr_item": "producto-2", "pr_cantidad": "20"}
]
}Formato 3: Lote de objetos
Varios registros en una sola petición:
[
{"id": "", "pr_campo1": "valor1"},
{"id": "", "pr_campo1": "valor2"}
]Formato 4: Lote de objetos con listas
Varios registros padre-hijo en una sola petición:
[
{
"Main": {"id": "", "pr_campo": "valor1"},
"List": [{"pr_item": "val1"}]
},
{
"Main": {"id": "", "pr_campo": "valor2"},
"List": [{"pr_item": "val2"}]
}
]Ejemplo completo (crear un registro):
curl -X POST "https://webhook.dinaup.com/api/writeoperations?sectionId=<id-de-la-seccion>&FieldPrimary=id&scripts=true" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"id": "",
"pr_cliente": "id-del-cliente",
"pr_importe": "100.00"
}'Un objeto simple y un lote fallan entero si una operación es inválida. Trata siempre el código de respuesta antes de dar la escritura por buena.
Las escrituras respetan los permisos del usuario de la clave. Si ese usuario no puede escribir en una sección, la operación se rechaza.
Herramientas fiscales
Validan un identificador fiscal contra el censo oficial. Requieren token y limitan por IP.
GET /api/tools/aeat/NIFCheck — Validar NIF/CIF
Valida un NIF o CIF contra la Agencia Estatal de Administración Tributaria.
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
nif | string | Sí | NIF o CIF a validar |
nombre | string | Sí | Nombre o razón social del titular |
curl -X GET "https://webhook.dinaup.com/api/tools/aeat/NIFCheck?nif=B00000000&nombre=Empresa%20SL" \
-H "Authorization: Bearer <token>"GET /api/tools/vies/VATCheck — Validar VIES
Valida un número de identificación fiscal intracomunitario contra el sistema VIES. Útil antes de emitir una factura con IVA al 0 % a un operador intracomunitario.
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
nif | string | Sí | NIF intracomunitario a validar |
curl -X GET "https://webhook.dinaup.com/api/tools/vies/VATCheck?nif=ESB00000000" \
-H "Authorization: Bearer <token>"Códigos de respuesta
| Código | Significado |
|---|---|
200 | Operación correcta |
400 | Parámetros o cuerpo inválidos (falta sectionId, FieldPrimary, GUID mal formado) |
401 | Token inválido o ausente |
403 | El usuario de la clave no tiene permiso para esta operación |
404 | Recurso no encontrado (informe, documento, sección) |
429 | Superado el límite de tasa. Reintenta pasados los segundos de Retry-After |
500 | Error interno del servidor |
Playground
Prueba todos los endpoints y copia el Token Bearer de cada clave API, sin herramientas externas:
API y Webhooks
Dos direcciones de integración: la API REST para leer y escribir datos, y los webhooks salientes para recibir eventos cuando cambian tus datos.
Webhooks salientes
Configura webhooks salientes para que Dinaup envíe un POST a tu servidor cuando se crea o modifica un registro, con el estado del registro antes y después.