API למדיה
ממשק API להעלאת מדיה
העלו קובץ תמונה, מסמך, אודיו או וידאו לספריית המדיה של סביבת העבודה שלכם, וקבלו בחזרה כתובת URL להורדה. העבירו את הכתובת הזו ל-שליחת הודעה, או ל-יצירת תזכורת בתור img_url, כשאין לכם אחסון קבצים משלכם.
https://wbiztool.com/api/v1/media/upload/גוף הבקשה: multipart/form-data
הקובץ נשמר מיד, והתגובה כוללת את ה-file_url שלו. קבצים שהועלו מופיעים גם בדף ספריית מדיה בלוח הבקרה שלכם.
דוגמה מהירה#
curl -X POST https://wbiztool.com/api/v1/media/upload/ \
-F client_id=12345 \
-F api_key=YOUR_API_KEY \
-F media_file=@./invoice-4821.pdfimport requests
with open("invoice-4821.pdf", "rb") as f:
response = requests.post(
"https://wbiztool.com/api/v1/media/upload/",
data={"client_id": 12345, "api_key": "YOUR_API_KEY"},
files={"media_file": f},
timeout=120,
)
try:
result = response.json()
except ValueError:
# A proxy can reject a very large upload with an HTML page before it reaches WbizTool.
raise SystemExit(f"HTTP {response.status_code}: not JSON. Check the file size.")
if result["status"] == 1:
print("Uploaded:", result["data"]["file_url"])
else:
print("Failed:", result["message"])// 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("client_id", "12345");
form.append("api_key", "YOUR_API_KEY");
form.append("media_file", await openAsBlob("./invoice-4821.pdf"), "invoice-4821.pdf");
// Don't set Content-Type yourself; fetch adds the multipart boundary.
const response = await fetch("https://wbiztool.com/api/v1/media/upload/", { method: "POST", body: form });
const result = await response.json();
if (result.status === 1) {
console.log("Uploaded:", result.data.file_url);
} else {
console.error("Failed:", result.message);
}<?php
$ch = curl_init('https://wbiztool.com/api/v1/media/upload/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
// An array body (not json_encode) makes cURL send multipart/form-data.
CURLOPT_POSTFIELDS => [
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'media_file' => new CURLFile('/path/to/invoice-4821.pdf', 'application/pdf', 'invoice-4821.pdf'),
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($result['status'] ?? 0) === 1) {
echo 'Uploaded: ' . $result['data']['file_url'];
} else {
echo 'Failed: ' . ($result['message'] ?? 'no response');
}החליפו את 12345 ו-YOUR_API_KEY בערכים שלכם. בסעיף אימות מוסבר איפה למצוא אותם.
פרמטרי הבקשה#
שלחו את הבקשה כ-multipart/form-data. ה-endpoint הזה לא קורא גופי JSON ופרמטרים ב-query string.
client_idintegerחובהמזהה הלקוח שלכם ל-API (API Client ID) מהדף Settings → API keys.
api_keystringחובהמפתח ה-API שלכם מאותו דף.
media_filefileחובההקובץ להעלאה, עד 64 MB, והוא חייב להיכנס באחסון המדיה של סביבת העבודה. הסוג שלו נקבע לפי הסיומת של שם הקובץ, ולכן השם חייב להסתיים באחת מהסיומות הנתמכות.
סוגי קבצים נתמכים#
| קטגוריה | סיומות |
|---|---|
| תמונות | .jpg, .jpeg, .png, .gif, .webp, .bmp |
| מסמכים | .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .txt, .csv |
| אודיו | .mp3, .m4a, .wav, .ogg, .aac |
| וידאו | .mp4, .mov, .avi |
| ארכיונים | .zip, .rar |
תמונות נשמרות עם file_type שמוגדר ל-image; כל השאר נשמר כ-file.
נפח אחסון לכל סביבת עבודה#
כל הקבצים בספריית המדיה של סביבת עבודה חולקים מגבלת אחסון אחת, שנקבעת לפי התוכנית של סביבת העבודה. גם קבצים שהועלו דרך ה-API הזה וגם קבצים שהועלו בדף ספריית המדיה נספרים, ומחיקת קובץ משחררת את המקום שלו.
| תוכנית | אחסון מדיה |
|---|---|
| תקופת ניסיון חינם | 250 MB |
| Lite | 1 GB |
| Standard | 2 GB |
| Advanced | 5 GB |
| Enterprise | 10 GB |
| AppSumo Plan 1 ו-Plan 2 | 1 GB |
| AppSumo Plan 3 | 2 GB |
| AppSumo Plan 4 | 3 GB |
| AppSumo Plan 5 | 5 GB |
לתוכניות ישנות יותר, ולסביבת עבודה בלי תוכנית פעילה, יש 1 GB. העלאה שלא נכנסת נדחית עם Storage full: … (ראו שגיאות). סביבת עבודה שכבר חרגה מהמגבלה שלה שומרת על הקבצים שלה, אבל לא יכולה להוסיף קבצים חדשים עד שיהיה בה מקום בשבילם.
תגובה#
בקשה מוצלחת מחזירה HTTP 200:
{
"status": 1,
"message": "File uploaded successfully",
"data": {
"id": 5122,
"file_name": "media_12345_17895804001234_3f9a1c7e.pdf",
"original_file_name": "invoice-4821.pdf",
"file_url": "https://wbiztool-static.s3.ap-southeast-1.amazonaws.com/media/org_12345/media_12345_17895804001234_3f9a1c7e.pdf",
"file_type": "file",
"file_size": 248312,
"file_size_display": "242.5 KB",
"mime_type": "application/pdf",
"is_image": false,
"file_extension": "pdf",
"created_at": "2026-09-16T10:20:31.512934+00:00"
}
}
| שדה | סוג | תיאור |
|---|---|---|
status | integer | 1 אם הקובץ הועלה, 0 אם הבקשה נכשלה. |
message | string | File uploaded successfully, אחרת השגיאה. |
data.id | integer | המזהה של קובץ המדיה. השתמשו בו עם קבלת קובץ מדיה. |
data.file_name | string | השם שתחתיו הקובץ נשמר, שנוצר על ידי WbizTool: media_, המזהה של סביבת העבודה שלכם, זמן ההעלאה וחלק אקראי, עם הסיומת של הקובץ. |
data.original_file_name | string | השם של הקובץ שהעליתם. |
data.file_url | string | כתובת URL להורדה ישירה. השתמשו בה בתור img_url או file_url בזמן השליחה. היא ציבורית ולא פגה, אבל מפסיקה לעבוד כשהקובץ נמחק. היא יכולה להיות ב-media.wbiztool.com (ה-CDN שלנו) או ב-wbiztool-static.s3.ap-southeast-1.amazonaws.com; שתיהן מגישות את אותו קובץ, לכן שמרו אותה כמו שהיא ואל תרכיבו כתובות כאלה בעצמכם. |
data.file_type | string | image או file. |
data.file_size | integer | הגודל בבייטים. |
data.file_size_display | string | גודל קריא עם ספרה אחת אחרי הנקודה, למשל 242.5 KB. |
data.mime_type | string | סוג MIME שנגזר מהסיומת, למשל application/pdf. |
data.is_image | boolean | true כש-file_type הוא image. |
data.file_extension | string | הסיומת של original_file_name באותיות קטנות, בלי הנקודה. |
data.created_at | string | זמן ההעלאה, בפורמט ISO 8601 לפי UTC עם הפרש +00:00. |
שגיאות#
גם שגיאות מחזירות HTTP 200, עם status שמוגדר ל-0:
{ "status": 0, "message": "File is too large. Maximum size is 64MB. Your file: 71.3MB" }
| הודעה | איך לתקן |
|---|---|
Only POST method is supported | שלחו בקשת POST. |
client_id is required | הוסיפו client_id כשדה טופס. ודאו שהגוף הוא multipart/form-data ולא JSON. |
api_key is required | הוסיפו api_key כשדה טופס. |
media_file is required | שלחו את הקובץ בשדה בשם media_file. |
client_id must be a valid integer | שלחו את client_id כמספר. |
Invalid API key | ודאו שהמפתח קיים ולא נמחק או הושבת. |
Invalid client_id for this API key | המפתח שייך ל-client_id אחר. |
File is too large. Maximum size is 64MB. Your file: …MB | העלו קובץ בגודל 64 MB לכל היותר. |
File type not supported. Type detected: … | השתמשו באחת מהסיומות הנתמכות. |
Storage full: this workspace uses … of its … of media storage, and this file is …. Delete files you no longer need in the Media directory, or contact us if you need more space. | הקובץ לא נכנס באחסון המדיה של סביבת העבודה. מחקו קבצים שכבר לא נחוצים בדף ספריית מדיה, או צרו איתנו קשר כדי לקבל עוד מקום. |
Error uploading file: … | לא ניתן היה להשלים את ההעלאה. נסו שוב. ההודעה הזו מופיעה גם אם מפתח ה-API לא מקושר לסביבת עבודה; צרו מפתח חדש בסביבת העבודה שבה אתם רוצים להשתמש. |
העלאה ושליחה#
העלו את הקובץ, ואז העבירו את file_url ל-שליחת הודעה: בתור img_url עם msg_type 1 לתמונות, או בתור file_url עם msg_type 2 לקבצים אחרים.
import requests
BASE = "https://wbiztool.com/api/v1"
AUTH = {"client_id": 12345, "api_key": "YOUR_API_KEY"}
with open("invoice-4821.pdf", "rb") as f:
upload = requests.post(f"{BASE}/media/upload/", data=AUTH, files={"media_file": f}, timeout=120).json()
if upload["status"] != 1:
raise SystemExit("Upload failed: " + upload["message"])
media = upload["data"]
message = {
**AUTH,
"whatsapp_client": 678,
"country_code": "91",
"phone": "9876543210",
"msg": "Your invoice for order #4821 is attached.",
}
if media["is_image"]:
message.update(msg_type=1, img_url=media["file_url"])
else:
message.update(msg_type=2, file_url=media["file_url"], file_name=media["original_file_name"])
sent = requests.post(f"{BASE}/send_msg/", json=message, timeout=60).json()
print(sent)// Node.js 20+ (built-in fetch, FormData and fs.openAsBlob). Save as .mjs to use top-level await.
import { openAsBlob } from "node:fs";
const BASE = "https://wbiztool.com/api/v1";
const form = new FormData();
form.append("client_id", "12345");
form.append("api_key", "YOUR_API_KEY");
form.append("media_file", await openAsBlob("./invoice-4821.pdf"), "invoice-4821.pdf");
const upload = await (await fetch(`${BASE}/media/upload/`, { method: "POST", body: form })).json();
if (upload.status !== 1) throw new Error(`Upload failed: ${upload.message}`);
const media = upload.data;
const message = {
client_id: 12345,
api_key: "YOUR_API_KEY",
whatsapp_client: 678,
country_code: "91",
phone: "9876543210",
msg: "Your invoice for order #4821 is attached.",
...(media.is_image
? { msg_type: 1, img_url: media.file_url }
: { msg_type: 2, file_url: media.file_url, file_name: media.original_file_name }),
};
const sent = await fetch(`${BASE}/send_msg/`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(message),
});
console.log(await sent.json());כל סוג קובץ שה-API הזה מקבל שומר על הסיומת שלו כשהוא נשלח עם msg_type 2, למשל brochure.doc או catalogue.zip. אודיו WAV ו-OGG מגיע כמסמך ולא כאודיו שמתנגן, ונכשל עם File type not supported כשהוא נשלח כתמונה (msg_type 1). קובצי MP3, M4A ו-AAC מגיעים כאודיו שמתנגן בצ'אט, והטקסט מגיע כהודעה נפרדת. ראו שליחת תמונות וקבצים. השם נשלח באותיות קטנות (Invoice-4821.PDF מגיע כ-invoice-4821.pdf).
תמונות שנשלחות עם msg_type 1 חייבות להיות בגודל 16 MB לכל היותר. תמונות גדולות יותר מועלות כאן בלי בעיה, אבל נכשלות בשליחה עם File exceeds WhatsApp size limit (16MB max). דחסו אותן קודם, או שלחו אותן כקובץ עם msg_type 2.
טיפים#
- השתמשו שוב בקבצים שהועלו. שמרו את ה-
idאו את ה-file_url, ושלחו את אותו קובץ פעמים רבות במקום להעלות אותו מחדש. - הקפידו על שם מקורי בעל משמעות. ה-
original_file_nameהוא מה שמוצג בלוח הבקרה, והוא ערך טוב ל-file_nameבזמן השליחה. - מצאו קבצים שהועלו קודם באמצעות רשימת מדיה.
