API v2 (бета)
Медиафайлы
В Медиакаталоге хранятся файлы вашего рабочего пространства: прайс-листы, меню, брошюры, фото товаров. Загрузите файл один раз, а затем отправляйте его сколько угодно с "media": {"media_id": …} в сообщении или напоминании. Это тот же каталог, что на странице Медиакаталога в панели, поэтому загруженные там файлы тоже видны здесь.
| Операция | Endpoint | Область доступа |
|---|---|---|
| Загрузка файла | POST /api/v2/media | media |
| Список файлов | GET /api/v2/media | media |
| Получение файла | GET /api/v2/media/{id} | media |
| Удаление файла | DELETE /api/v2/media/{id} | media |
Загрузка файла#
https://wbiztool.com/api/v2/mediaТело запроса: multipart/form-data
Отправляйте один файл за запрос как multipart/form-data, в поле file. Это единственный endpoint v2, который не принимает JSON. Ответ — 201 с объектом Media.
- До 64 МБ на файл.
- Типы: тип определяется по расширению в конце имени файла, поэтому сохраняйте его.
| Вид | Расширения |
|---|---|
| Изображения | .jpg, .jpeg, .jpe, .png, .gif, .webp, .bmp |
| Документы | .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .csv, .txt |
| Аудио | .mp3, .m4a, .wav, .ogg, .oga, .aac |
| Видео | .mp4, .mov, .avi |
| Архивы | .zip, .rar |
- Хранилище: все файлы рабочего пространства вместе могут занимать столько, сколько разрешает его тариф, от 250 МБ до 10 ГБ (см. Хранилище по тарифам). Файл, который не помещается, отклоняется с
storage_full. - Файл изображения (
typeimage) по умолчанию отправляется как изображение, всё остальное — как файл. - Передайте
Idempotency-Key, чтобы повтор после тайм-аута не сохранил файл дважды.
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'];Ответ (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"
}
Затем отправьте его:
{
"to": { "phone": "+919876543210" },
"text": "Here is our new price list.",
"media": { "media_id": 3301 }
}
Получатель видит имя, с которым файл был загружен (price list.pdf); чтобы показать другое, укажите media.file_name в сообщении.
Ошибки при загрузке#
| HTTP | Код | Когда |
|---|---|---|
400 | validation_failed | В поле file нет файла или их больше одного |
413 | file_too_large | Файл больше 64 МБ |
415 | unsupported_file_type | Расширение не относится к типам выше |
415 | unsupported_content_type | Запрос отправлен не как multipart/form-data (например, как JSON) |
422 | storage_full | Файл не помещается в хранилище тарифа; used и limit показывают сколько, в байтах |
502 | upload_failed | Файл не удалось сохранить. Попробуйте снова (с тем же Idempotency-Key) |
Список файлов#
https://wbiztool.com/api/v2/mediaФайлы рабочего пространства, сначала самые новые, страницами (limit от 1 до 100, по умолчанию 25, и cursor).
curl "https://wbiztool.com/api/v2/media?limit=100" \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
Ответ — {"data": [Media, …], "next_cursor": "…" or null}.
Получение файла#
https://wbiztool.com/api/v2/media/{id}curl https://wbiztool.com/api/v2/media/3301 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
Файл, которого не существует или который удалён, возвращает 404 media_not_found.
Удаление файла#
https://wbiztool.com/api/v2/media/{id}Удаляет файл из Медиакаталога и из хранилища, поэтому его url перестаёт работать. У получателей уже отправленных сообщений копия на телефоне сохраняется.
Удаление отклоняется, пока что-то ещё будет отправлять этот файл: сообщение, ожидающее отправки (в том числе из кампании), активное напоминание или активный триггер Google Sheets. В этом случае ответ — 409 media_in_use, а count показывает, сколько таких. Сначала отмените или измените их либо дождитесь, пока сообщения уйдут.
curl -X DELETE https://wbiztool.com/api/v2/media/3301 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"
{ "id": 3301, "deleted": true }
| HTTP | Код | Когда |
|---|---|---|
404 | media_not_found | Такого файла нет |
409 | media_in_use | Его всё ещё использует ожидающее сообщение, активное напоминание или триггер Google Sheets |
Объект Media#
| Поле | Тип | Описание |
|---|---|---|
id | integer | ID файла: media_id, с которым его отправляют. |
name | string | Имя, с которым он был загружен. |
type | string | image для файлов изображений, file для всего остального. |
mime_type | string | Например, application/pdf или image/jpeg. |
size | integer | Размер в байтах. |
url | string | Публичная ссылка на файл. Открыть его может любой, у кого есть ссылка, поэтому не загружайте файлы, которые должны оставаться закрытыми. |
created_at | string | Когда он был загружен. |
Связанные материалы#
- Медиакаталог в панели
- Сообщения → Медиафайлы: отправка по
media_idили по ссылке - Ошибки
