Esta documentación está en fase de desarrollo y puede contener errores.

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.

EndpointSaldo máximoReposiciónPeriodo
WriteOperations30510 s
Reports30510 s
DynamicDocuments30510 s
Whoami601010 s
Herramientas (AEAT / VIES)10210 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ámetroTipoObligatorioDescripción
idUUIDID del informe
pageintNoNúmero de página. Por defecto 1
resultsPerPageintNoResultados por página. Por defecto 10
withFilesboolNoIncluir URLs de archivos adjuntos. Por defecto false
safeColumnsNameboolNoUsar 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ámetroTipoObligatorioDescripción
idUUIDID 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ámetroTipoObligatorioDescripción
sectionIdUUIDID de la sección donde escribir
FieldPrimarystringCampo clave que identifica registros. Normalmente id
scriptsboolNoEjecutar los scripts de servidor de la sección. Por defecto false

Headers:

Authorization: Bearer <token>
Content-Type: application/json

Crear, editar y eliminar

La operación la decide el valor del campo id:

Valor de idOperaciónDescripción
"" (cadena vacía)CrearSe crea un registro nuevo. Dinaup genera el ID
UUID existenteEditarSe 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_XXXXXXXXX con 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ámetroTipoObligatorioDescripción
nifstringNIF o CIF a validar
nombrestringNombre 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ámetroTipoObligatorioDescripción
nifstringNIF 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ódigoSignificado
200Operación correcta
400Parámetros o cuerpo inválidos (falta sectionId, FieldPrimary, GUID mal formado)
401Token inválido o ausente
403El usuario de la clave no tiene permiso para esta operación
404Recurso no encontrado (informe, documento, sección)
429Superado el límite de tasa. Reintenta pasados los segundos de Retry-After
500Error interno del servidor

Playground

Prueba todos los endpoints y copia el Token Bearer de cada clave API, sin herramientas externas:

Abrir el Playground de Webhooks

On this page