API v2 (تجريبي)
الوسائط
تحفظ مكتبة الوسائط ملفات مساحة عملك: قوائم الأسعار، وقوائم الطعام، والكتيّبات، وصور المنتجات. ارفع الملف مرة واحدة، ثم أرسله كلما شئت باستخدام "media": {"media_id": …} في رسالة أو تذكير. إنها المكتبة نفسها التي تعرضها صفحة مكتبة الوسائط في لوحة التحكم، لذا تظهر هنا أيضًا الملفات المرفوعة من هناك.
| العملية | نقطة النهاية | النطاق |
|---|---|---|
| رفع ملف | 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النص (Body): multipart/form-data
أرسل ملفًا واحدًا في كل طلب بصيغة multipart/form-data، في الحقل file. هذه هي نقطة النهاية الوحيدة في v2 التي لا تقبل JSON. تكون الاستجابة 201 مع كائن Media.
- حتى 64 MB لكل ملف.
- الأنواع: يُحدَّد النوع من الامتداد في نهاية اسم الملف، لذا احتفظ به.
| الفئة | الامتدادات |
|---|---|
| الصور | .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 MB إلى 10 GB (راجع مساحة التخزين لكل باقة). يُرفض الملف الذي لا يتسع بالخطأ
storage_full. - يُرسَل ملف الصورة (
typeبقيمةimage) كصورة افتراضيًا، ويُرسَل أي ملف آخر كملف. - أرسل
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 MB |
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 | معرّف الملف: قيمة media_id التي تُرسله بها. |
name | string | الاسم الذي رُفع به. |
type | string | image لملفات الصور، وfile لكل ما عداها. |
mime_type | string | مثل application/pdf أو image/jpeg. |
size | integer | الحجم بالبايت. |
url | string | رابط عام للملف. يستطيع أي شخص لديه الرابط فتحه، لذا لا ترفع ملفات يجب أن تبقى خاصة. |
created_at | string | وقت رفعه. |
صفحات ذات صلة#
- مكتبة الوسائط في لوحة التحكم
- الرسائل ← الوسائط: الإرسال باستخدام
media_idأو رابط - الأخطاء
