Documentación de la API
Documentación oficial de la API de Prisma. Esta guía describe los endpoints, el flujo de trabajo y ejemplos de uso para integrar los servicios de extracción y digitalización de documentos en su aplicación.
Tabla de contenidos
- Introducción
- Autenticación
- Conceptos Clave
- Flujo Principal
- Referencia de Endpoints
- Ejemplos Completos
- Manejo de Errores
Introducción
Prisma es una plataforma de IA que permite extraer, procesar y digitalizar documentos de forma automatizada. Con esta API, puedes:
- Crear templates (plantillas de extracción) que definen qué campos extraer de tus documentos
- Crear jobs (trabajos de procesamiento) que procesan múltiples documentos en paralelo
- Subir documentos para que sean procesados según la plantilla especificada
- Ejecutar jobs para iniciar el procesamiento
- Obtener resultados de forma estructurada (JSON, CSV, Excel, Parquet)
- Gestionar datasets para organizar tus documentos y trabajos
Para obtener documentación más técnica y detallada, consulta nuestras interfaces interactivas: - Swagger UI - Interfaz interactiva de Swagger - ReDoc - Interfaz de ReDoc
Autenticación
Todos los endpoints de la API requieren autenticación mediante Bearer Token.
Obtener tu Token
- Inicia sesión en prisma.dekano.es
- Accede a tu perfil o sección de API Keys
- Genera un nuevo token (copiar el valor completo)
- Guarda el token en un lugar seguro
Enviar el Token
El token debe incluirse en el header Authorization de todas las solicitudes:
Authorization: Bearer <tu_token_aqui>
Permisos del Token: El token hereda los permisos de tu usuario. Si tu usuario tiene acceso a ciertos templates o datasets, el token también tendrá ese acceso.
Conceptos Clave
Templates (Plantillas)
Un template define la estructura de datos que deseas extraer de tus documentos. Consiste en:
- Nombre: Identificador legible del template
- Campos: Lista de campos a extraer (nombre, tipo, descripción)
- Visibilidad: Privado (solo tu usuario) o público (accesible por toda la empresa)
Los templates se crean una única vez y se reutilizan en múltiples jobs. Pueden tener múltiples versiones: cuando actualizas un template, se crea una nueva versión automáticamente sin afectar los jobs anteriores.
Nota: Puedes crear templates directamente desde la interfaz web de Prisma o mediante esta API. La recomendación es crear los templates que necesites una sola vez y luego reutilizarlos en todos tus jobs.
Jobs (Trabajos)
Un job es una tarea de procesamiento que:
- Usa un template específico para extraer datos
- Procesa múltiples documentos (a través de un dataset)
- Genera resultados que puedes consultar y exportar
Estados de un job:
- PENDING: Pendiente de ejecución
- RUNNING: En procesamiento
- COMPLETED: Finalizado (verifica los resultados)
- FAILED: Error durante el procesamiento
Datasets
Un dataset es una colección de archivos asociados a un job. Se genera automáticamente cuando:
- Creas un job
- Subes documentos al job
Los datasets permiten: - Organizar múltiples archivos para procesar juntos - Consultar información sobre los archivos subidos (tamaño, tipo MIME, número de páginas) - Descargar archivos procesados
Flujo Principal
El flujo típico para procesar documentos es:
1. Crear o Seleccionar un Template
Si ya tienes un template creado, puedes saltarte este paso. Si no, crea uno (solo necesitas hacerlo una vez):
Ver endpoint de crear template
2. Crear un Job
Crea un nuevo trabajo que usará tu template:
3. Subir Documentos
Sube todos los archivos PDF que deseas procesar. Debes subir todos los documentos antes de ejecutar el job para procesarlos juntos:
Ver endpoint de subir documentos
4. Ejecutar el Job
Inicia el procesamiento de todos los documentos que subiste:
5. Consultar Resultados
Una vez completado, obtén los resultados extraídos:
Ver endpoint de obtener resultados
6. Exportar Resultados (Opcional)
Exporta los datos en tu formato preferido (CSV, JSON, Excel, Parquet):
Ver endpoint de exportar resultados
Referencia de Endpoints
Templates
Listar Templates
Obtén todos los templates disponibles para tu usuario/empresa.
Parámetros de consulta:
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
page |
int | 1 | Número de página |
page_size |
int | 20 | Elementos por página |
Ejemplo:
export TOKEN="YOUR_TOKEN"
curl -X GET "https://api.prisma.dekano.es/public/api/v1/templates/list?page=1&page_size=10" \
-H "Authorization: Bearer $TOKEN"
import requests
TOKEN = "YOUR_TOKEN"
headers = {
"Authorization": f"Bearer {TOKEN}"
}
response = requests.get(
"https://api.prisma.dekano.es/public/api/v1/templates/list",
headers=headers,
params={"page": 1, "page_size": 10}
)
templates = response.json()
print(templates)
const TOKEN = "YOUR_TOKEN";
const headers = {
"Authorization": `Bearer ${TOKEN}`
};
fetch("https://api.prisma.dekano.es/public/api/v1/templates/list?page=1&page_size=10", { headers })
.then(r => r.json())
.then(data => console.log(data));
Crear Template
Crea un nuevo template con los campos que necesitas extraer.
Body (JSON):
{
"name": "Factura",
"fields": [
{
"name": "numero_factura",
"field_type": "string",
"description": "Número único de la factura"
},
{
"name": "fecha_emision",
"field_type": "date",
"description": "Fecha de emisión"
},
{
"name": "importe_total",
"field_type": "number",
"description": "Importe total de la factura"
}
],
"is_public": false
}
Tipos de campo disponibles: string, number, date, boolean, json
Ejemplo:
export TOKEN="YOUR_TOKEN"
curl -X POST "https://api.prisma.dekano.es/public/api/v1/templates/create" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Factura",
"fields": [
{
"name": "numero_factura",
"field_type": "string",
"description": "Número único de la factura"
},
{
"name": "fecha_emision",
"field_type": "date",
"description": "Fecha de emisión"
}
],
"is_public": false
}'
import requests
TOKEN = "YOUR_TOKEN"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json"
}
payload = {
"name": "Factura",
"fields": [
{
"name": "numero_factura",
"field_type": "string",
"description": "Número único de la factura"
},
{
"name": "fecha_emision",
"field_type": "date",
"description": "Fecha de emisión"
}
],
"is_public": False
}
response = requests.post(
"https://api.prisma.dekano.es/public/api/v1/templates/create",
headers=headers,
json=payload
)
template = response.json()
print(f"Template creado: {template['id']}")
const TOKEN = "YOUR_TOKEN";
const headers = {
"Authorization": `Bearer ${TOKEN}`,
"Content-Type": "application/json"
};
const payload = {
name: "Factura",
fields: [
{ name: "numero_factura", field_type: "string", description: "Número único de la factura" },
{ name: "fecha_emision", field_type: "date", description: "Fecha de emisión" }
],
is_public: false
};
fetch("https://api.prisma.dekano.es/public/api/v1/templates/create", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify(payload)
})
.then(r => r.json())
.then(data => console.log(`Template creado: ${data.id}`));
Obtener Template
Obtén los detalles de la última versión de un template.
Parámetros:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
template_id |
string | ✓ | ID del template |
Ejemplo:
export TOKEN="YOUR_TOKEN"
export TEMPLATE_ID="tmpl_123abc"
curl -X GET "https://api.prisma.dekano.es/public/api/v1/templates/$TEMPLATE_ID" \
-H "Authorization: Bearer $TOKEN"
import requests
TEMPLATE_ID = "tmpl_123abc"
TOKEN = "YOUR_TOKEN"
headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.get(
f"https://api.prisma.dekano.es/public/api/v1/templates/{TEMPLATE_ID}",
headers=headers
)
template = response.json()
print(template)
const TOKEN = "YOUR_TOKEN";
const TEMPLATE_ID = "tmpl_123abc";
fetch(`https://api.prisma.dekano.es/public/api/v1/templates/${TEMPLATE_ID}`, {
headers: { "Authorization": `Bearer ${TOKEN}` }
})
.then(r => r.json())
.then(data => console.log(data));
Actualizar Template
Modifica el nombre, campos o visibilidad de un template. Esto crea una nueva versión automáticamente.
Body (JSON): (todos los campos son opcionales)
{
"name": "Factura Actualizada",
"fields": [...],
"is_public": true
}
Ejemplo:
export TOKEN="YOUR_TOKEN"
export TEMPLATE_ID="tmpl_123abc"
curl -X PATCH "https://api.prisma.dekano.es/public/api/v1/templates/$TEMPLATE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Factura Actualizada"}'
import requests
TEMPLATE_ID = "tmpl_123abc"
TOKEN = "YOUR_TOKEN"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json"
}
response = requests.patch(
f"https://api.prisma.dekano.es/public/api/v1/templates/{TEMPLATE_ID}",
headers=headers,
json={"name": "Factura Actualizada"}
)
updated = response.json()
print(updated)
const TOKEN = "YOUR_TOKEN";
const TEMPLATE_ID = "tmpl_123abc";
fetch(`https://api.prisma.dekano.es/public/api/v1/templates/${TEMPLATE_ID}`, {
method: "PATCH",
headers: {
"Authorization": `Bearer ${TOKEN}`,
"Content-Type": "application/json"
},
body: JSON.stringify({ name: "Factura Actualizada" })
})
.then(r => r.json())
.then(data => console.log(data));
Eliminar Template
Elimina un template. Las versiones previas se mantienen como histórico.
Parámetros de URL:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
template_id |
string | ✓ | ID del template a eliminar |
Ejemplo:
export TOKEN="YOUR_TOKEN"
export TEMPLATE_ID="tmpl_123abc"
curl -X DELETE "https://api.prisma.dekano.es/public/api/v1/templates/$TEMPLATE_ID" \
-H "Authorization: Bearer $TOKEN"
import requests
TEMPLATE_ID = "tmpl_123abc"
TOKEN = "YOUR_TOKEN"
headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.delete(
f"https://api.prisma.dekano.es/public/api/v1/templates/{TEMPLATE_ID}",
headers=headers
)
if response.status_code == 204:
print("Template eliminado correctamente")
const TOKEN = "YOUR_TOKEN";
const TEMPLATE_ID = "tmpl_123abc";
fetch(`https://api.prisma.dekano.es/public/api/v1/templates/${TEMPLATE_ID}`, {
method: "DELETE",
headers: { "Authorization": `Bearer ${TOKEN}` }
})
.then(r => {
if (r.status === 204) console.log('Template eliminado correctamente');
else return r.json();
})
.then(data => { if (data) console.log(data); });
Listar Versiones de Template
Obtén el histórico de todas las versiones de un template.
Parámetros:
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
template_id |
string | - | ID del template (en URL) |
page |
int | 1 | Número de página |
page_size |
int | 20 | Elementos por página |
Ejemplo:
export TOKEN="YOUR_TOKEN"
export TEMPLATE_ID="tmpl_123abc"
curl -X GET "https://api.prisma.dekano.es/public/api/v1/templates/listTemplateVersions/$TEMPLATE_ID" \
-H "Authorization: Bearer $TOKEN"
import requests
TEMPLATE_ID = "tmpl_123abc"
TOKEN = "YOUR_TOKEN"
headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.get(
f"https://api.prisma.dekano.es/public/api/v1/templates/listTemplateVersions/{TEMPLATE_ID}",
headers=headers
)
versions = response.json()
print(f"Total versiones: {versions['pagination']['total']}")
const TOKEN = "YOUR_TOKEN";
const TEMPLATE_ID = "tmpl_123abc";
fetch(`https://api.prisma.dekano.es/public/api/v1/templates/listTemplateVersions/${TEMPLATE_ID}`, {
headers: { "Authorization": `Bearer ${TOKEN}` }
})
.then(r => r.json())
.then(data => console.log(`Total versiones: ${data.pagination.total}`));
Jobs
Crear Job
Crea un nuevo trabajo de procesamiento.
Body (JSON):
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
template_id |
string | ✓ | ID del template a usar |
template_version_number |
int | ✗ | Versión del template (usa la última si no se especifica) |
name |
string | ✗ | Nombre descriptivo del job |
dataset_name |
string | ✗ | Nombre para el dataset asociado |
Ejemplo:
export TOKEN="YOUR_TOKEN"
export TEMPLATE_ID="tmpl_123abc"
curl -X POST "https://api.prisma.dekano.es/public/api/v1/jobs/create" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"template_id\": \"$TEMPLATE_ID\", \"name\": \"Procesamiento Facturas Lote 1\", \"dataset_name\": \"Facturas Noviembre 2025\" }"
import requests
TEMPLATE_ID = "tmpl_123abc"
TOKEN = "YOUR_TOKEN"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json"
}
payload = {
"template_id": TEMPLATE_ID,
"name": "Procesamiento Facturas Lote 1",
"dataset_name": "Facturas Noviembre 2025"
}
response = requests.post(
"https://api.prisma.dekano.es/public/api/v1/jobs/create",
headers=headers,
json=payload
)
job = response.json()
job_id = job["id"]
print(f"Job creado: {job_id}")
const TOKEN = "YOUR_TOKEN";
const TEMPLATE_ID = "tmpl_123abc";
const headers = { "Authorization": `Bearer ${TOKEN}`, "Content-Type": "application/json" };
const payload = {
template_id: TEMPLATE_ID,
name: "Procesamiento Facturas Lote 1",
dataset_name: "Facturas Noviembre 2025"
};
fetch("https://api.prisma.dekano.es/public/api/v1/jobs/create", {
method: "POST",
headers,
body: JSON.stringify(payload)
})
.then(r => r.json())
.then(data => console.log(`Job creado: ${data.id}`));
Subir Documentos
Añade archivos PDF al job para procesamiento. Todos los documentos deben subirse antes de ejecutar el job.
Parámetros de URL:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
job_id |
string | ✓ | ID del job |
Body (multipart/form-data):
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
upload_file |
file | ✓ | Archivo PDF a procesar |
Ejemplo:
export TOKEN="YOUR_TOKEN"
export JOB_ID="job_my_job_id"
curl -X POST "https://api.prisma.dekano.es/public/api/v1/jobs/$JOB_ID/add_document" \
-H "Authorization: Bearer $TOKEN" \
-F "upload_file=@/path/to/factura.pdf"
import requests
JOB_ID = "job_my_job_id"
TOKEN = "YOUR_TOKEN"
headers = {"Authorization": f"Bearer {TOKEN}"}
with open("/path/to/factura.pdf", "rb") as f:
files = {"upload_file": f}
response = requests.post(
f"https://api.prisma.dekano.es/public/api/v1/jobs/{JOB_ID}/add_document",
headers=headers,
files=files
)
if response.status_code == 204:
print("Documento subido correctamente")
const TOKEN = "YOUR_TOKEN";
const JOB_ID = "job_my_job_id";
const formData = new FormData();
// Append a File object from a file input in the browser
// formData.append('upload_file', fileInput.files[0]);
fetch(`https://api.prisma.dekano.es/public/api/v1/jobs/${JOB_ID}/add_document`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${TOKEN}` },
body: formData
})
.then(r => {
if (r.status === 204) console.log('Documento subido correctamente');
else return r.json();
})
.then(data => { if (data) console.log(data); });
Importante: Debes subir todos los documentos PDF que deseas procesar antes de ejecutar el job. Repite este paso para cada archivo. Una vez que ejecutes el job, no podrás añadir más documentos a ese trabajo.
Ejecutar Job
Inicia el procesamiento de todos los documentos subidos al job.
Parámetros de URL:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
job_id |
string | ✓ | ID del job a ejecutar |
Ejemplo:
export TOKEN="YOUR_TOKEN"
export JOB_ID="job_my_job_id"
curl -X POST "https://api.prisma.dekano.es/public/api/v1/jobs/$JOB_ID/run" \
-H "Authorization: Bearer $TOKEN"
import requests
TOKEN = "YOUR_TOKEN"
JOB_ID = "job_my_job_id"
headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.post(
f"https://api.prisma.dekano.es/public/api/v1/jobs/{JOB_ID}/run",
headers=headers
)
if response.status_code == 204:
print("Job iniciado correctamente")
const TOKEN = "YOUR_TOKEN";
const JOB_ID = "job_my_job_id";
fetch(`https://api.prisma.dekano.es/public/api/v1/jobs/${JOB_ID}/run`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${TOKEN}` }
})
.then(r => { if (r.status === 204) console.log('Job iniciado correctamente'); else return r.json(); })
.then(data => { if (data) console.log(data); });
Listar Jobs
Obtén todos los jobs con opciones de filtrado y paginación.
Parámetros de consulta:
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
page |
int | 1 | Número de página |
page_size |
int | 20 | Elementos por página |
template_id |
string | - | Filtrar por template |
dataset_id |
string | - | Filtrar por dataset |
status |
string | - | Filtrar por estado (PENDING, RUNNING, COMPLETED, FAILED) |
Ejemplo:
export TOKEN="YOUR_TOKEN"
curl -X GET "https://api.prisma.dekano.es/public/api/v1/jobs/list?page=1&page_size=10&status=COMPLETED" \
-H "Authorization: Bearer $TOKEN"
import requests
TOKEN = "YOUR_TOKEN"
headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.get(
"https://api.prisma.dekano.es/public/api/v1/jobs/list",
headers=headers,
params={
"page": 1,
"page_size": 10,
"status": "COMPLETED"
}
)
jobs = response.json()
print(f"Total jobs: {jobs['pagination']['total']}")
const TOKEN = "YOUR_TOKEN";
fetch("https://api.prisma.dekano.es/public/api/v1/jobs/list?page=1&page_size=10&status=COMPLETED", {
headers: { 'Authorization': `Bearer ${TOKEN}` }
})
.then(r => r.json())
.then(data => console.log(`Total jobs: ${data.pagination.total}`));
Obtener Job
Obtén los detalles de un job específico.
Parámetros de URL:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
job_id |
string | ✓ | ID del job |
Ejemplo:
export TOKEN="YOUR_TOKEN"
export JOB_ID="job_my_job_id"
curl -X GET "https://api.prisma.dekano.es/public/api/v1/jobs/$JOB_ID" \
-H "Authorization: Bearer $TOKEN"
import requests
JOB_ID = "job_my_job_id"
TOKEN = "YOUR_TOKEN"
headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.get(
f"https://api.prisma.dekano.es/public/api/v1/jobs/{JOB_ID}",
headers=headers
)
job = response.json()
print(f"Estado del job: {job['status']}")
print(f"Documentos procesados: {job['processed_documents']}/{job['total_documents']}")
const TOKEN = "YOUR_TOKEN";
const JOB_ID = "job_my_job_id";
fetch(`https://api.prisma.dekano.es/public/api/v1/jobs/${JOB_ID}`, {
headers: { 'Authorization': `Bearer ${TOKEN}` }
})
.then(r => r.json())
.then(job => {
console.log(`Estado del job: ${job.status}`);
console.log(`Documentos procesados: ${job.processed_documents}/${job.total_documents}`);
});
Obtener Resultados del Job
Obtén los datos extraídos del job.
Parámetros:
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
job_id |
string | - | ID del job (en URL) |
page |
int | 1 | Número de página |
page_size |
int | 20 | Elementos por página |
Ejemplo:
export TOKEN="YOUR_TOKEN"
export JOB_ID="job_my_job_id"
curl -X GET "https://api.prisma.dekano.es/public/api/v1/jobs/$JOB_ID/result?page=1&page_size=50" \
-H "Authorization: Bearer $TOKEN"
import requests
JOB_ID = "job_my_job_id"
TOKEN = "YOUR_TOKEN"
headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.get(
f"https://api.prisma.dekano.es/public/api/v1/jobs/{JOB_ID}/result",
headers=headers,
params={"page": 1, "page_size": 50}
)
results = response.json()
for result in results["data"]:
print(result) # Diccionario con los campos extraídos
const TOKEN = "YOUR_TOKEN";
const JOB_ID = "job_my_job_id";
fetch(`https://api.prisma.dekano.es/public/api/v1/jobs/${JOB_ID}/result?page=1&page_size=50`, {
headers: { 'Authorization': `Bearer ${TOKEN}` }
})
.then(r => r.json())
.then(data => {
data.data.forEach(result => console.log(result));
});
Exportar Resultados
Descarga los resultados en tu formato preferido.
Parámetros de URL:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
job_id |
string | ✓ | ID del job |
Body (JSON):
{
"format": "CSV"
}
Formatos disponibles: CSV, JSON, EXCEL, PARQUET
Ejemplo:
export TOKEN="YOUR_TOKEN"
export JOB_ID="job_my_job_id"
curl -X POST "https://api.prisma.dekano.es/public/api/v1/jobs/$JOB_ID/result/export" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"format": "CSV"}' \
-o resultados.csv
import requests
JOB_ID = "job_my_job_id"
TOKEN = "YOUR_TOKEN"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json"
}
response = requests.post(
f"https://api.prisma.dekano.es/public/api/v1/jobs/{JOB_ID}/result/export",
headers=headers,
json={"format": "CSV"}
)
# Guardar archivo
with open("resultados.csv", "wb") as f:
f.write(response.content)
print("Archivo exportado: resultados.csv")
const TOKEN = "YOUR_TOKEN";
const JOB_ID = "job_my_job_id";
fetch(`https://api.prisma.dekano.es/public/api/v1/jobs/${JOB_ID}/result/export`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${TOKEN}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ format: 'CSV' })
})
.then(r => r.blob())
.then(blob => {
// In browser: create download link
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'resultados.csv';
a.click();
});
Datasets
Obtener Dataset
Obtén información sobre un dataset (colección de archivos de un job).
Parámetros de URL:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
dataset_id |
string | ✓ | ID del dataset |
Ejemplo:
export TOKEN="YOUR_TOKEN"
export DATASET_ID="ds_123"
curl -X GET "https://api.prisma.dekano.es/public/api/v1/datasets/$DATASET_ID" \
-H "Authorization: Bearer $TOKEN"
import requests
DATASET_ID = "ds_123"
TOKEN = "YOUR_TOKEN"
headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.get(
f"https://api.prisma.dekano.es/public/api/v1/datasets/{DATASET_ID}",
headers=headers
)
dataset = response.json()
print(f"Número de documentos: {dataset['number_of_documents']}")
print(f"Páginas totales: {dataset['number_of_pages']}")
const TOKEN = "YOUR_TOKEN";
const DATASET_ID = "ds_123";
fetch(`https://api.prisma.dekano.es/public/api/v1/datasets/${DATASET_ID}`, {
headers: { 'Authorization': `Bearer ${TOKEN}` }
})
.then(r => r.json())
.then(dataset => {
console.log(`Número de documentos: ${dataset.number_of_documents}`);
console.log(`Páginas totales: ${dataset.number_of_pages}`);
});
Listar Archivos del Dataset
Obtén todos los archivos del dataset.
Parámetros:
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
dataset_id |
string | - | ID del dataset (en URL) |
page |
int | 1 | Número de página |
page_size |
int | 20 | Elementos por página |
Ejemplo:
export TOKEN="YOUR_TOKEN"
export DATASET_ID="ds_123"
curl -X GET "https://api.prisma.dekano.es/public/api/v1/datasets/$DATASET_ID/files" \
-H "Authorization: Bearer $TOKEN"
import requests
DATASET_ID = "ds_123"
TOKEN = "YOUR_TOKEN"
headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.get(
f"https://api.prisma.dekano.es/public/api/v1/datasets/{DATASET_ID}/files",
headers=headers
)
files = response.json()
for file in files["data"]:
print(f"{file['file_name']} - {file['size_kb']} KB - {file['number_of_pages']} páginas")
const TOKEN = "YOUR_TOKEN";
const DATASET_ID = "ds_123";
fetch(`https://api.prisma.dekano.es/public/api/v1/datasets/${DATASET_ID}/files`, {
headers: { 'Authorization': `Bearer ${TOKEN}` }
})
.then(r => r.json())
.then(files => files.data.forEach(file => console.log(`${file.file_name} - ${file.size_kb} KB - ${file.number_of_pages} páginas`)));
Descargar Archivo del Dataset
Descarga un archivo específico del dataset.
Parámetros de URL:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
dataset_id |
string | ✓ | ID del dataset |
file_id |
string | ✓ | ID del archivo |
Ejemplo:
export TOKEN="YOUR_TOKEN"
export DATASET_ID="ds_123"
export FILE_ID="file_456"
curl -X POST "https://api.prisma.dekano.es/public/api/v1/datasets/$DATASET_ID/files/download/$FILE_ID" \
-H "Authorization: Bearer $TOKEN" \
-o archivo_original.pdf
import requests
DATASET_ID = "ds_123"
FILE_ID = "file_456"
TOKEN = "YOUR_TOKEN"
headers = {"Authorization": f"Bearer {TOKEN}"}
response = requests.post(
f"https://api.prisma.dekano.es/public/api/v1/datasets/{DATASET_ID}/files/download/{FILE_ID}",
headers=headers
)
with open("archivo_original.pdf", "wb") as f:
f.write(response.content)
print("Archivo descargado")
const TOKEN = "YOUR_TOKEN";
const DATASET_ID = "ds_123";
const FILE_ID = "file_456";
fetch(`https://api.prisma.dekano.es/public/api/v1/datasets/${DATASET_ID}/files/download/${FILE_ID}`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${TOKEN}` }
})
.then(r => r.blob())
.then(blob => {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'archivo_original.pdf';
a.click();
});
Ejemplos Completos
Ejemplo 1: Flujo Completo (Crear Template → Job → Procesar)
import requests
import time
BASE_URL = "https://api.prisma.dekano.es/public"
TOKEN = "YOUR_TOKEN"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json"
}
# 1. Crear Template
print("1. Creando template...")
template_payload = {
"name": "Factura",
"fields": [
{"name": "numero_factura", "field_type": "string"},
{"name": "fecha_emision", "field_type": "date"},
{"name": "importe_total", "field_type": "number"}
],
"is_public": False
}
response = requests.post(
f"{BASE_URL}/api/v1/templates/create",
headers=headers,
json=template_payload
)
template_id = response.json()["id"]
print(f"✓ Template creado: {template_id}")
# 2. Crear Job
print("\n2. Creando job...")
job_payload = {
"template_id": template_id,
"name": "Procesamiento Lote 1",
"dataset_name": "Facturas Noviembre 2025"
}
response = requests.post(
f"{BASE_URL}/api/v1/jobs/create",
headers=headers,
json=job_payload
)
job_id = response.json()["id"]
print(f"✓ Job creado: {job_id}")
# 3. Subir documentos
print("\n3. Subiendo documentos...")
with open("factura1.pdf", "rb") as f:
files = {"upload_file": f}
response = requests.post(
f"{BASE_URL}/api/v1/jobs/{job_id}/add_document",
headers={"Authorization": f"Bearer {TOKEN}"},
files=files
)
print("✓ Documento 1 subido")
with open("factura2.pdf", "rb") as f:
files = {"upload_file": f}
response = requests.post(
f"{BASE_URL}/api/v1/jobs/{job_id}/add_document",
headers={"Authorization": f"Bearer {TOKEN}"},
files=files
)
print("✓ Documento 2 subido")
# 4. Ejecutar job
print("\n4. Ejecutando job...")
response = requests.post(
f"{BASE_URL}/api/v1/jobs/{job_id}/run",
headers=headers
)
print("✓ Job iniciado")
# 5. Esperar a que se complete
print("\n5. Esperando resultados...")
max_attempts = 60
attempt = 0
while attempt < max_attempts:
response = requests.get(
f"{BASE_URL}/api/v1/jobs/{job_id}",
headers=headers
)
job_status = response.json()["status"]
if job_status == "COMPLETED":
print(f"✓ Job completado")
break
elif job_status == "FAILED":
print(f"✗ Job fallido")
exit(1)
else:
print(f" Estado: {job_status}...")
time.sleep(2)
attempt += 1
# 6. Obtener resultados
print("\n6. Obteniendo resultados...")
response = requests.get(
f"{BASE_URL}/api/v1/jobs/{job_id}/result",
headers=headers
)
results = response.json()["data"]
print(f"✓ {len(results)} registros extraídos")
for i, result in enumerate(results, 1):
print(f"\n Registro {i}:")
for key, value in result.items():
print(f" {key}: {value}")
# 7. Exportar resultados
print("\n7. Exportando a CSV...")
response = requests.post(
f"{BASE_URL}/api/v1/jobs/{job_id}/result/export",
headers=headers,
json={"format": "CSV"}
)
with open("resultados.csv", "wb") as f:
f.write(response.content)
print("✓ Resultados exportados a resultados.csv")
print("\nProceso completado.")
#!/bin/bash
BASE_URL="https://api.prisma.dekano.es/public"
TOKEN="YOUR_TOKEN"
echo "1. Creando template..."
TEMPLATE_RESPONSE=$(curl -s -X POST "$BASE_URL/api/v1/templates/create" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Factura",
"fields": [
{"name": "numero_factura", "field_type": "string"},
{"name": "fecha_emision", "field_type": "date"},
{"name": "importe_total", "field_type": "number"}
],
"is_public": false
}')
TEMPLATE_ID=$(echo $TEMPLATE_RESPONSE | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
echo "✓ Template creado: $TEMPLATE_ID"
echo ""
echo "2. Creando job..."
JOB_RESPONSE=$(curl -s -X POST "$BASE_URL/api/v1/jobs/create" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"template_id\": \"$TEMPLATE_ID\",
\"name\": \"Procesamiento Lote 1\",
\"dataset_name\": \"Facturas Noviembre 2025\"
}")
JOB_ID=$(echo $JOB_RESPONSE | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
echo "✓ Job creado: $JOB_ID"
echo ""
echo "3. Subiendo documentos..."
curl -s -X POST "$BASE_URL/api/v1/jobs/$JOB_ID/add_document" \
-H "Authorization: Bearer $TOKEN" \
-F "upload_file=@factura1.pdf" > /dev/null
echo "✓ Documento 1 subido"
curl -s -X POST "$BASE_URL/api/v1/jobs/$JOB_ID/add_document" \
-H "Authorization: Bearer $TOKEN" \
-F "upload_file=@factura2.pdf" > /dev/null
echo "✓ Documento 2 subido"
echo ""
echo "4. Ejecutando job..."
curl -s -X POST "$BASE_URL/api/v1/jobs/$JOB_ID/run" \
-H "Authorization: Bearer $TOKEN" > /dev/null
echo "✓ Job iniciado"
echo ""
echo "5. Esperando resultados (esto puede tomar varios minutos)..."
sleep 5
echo ""
echo "6. Obteniendo resultados..."
curl -s -X GET "$BASE_URL/api/v1/jobs/$JOB_ID/result" \
-H "Authorization: Bearer $TOKEN" | jq '.data'
echo ""
echo "7. Exportando a CSV..."
curl -s -X POST "$BASE_URL/api/v1/jobs/$JOB_ID/result/export" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"format": "CSV"}' \
-o resultados.csv
echo "✓ Resultados exportados a resultados.csv"
echo ""
echo "Proceso completado."
// Node.js example (requires: npm install axios form-data)
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
(async () => {
const BASE_URL = 'https://api.prisma.dekano.es/public';
const TOKEN = 'YOUR_TOKEN';
const headers = { Authorization: `Bearer ${TOKEN}` };
// 1. Crear template
const tpl = await axios.post(
`${BASE_URL}/api/v1/templates/create`,
{
name: 'Factura',
fields: [
{ name: 'numero_factura', field_type: 'string' },
{ name: 'fecha_emision', field_type: 'date' },
{ name: 'importe_total', field_type: 'number' }
],
is_public: false
},
{ headers: { ...headers, 'Content-Type': 'application/json' } }
);
const templateId = tpl.data.id;
console.log('✓ Template creado:', templateId);
// 2. Crear job
const jobRes = await axios.post(
`${BASE_URL}/api/v1/jobs/create`,
{ template_id: templateId, name: 'Procesamiento Lote 1', dataset_name: 'Facturas Noviembre 2025' },
{ headers: { ...headers, 'Content-Type': 'application/json' } }
);
const jobId = jobRes.data.id;
console.log('✓ Job creado:', jobId);
// 3. Subir documento (ejemplo con FormData)
const form = new FormData();
form.append('upload_file', fs.createReadStream('factura1.pdf'));
await axios.post(`${BASE_URL}/api/v1/jobs/${jobId}/add_document`, form, { headers: { ...headers, ...form.getHeaders() } });
console.log('✓ Documento subido');
// 4. Ejecutar job
await axios.post(`${BASE_URL}/api/v1/jobs/${jobId}/run`, null, { headers });
console.log('✓ Job iniciado');
// 5. Esperar a que se complete (polling)
let status = 'PENDING';
while (status !== 'COMPLETED' && status !== 'FAILED') {
await new Promise((r) => setTimeout(r, 2000));
const r = await axios.get(`${BASE_URL}/api/v1/jobs/${jobId}`, { headers });
status = r.data.status;
console.log('Estado:', status);
}
if (status === 'FAILED') throw new Error('Job fallido');
// 6. Obtener resultados
const results = await axios.get(`${BASE_URL}/api/v1/jobs/${jobId}/result`, { headers, params: { page: 1, page_size: 50 } });
console.log('Registros extraídos:', results.data.data.length);
// 7. Exportar resultados a CSV y guardar localmente
const exportRes = await axios.post(
`${BASE_URL}/api/v1/jobs/${jobId}/result/export`,
{ format: 'CSV' },
{ headers: { ...headers, 'Content-Type': 'application/json' }, responseType: 'arraybuffer' }
);
fs.writeFileSync('resultados.csv', exportRes.data);
console.log('✓ Resultados exportados a resultados.csv');
})();
Manejo de Errores
La API devuelve códigos de estado HTTP estándar:
| Código | Significado | Ejemplo |
|---|---|---|
| 200 | OK | Solicitud exitosa |
| 201 | Created | Recurso creado exitosamente |
| 204 | No Content | Operación exitosa (sin respuesta) |
| 400 | Bad Request | Parámetros inválidos |
| 401 | Unauthorized | Token ausente o inválido |
| 402 | Payment Required | Suscripción inactiva |
| 404 | Not Found | Recurso no encontrado |
| 409 | Conflict | Violación de integridad única |
| 429 | Too Many Requests | Límite de cuota excedido |
| 500 | Internal Server Error | Error del servidor |
Ejemplo de Respuesta de Error
{
"message": "Invalid template ID",
"detail": "Template not found or you don't have permission to access it"
}
Soporte
Para más información o soporte técnico: - Email: support@dekano.es - Sitio web: prisma.dekano.es - Documentación técnica: Swagger o ReDoc