Documentación
API de Documentemplate
Genera cientos de documentos desde otro programa: envías una hoja de cálculo, la API pone el lote en cola y descargas un ZIP con los PDF.
Cómo funciona
Generar cientos de documentos lleva su tiempo, así que la API no te deja esperando con la conexión abierta: envías la hoja, el lote entra en cola y tu programa pregunta hasta que termina.
- Enviar la hoja
Un POST con el id de la plantilla y un Excel o CSV. Responde enseguida con 202 y el id del lote.
- Esperar
Un GET del lote con wait=25: la petición aguanta hasta 25 segundos y contesta en cuanto cambia. Repítela hasta que el estado sea done o failed.
- Descargar
Con el estado done, descarga el ZIP: un PDF por fila y un informe con lo que pasó en cada una.
El endpoint
Una sola versión, v1, con un único recurso: el lote. Usa las mismas plantillas, el mismo emparejamiento de columnas y las mismas cuotas que la pantalla Lotes. Todas las peticiones llevan la cabecera Authorization: Bearer con tu token.
POST https://documentemplate.com/api/v1/batch
| Campo | Qué hace |
|---|---|
templateIdobligatorio | El id de la plantilla, que tiene que estar publicada. Lo ves en la dirección al abrirla (/templates/ID). |
fileobligatorio | La hoja de cálculo: .xlsx o .csv de hasta 10 MB. La primera fila son los títulos de columna y cada fila siguiente es un documento. |
mapping | Qué columna rellena cada dato, en JSON: {"cliente": "Nombre"}. Vale el título de la columna o su posición (desde 0). Sin él se empareja por los títulos, como propone la aplicación. |
nameColumn | Columna que da nombre a cada fichero (su título o su posición). Sin ella, la que parece un nombre o, si no hay, el número de fila. |
output | FILES (un PDF por documento, por defecto) o MERGED (un único PDF con todos). |
format | PDF, que por ahora es el único formato de descarga. |
Seguimiento y resultado
GET /v1/batch/:id | El estado del lote: en cola, generándose, terminado o fallido, con su progreso y lo ocurrido en cada fila. |
GET /v1/batch/:id?wait=25 | Lo mismo, pero esperando hasta ese número de segundos (máximo 25) a que el lote termine. Es la forma recomendada de esperar. |
GET /v1/batch/:id/result | El ZIP con los documentos y el informe-del-lote.csv. Se conserva 7 días desde que termina. |
Ejemplos
Enviar la hoja
curl -X POST https://documentemplate.com/api/v1/batch \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-F templateId=TEMPLATE_ID \
-F file=@customers.xlsxEsperar
curl "https://documentemplate.com/api/v1/batch/BATCH_ID?wait=25" \
-H "Authorization: Bearer <YOUR_TOKEN>"Descargar
curl -o documents.zip https://documentemplate.com/api/v1/batch/BATCH_ID/result \
-H "Authorization: Bearer <YOUR_TOKEN>"Todo junto
const API = 'https://documentemplate.com/api';
const headers = { Authorization: 'Bearer <YOUR_TOKEN>' };
// 1. Send the sheet: the batch is queued and the answer comes right away (202).
const form = new FormData();
form.append('templateId', 'TEMPLATE_ID');
form.append('file', new Blob([await readFile('customers.xlsx')]), 'customers.xlsx');
let batch = await (await fetch(`${API}/v1/batch`, { method: 'POST', headers, body: form })).json();
// 2. Wait: each request holds for up to 25 s and answers as soon as the state changes.
while (batch.state === 'queued' || batch.state === 'running') {
batch = await (await fetch(`${API}/v1/batch/${batch.id}?wait=25`, { headers })).json();
}
if (batch.state === 'failed') throw new Error(batch.error);
// 3. Download the ZIP with the documents.
const zip = await fetch(`${API}/v1/batch/${batch.id}/result`, { headers });
await writeFile('documents.zip', Buffer.from(await zip.arrayBuffer()));Cuotas, errores y versiones
Las cuotas de tu plan se comprueban antes de empezar: si el lote no cabe, recibes un error y no se crea nada ni se gasta nada de tu cuota.
| Código | Qué hace |
|---|---|
202 | Lote aceptado y en cola. La respuesta lleva su id y la dirección donde preguntar. |
400 | Petición mal formada: falta la plantilla o la hoja, una columna no existe, la plantilla no está publicada o la hoja no se puede leer. |
401 | Falta el token, es incorrecto o se ha regenerado o revocado. |
403 | Tu plan no permite lotes o el lote no cabe en tu cuota: demasiadas filas, demasiados documentos guardados o PDF del mes. El mensaje dice cuál. |
404 | El lote no existe o es de otra cuenta. |
429 | Demasiadas peticiones. Espera un momento y vuelve a intentarlo. |
La versión va en la dirección (v1). Dentro de una versión no se quitan ni se renombran campos: un cambio incompatible saldría como v2 y la v1 seguiría funcionando durante un tiempo.
Empieza en un minuto
Crea tu cuenta y genera tu token en la sección API. La generación en lote es del plan Pro.