Paso 1 del patrón 2-step. Valida mime_type + size_bytes + cuota del business, reserva una fila pending en business_files y devuelve un signed URL con TTL de 5 minutos.
Declara la metadata del archivo y recibe el signed URL.
El cliente sube el binario directo a Storage. El server nunca ve el binario. El Content-Type del PUT debe estar en el catálogo permitido del bucket (si no, Storage responde 400). En /confirm el server lee los magic bytes del blob ya subido y los compara contra el mime_type declarado en el paso 1 (persistido en DB): si los magic bytes no corresponden a ese mime_type, la confirmación falla con MIME_MISMATCH.
curl:
curl -X PUT "<upload_url del paso 1>" \
-H "Content-Type: application/pdf" \
--data-binary "@./invoice.pdf"
JavaScript (Node 20+ / browser):
await fetch(uploadUrl, {
method: 'PUT',
headers: { 'Content-Type': 'application/pdf' },
body: file, // File object del input o ReadStream
})
n8n: nodo HTTP Request con method PUT, URL del paso 1, Body Type “Binary”, field del nodo “Read Binary File” anterior.
Tras completar el PUT, llama a /files/confirm con el file_uuid para validar el binario y recibir un signed URL de descarga usable en mensajes.
La metadata debe declararse antes de subir. Si la herramienta no la expone:
file.type y file.size vienen gratis en un objeto File.fs.statSync(path).size para bytes; mime-types package para el MIME.stat -c%s file (Linux) / stat -f%z file (macOS) / (Get-Item file).Length (PowerShell) para bytes. file --mime-type -b file para MIME.binary.data.mimeType y binary.data.fileSize.Documentation Index
Fetch the complete documentation index at: https://docs.1to1ai.com/llms.txt
Use this file to discover all available pages before exploring further.
API token emitido desde Settings → API Token del dashboard 1TO1 AI. Enviar en header Authorization: Bearer sk_1to1_...
Slug del business, case-insensitive. Debe coincidir con el business del token.
"acme"
Nombre original del archivo. Se preserva para mostrar al receptor final.
1 - 255"invoice.pdf"
MIME type del archivo. Stickers (image/webp) no se soportan en la API v1 — WhatsApp los maneja como tipo de mensaje aparte.
image/jpeg, image/png, video/mp4, video/3gpp, audio/ogg, application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-powerpoint, application/vnd.openxmlformats-officedocument.presentationml.presentation, text/plain "application/pdf"
Tamaño declarado en bytes. Se re-valida en /confirm.
1 <= x <= 104857600524288
Upload URL emitido. Continúa con PUT a upload_url y luego POST /files/confirm.
UUID generado por el server. Se usa en /confirm y al adjuntar en mensajes.
"550e8400-e29b-41d4-a716-446655440000"
Signed URL para hacer PUT con el binario directo a Supabase Storage. Expira en 5 minutos.
Token firmado opcional si el cliente usa el SDK de Supabase en vez de un PUT raw.
Path interno en el bucket. Informativo — el cliente solo debe usar upload_url.
Instante (UTC) en que upload_url deja de ser válido.
"2026-04-19T12:05:00.000Z"