Enviando arquivos (API & MCP)
- Como enviar uma imagem ou arquivo de forma programática e obter uma referência reutilizável
- O fluxo de upload REST em duas etapas (e a ferramenta MCP de uma etapa)
- Onde usar a referência
{bucket, fullPath}resultante
Muitos recursos do AutoTalk usam mídia — uma imagem de produto para um catálogo do WhatsApp, uma mensagem de mídia, uma foto de perfil. Em vez de hospedar esses arquivos por conta própria, envie-os ao AutoTalk uma vez e obtenha uma referência de armazenamento primária que pode reutilizar em qualquer lugar:
{ "bucket": "autotalk-prod", "fullPath": "companies/<id>/api/images/storage_manual_upload/<id>.png" }
Essa referência {bucket, fullPath} é aceita por send_message, campos de documentos Dynadata e funções como createWhatsappWebEvoProduct (no array images) — veja Onde usar a referência.
REST: o upload em duas etapas
O upload pela API REST é um PUT assinado, para que os bytes vão direto ao armazenamento. Autentique cada chamada com sua x-api-key.
1. Reserve uma URL de upload assinada
curl -X POST https://api.autotalk.io/v1/storage/upload-url \
-H "x-api-key: sk-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mimeType": "image/png",
"fileSize": 41161,
"fileName": "product.png",
"purpose": "whatsapp_catalog_product_image"
}'
A resposta fornece uma uploadUrl de curta duração, os requiredHeaders exatos e um uploadIntentId:
{
"success": true,
"uploadIntentId": "...",
"uploadUrl": "https://storage.autotalk.io/...&X-Amz-Signature=...",
"uploadMode": "signed_put",
"bucket": "autotalk-prod",
"fullPath": "companies/<id>/api/images/whatsapp_catalog_product_image/<id>.png",
"category": "images",
"requiredHeaders": { "Content-Type": "image/png", "Content-Length": "41161", "x-amz-meta-...": "..." }
}
2. Faça o PUT dos bytes
Envie o arquivo diretamente para a uploadUrl, enviando todas as entradas de requiredHeaders exatamente como fornecidas. O tamanho do corpo deve corresponder a fileSize.
curl -X PUT "<uploadUrl>" \
-H "Content-Type: image/png" \
-H "Content-Length: 41161" \
--data-binary @product.png
3. Finalize
curl -X POST https://api.autotalk.io/v1/storage/upload-complete \
-H "x-api-key: sk-YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "uploadIntentId": "<uploadIntentId>" }'
A resposta é sua referência reutilizável:
{ "success": true, "bucket": "autotalk-prod", "fullPath": "companies/<id>/api/images/whatsapp_catalog_product_image/<id>.png", "size": 41161, "contentType": "image/png", "category": "images", "fileName": "product.png" }
Arquivos grandes: upload em partes
Um único PUT aceita no máximo 90 MB. Para um arquivo entre 90 MB e 1 GB, adicione "multipart": true à requisição da etapa 1. Sem isso, um arquivo acima de 90 MB é recusado com 400 e uma mensagem pedindo que você adicione a flag. A resposta então traz "uploadMode": "multipart_put", "uploadUrl": null e uma lista parts em vez de uma única URL:
{
"success": true,
"uploadIntentId": "...",
"uploadMode": "multipart_put",
"uploadUrl": null,
"partSize": 67108864,
"parts": [
{ "partNumber": 1, "offset": 0, "size": 67108864, "uploadUrl": "https://storage.autotalk.io/...&partNumber=1&...", "requiredHeaders": { "Content-Length": "67108864" } },
{ "partNumber": 2, "offset": 67108864, "size": 32891136, "uploadUrl": "https://storage.autotalk.io/...&partNumber=2&...", "requiredHeaders": { "Content-Length": "32891136" } }
],
"expiresAtMs": 1760000000000,
"bucket": "autotalk-prod",
"fullPath": "companies/<id>/api/documents/storage_manual_upload/<id>.pdf",
"category": "documents"
}
Para cada parte, faça o PUT dos bytes de offset até offset + size (sem incluir) para a uploadUrl dessa parte. Envie os requiredHeaders dela e nenhum Content-Type: o tipo já foi definido quando o upload foi reservado. As partes podem ir em qualquer ordem, e uma parte que falhou pode ser reenviada para a mesma URL. Todas as partes devem ser enviadas antes de expiresAtMs, 60 minutos após a reserva.
Depois chame upload-complete como na etapa 3. O AutoTalk verifica se cada parte chegou com o tamanho exato e as junta em um único arquivo.
- Se ainda faltarem partes,
upload-completeretorna409e o upload continua aberto. Envie as partes que faltam e chame de novo. - Se você abandonar o upload, ele expira após 60 minutos. As partes são descartadas e a reserva de cota é liberada.
Para ler um objeto armazenado depois, chame GET /v1/storage/url?path=<fullPath>. Ele devolve uma URL de download assinada válida por até 7 dias — a expiração é fixada no início do dia UTC, então o link dura pelo menos 6 dias a partir do momento em que você o gera — e servida com public, max-age=3600, o que a torna cacheável na borda de CDN. Trate a própria string da URL como uma credencial portadora durante toda essa janela: qualquer pessoa que a tenha consegue baixar o objeto sem se autenticar, então não registre a URL em logs, não a cole em chamados nem a encaminhe.
MCP: begin/complete ou inline em uma etapa
Se você se conecta via servidor MCP, use as ferramentas de arquivo:
begin_file_upload({fileName, mimeType, fileSize})→ faça o PUT HTTP para auploadUrlretornada →complete_file_upload({uploadIntentId}). Retorna{bucket, fullPath}. Aceita arquivos de até 1 GB. Acima de 90 MB a ferramenta responde comuploadMode: "multipart_put"e uma listaparts: faça o PUT de cada parte como descrito em Arquivos grandes: upload em partes e depois chamecomplete_file_upload. Nenhuma flag é necessária nesta ferramenta.upload_file_inline({fileName, mimeType, data})— passe os bytes codificados em base64 diretamente e obtenha{bucket, fullPath}em uma única chamada. Prático para arquivos pequenos (≤ ~1 MB); arquivos maiores devem usar o fluxo em duas etapas.
Onde usar a referência
Passe {bucket, fullPath} (ou, para images, uma URL pública ou a referência) onde quer que mídia seja aceita:
- Enviar uma mensagem de mídia —
send_messagebody.file = {bucket, fullPath}. - Catálogo do WhatsApp —
createWhatsappWebEvoProduct/updateWhatsappWebEvoProductimages: [{bucket, fullPath}, ...]. - Foto de perfil / grupo —
updateWhatsappWebEvoProfilePicturepicture,updateWhatsappWebEvoGroupPictureimage. - Campos de documento Dynadata — qualquer campo de objeto de armazenamento (por exemplo, a imagem de um documento).
Propósitos e limites
purpose(opcional, padrãostorage_manual_upload) indica para que serve o arquivo. Valores permitidos:storage_manual_upload,whatsapp_catalog_product_image,template_message_media,chat_media_upload,scheduled_message_media,contact_avatar,company_logo.fileSizepode ir até 1 GB. UmPUTcarrega no máximo 90 MB, porque cada requisição precisa passar inteira pela CDN na frente do armazenamento do AutoTalk. Por isso, arquivos acima de 90 MB são enviados em partes, cada uma abaixo desse limite.POST /v1/storage/upload-urlprecisa de"multipart": truepara esses arquivos;begin_file_uploadpassa a usar partes sozinho. Uma requisição acima de 1 GB é recusada na hora, com um erro claro. Envie a contagem exata de bytes; o tamanho armazenado precisa corresponder a ela.- Os bytes enviados contam para a cota de armazenamento da sua empresa; um upload que a excederia retorna
409. - Os arquivos ficam sob o prefixo da sua empresa; você só pode referenciar objetos do seu próprio tenant.
Próximos passos
- Referência da API — autenticação e a lista completa de endpoints
- Servidores MCP — conecte um cliente de IA e use as ferramentas de arquivo