API v2 (beta)
Mídia
O Diretório de mídia guarda os arquivos do seu espaço de trabalho: tabelas de preços, cardápios, folhetos, fotos de produtos. Envie um arquivo uma vez e depois mande-o quantas vezes quiser com "media": {"media_id": …} em uma mensagem ou em um lembrete. É o mesmo diretório da página Diretório de mídia do painel, então os arquivos enviados por lá também aparecem aqui.
| Operação | Endpoint | Permissão |
|---|---|---|
| Enviar um arquivo | POST /api/v2/media | media |
| Listar arquivos | GET /api/v2/media | media |
| Obter um arquivo | GET /api/v2/media/{id} | media |
| Excluir um arquivo | DELETE /api/v2/media/{id} | media |
Enviar um arquivo#
https://wbiztool.com/api/v2/mediaCorpo: multipart/form-data
Envie um arquivo por requisição como multipart/form-data, no campo file. Este é o único endpoint da v2 que não aceita JSON. A resposta é 201 com o objeto Media.
- Até 64 MB por arquivo.
- Tipos: o tipo vem da extensão no final do nome do arquivo, então mantenha-a.
| Tipo | Extensões |
|---|---|
| Imagens | .jpg, .jpeg, .jpe, .png, .gif, .webp, .bmp |
| Documentos | .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .csv, .txt |
| Áudio | .mp3, .m4a, .wav, .ogg, .oga, .aac |
| Vídeo | .mp4, .mov, .avi |
| Arquivos compactados | .zip, .rar |
- Armazenamento: todos os arquivos do espaço de trabalho juntos podem ocupar o que o plano permite, de 250 MB a 10 GB (veja Armazenamento por plano). Um arquivo que não cabe é recusado com
storage_full. - Um arquivo de imagem (
typeimage) é enviado como imagem por padrão; todo o resto, como arquivo. - Envie uma
Idempotency-Keypara que uma nova tentativa depois de um timeout não guarde o arquivo duas vezes.
curl -X POST https://wbiztool.com/api/v2/media \
-H "Authorization: Bearer $WBIZTOOL_API_KEY" \
-H "Idempotency-Key: price-list-2026-10" \
-F "file=@./price list.pdf"import os
import requests
with open("price list.pdf", "rb") as f:
response = requests.post(
"https://wbiztool.com/api/v2/media",
headers={"Authorization": f"Bearer {os.environ['WBIZTOOL_API_KEY']}"},
files={"file": ("price list.pdf", f, "application/pdf")},
timeout=120,
)
media = response.json()
print(response.status_code, media.get("id"), media.get("url"))// Node.js 20+ (built-in fetch, FormData and fs.openAsBlob). Save as .mjs to use top-level await.
import { openAsBlob } from "node:fs";
const form = new FormData();
form.append("file", await openAsBlob("./price list.pdf"), "price list.pdf");
// Don't set Content-Type yourself; fetch adds the multipart boundary.
const response = await fetch("https://wbiztool.com/api/v2/media", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.WBIZTOOL_API_KEY}` },
body: form,
});
const media = await response.json();
console.log(response.status, media.id, media.url);<?php
$ch = curl_init('https://wbiztool.com/api/v2/media');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('WBIZTOOL_API_KEY')],
// An array body makes cURL send multipart/form-data.
CURLOPT_POSTFIELDS => ['file' => new CURLFile('/path/to/price list.pdf', 'application/pdf', 'price list.pdf')],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120,
]);
$media = json_decode(curl_exec($ch), true);
curl_close($ch);
echo $media['id'] . ' ' . $media['url'];Resposta (201):
{
"id": 3301,
"name": "price list.pdf",
"type": "file",
"mime_type": "application/pdf",
"size": 182344,
"url": "https://media.wbiztool.com/media/org_5012/media_5012_17608123450000_0.pdf",
"created_at": "2026-10-18T10:31:40.120Z"
}
Depois, mande-o:
{
"to": { "phone": "+919876543210" },
"text": "Here is our new price list.",
"media": { "media_id": 3301 }
}
O destinatário vê o nome com que o arquivo foi enviado (price list.pdf); defina media.file_name na mensagem para mostrar outro.
Erros ao enviar um arquivo#
| HTTP | Código | Quando |
|---|---|---|
400 | validation_failed | Nenhum arquivo no campo file, ou mais de um |
413 | file_too_large | O arquivo tem mais de 64 MB |
415 | unsupported_file_type | A extensão não é de um dos tipos acima |
415 | unsupported_content_type | A requisição não é multipart/form-data (é JSON, por exemplo) |
422 | storage_full | O arquivo não cabe no armazenamento do plano; used e limit dizem quanto, em bytes |
502 | upload_failed | O arquivo não pôde ser guardado. Tente de novo (com a mesma Idempotency-Key) |
Listar arquivos#
https://wbiztool.com/api/v2/mediaOs arquivos do espaço de trabalho, dos mais recentes para os mais antigos, em páginas (limit de 1 a 100, padrão 25, e cursor).
curl "https://wbiztool.com/api/v2/media?limit=100" \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
A resposta é {"data": [Media, …], "next_cursor": "…" or null}.
Obter um arquivo#
https://wbiztool.com/api/v2/media/{id}curl https://wbiztool.com/api/v2/media/3301 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
Um arquivo que não existe ou que foi excluído responde 404 media_not_found.
Excluir um arquivo#
https://wbiztool.com/api/v2/media/{id}Exclui o arquivo do Diretório de mídia e do armazenamento, então a url dele deixa de funcionar. As mensagens já enviadas mantêm a cópia no celular do destinatário.
A exclusão é recusada enquanto algo ainda vai enviar o arquivo: uma mensagem esperando para sair (inclusive de uma campanha), um lembrete ativo ou um gatilho ativo do Google Sheets. Nesse caso, a resposta é 409 media_in_use, e count diz quantos são. Cancele ou altere esses itens primeiro, ou espere até as mensagens saírem.
curl -X DELETE https://wbiztool.com/api/v2/media/3301 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
{ "id": 3301, "deleted": true }
| HTTP | Código | Quando |
|---|---|---|
404 | media_not_found | Nenhum arquivo assim |
409 | media_in_use | Uma mensagem em espera, um lembrete ativo ou um gatilho do Google Sheets ainda usa o arquivo |
O objeto Media#
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | O id do arquivo: o media_id com que você o envia. |
name | string | O nome com que foi enviado. |
type | string | image para arquivos de imagem, file para todo o resto. |
mime_type | string | Como application/pdf ou image/jpeg. |
size | integer | Tamanho em bytes. |
url | string | Um link público para o arquivo. Qualquer pessoa com o link pode abri-lo, então não envie arquivos que precisam continuar privados. |
created_at | string | Quando foi enviado. |
Relacionados#
- Diretório de mídia no painel
- Mensagens → Mídia: enviar com
media_idou um link - Erros
