API de conversión de documentosBeta pública
Conversión de documentos como infraestructura.
No un conversor al que llamas y cruzas los dedos. Un pipeline de jobs con auditoría, reintentos que nunca duplican trabajo, almacenamiento privado de corta vida y un contrato que se mantiene estable mientras se añaden capacidades.
Disponible ahora en beta pública. Abierto a cualquier workspace.
# Envía un job de conversión
curl -X POST https://api.apidocinfra.com/v1/documents/convert \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: request_123" \
-F "[email protected]" \
-F "output_format=pdf"# La misma petición desde Node o el navegador
const form = new FormData();
form.append("file", new Blob([bytes]), "contract.docx");
form.append("output_format", "pdf");
const response = await fetch("https://api.apidocinfra.com/v1/documents/convert", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.DOCINFRA_API_KEY}`, "Idempotency-Key": "request_123" },
body: form,
});
const job = await response.json(); // { job_id, document_id, status: "queued" }# La misma petición con java.net.http
var boundary = "docinfra-" + UUID.randomUUID();
var body = MultipartBody.of(boundary, Map.of("output_format", "pdf"), Path.of("contract.docx"));
var request = HttpRequest.newBuilder(URI.create("https://api.apidocinfra.com/v1/documents/convert"))
.header("Authorization", "Bearer " + System.getenv("DOCINFRA_API_KEY"))
.header("Idempotency-Key", "request_123")
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(body)
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
// 202 {"job_id": "...", "document_id": "...", "status": "queued"}# La misma petición con urllib (solo biblioteca estándar)
import os
import urllib.request
import uuid
boundary = f"docinfra-{uuid.uuid4()}"
with open("contract.docx", "rb") as f:
file_bytes = f.read()
body = (
f"--{boundary}\r\n"
'Content-Disposition: form-data; name="output_format"\r\n\r\n'
"pdf\r\n"
f"--{boundary}\r\n"
'Content-Disposition: form-data; name="file"; filename="contract.docx"\r\n'
"Content-Type: application/octet-stream\r\n\r\n"
).encode() + file_bytes + f"\r\n--{boundary}--\r\n".encode()
request = urllib.request.Request(
"https://api.apidocinfra.com/v1/documents/convert",
data=body,
headers={
"Authorization": "Bearer " + os.environ["DOCINFRA_API_KEY"],
"Idempotency-Key": "request_123",
"Content-Type": f"multipart/form-data; boundary={boundary}",
},
)
with urllib.request.urlopen(request) as response:
job = response.read() # {"job_id": "...", "document_id": "...", "status": "queued"}# 202 Accepted
{
"job_id": "job_01J9Z3F8Q6W2XK4B7C9D0E1F2G",
"document_id": "doc_01J9Z3F8Q5M8N3P4R5S6T7V8W9",
"status": "queued",
"created_at": "2026-09-23T15:58:46Z"
}# Consulta el job y descarga el resultado
GET /v1/jobs/job_01J9Z3F8Q6W2XK4B7C9D0E1F2G
Authorization: Bearer $API_KEY
{
"job_id": "job_01J9Z3F8Q6W2XK4B7C9D0E1F2G",
"status": "completed",
"document_id": "doc_01J9Z3F8Q5M8N3P4R5S6T7V8W9",
"created_at": "2026-09-23T15:58:46Z",
"completed_at": "2026-09-23T15:58:50Z",
"download_url": "https://…/processed/…?X-Amz-Expires=300&X-Amz-Signature=…",
"download_url_expires_at": "2026-09-23T16:03:52Z"
}Endpoints y campos reales del contrato de la API. Sustituye la key y el archivo.
Qué la hace infraestructura
Jobs, no peticiones
Cada conversión es un job que puedes consultar, al que puedes suscribirte y que encuentras después por id. Nada pesado corre dentro de la petición HTTP.
Escrituras idempotentes
Repetir una petición con la misma Idempotency-Key devuelve el mismo job. Reintentar es gratis y seguro.
Aislamiento por defecto
Los motores corren en contenedores sin salida a la red; los archivos se analizan antes de abrirse.
Auditoría de solo inserción
Recibido, analizado, convertido, descargado, borrado: cada paso con cuenta, hora y resultado.
Medido por workspace
GET /v1/usage te dice qué contó este mes, y solo cuenta el trabajo correcto.
Una API para lo que viene
AI Rewrite ya funciona sobre los mismos jobs; herramientas PDF, firmas y extracción lo harán también.
Una conversión, paso a paso
- 1
Tu aplicación sube el archivo con una API key y una Idempotency-Key; la API valida el tipo por el contenido y guarda el original.
- 2
Un worker reclama el job, lo analiza, lo convierte y guarda el resultado; cada paso deja una entrada de auditoría.
- 3
Tu aplicación consulta el job o recibe un webhook firmado, descarga el resultado por un enlace de corta vida, y los archivos se borran a las 24 horas.
Preguntas
- ¿Qué puedo convertir hoy?
- DOCX y HTML a PDF, en beta pública. La hoja de ruta incluye XLSX, PPTX, imágenes, PDF/A y herramientas PDF.
- ¿Cómo gestionan los fallos?
- Los errores transitorios se reintentan con espera exponencial; los permanentes terminan el job con un código estable y un mensaje fijo, nunca la salida del motor.
- ¿Puedo ejecutarlo en mi propia nube?
- Los despliegues privados están contemplados en el diseño y en la hoja de ruta. Hoy el servicio funciona como beta pública gestionada.