API v2 (beta)
File multimediali
La Directory media contiene i file del tuo spazio di lavoro: listini prezzi, menu, brochure, foto dei prodotti. Carica un file una volta, poi invialo tutte le volte che vuoi con "media": {"media_id": …} in un messaggio o in un promemoria. È la stessa directory della pagina Directory media nella dashboard, quindi anche i file caricati lì compaiono qui.
| Operazione | Endpoint | Scope |
|---|---|---|
| Caricare un file | POST /api/v2/media | media |
| Elencare i file | GET /api/v2/media | media |
| Ottenere un file | GET /api/v2/media/{id} | media |
| Eliminare un file | DELETE /api/v2/media/{id} | media |
Caricare un file#
https://wbiztool.com/api/v2/mediaCorpo: multipart/form-data
Invia un file per richiesta come multipart/form-data, nel campo file. È l'unico endpoint della v2 che non accetta JSON. La risposta è 201 con l'oggetto Media.
- Fino a 64 MB per file.
- Tipi: il tipo viene ricavato dall'estensione alla fine del nome del file, quindi mantienila.
| Tipo | Estensioni |
|---|---|
| Immagini | .jpg, .jpeg, .jpe, .png, .gif, .webp, .bmp |
| Documenti | .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .csv, .txt |
| Audio | .mp3, .m4a, .wav, .ogg, .oga, .aac |
| Video | .mp4, .mov, .avi |
| Archivi | .zip, .rar |
- Spazio di archiviazione: tutti i file dello spazio di lavoro insieme possono occupare lo spazio consentito dal piano, da 250 MB a 10 GB (vedi Spazio di archiviazione per piano). Un file che non ci sta viene rifiutato con
storage_full. - Un file immagine (
typeimage) viene inviato come immagine per impostazione predefinita; tutto il resto come file. - Invia un
Idempotency-Keycosì un nuovo tentativo dopo un timeout non salva il file due volte.
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'];Risposta (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"
}
Poi invialo:
{
"to": { "phone": "+919876543210" },
"text": "Here is our new price list.",
"media": { "media_id": 3301 }
}
Il destinatario vede il nome con cui il file è stato caricato (price list.pdf); imposta media.file_name nel messaggio per mostrarne un altro.
Errori durante il caricamento#
| HTTP | Codice | Quando |
|---|---|---|
400 | validation_failed | Nessun file nel campo file, oppure più di uno |
413 | file_too_large | Il file supera i 64 MB |
415 | unsupported_file_type | L'estensione non è uno dei tipi indicati sopra |
415 | unsupported_content_type | La richiesta non è multipart/form-data (per esempio è JSON) |
422 | storage_full | Il file non rientra nello spazio di archiviazione del piano; used e limit indicano quanto, in byte |
502 | upload_failed | Non è stato possibile salvare il file. Riprova (con lo stesso Idempotency-Key) |
Elencare i file#
https://wbiztool.com/api/v2/mediaI file dello spazio di lavoro, dal più recente, in pagine (limit da 1 a 100, predefinito 25, e cursor).
curl "https://wbiztool.com/api/v2/media?limit=100" \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
La risposta è {"data": [Media, …], "next_cursor": "…" or null}.
Ottenere un file#
https://wbiztool.com/api/v2/media/{id}curl https://wbiztool.com/api/v2/media/3301 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
Un file che non esiste o è stato eliminato risponde 404 media_not_found.
Eliminare un file#
https://wbiztool.com/api/v2/media/{id}Elimina il file dalla Directory media e dallo spazio di archiviazione, quindi il suo url smette di funzionare. I messaggi già inviati conservano la loro copia sul telefono del destinatario.
L'eliminazione viene rifiutata finché qualcosa deve ancora inviare il file: un messaggio in attesa di partire (anche di una campagna), un promemoria attivo o un trigger Google Sheets attivo. In quel caso la risposta è 409 media_in_use, e count indica quanti sono. Prima annullali o modificali, oppure attendi che i messaggi siano partiti.
curl -X DELETE https://wbiztool.com/api/v2/media/3301 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
{ "id": 3301, "deleted": true }
| HTTP | Codice | Quando |
|---|---|---|
404 | media_not_found | Nessun file di questo tipo |
409 | media_in_use | Un messaggio in attesa, un promemoria attivo o un trigger Google Sheets lo usa ancora |
L'oggetto Media#
| Campo | Tipo | Descrizione |
|---|---|---|
id | integer | L'id del file: il media_id con cui inviarlo. |
name | string | Il nome con cui è stato caricato. |
type | string | image per i file immagine, file per tutto il resto. |
mime_type | string | Per esempio application/pdf o image/jpeg. |
size | integer | Dimensione in byte. |
url | string | Un link pubblico al file. Chiunque abbia il link può aprirlo, quindi non caricare file che devono rimanere privati. |
created_at | string | Quando è stato caricato. |
Pagine correlate#
- Directory media nella dashboard
- Messaggi → Media: inviare con
media_ido con un link - Errori
