Media-API
Medien hochladen (API)
Laden Sie ein Bild, ein Dokument, eine Audio- oder eine Videodatei in das Medienverzeichnis Ihres Arbeitsbereichs hoch und erhalten Sie eine Download-URL zurück. Übergeben Sie diese URL an Nachricht senden oder als img_url an Erinnerung erstellen, wenn Sie kein eigenes Datei-Hosting haben.
https://wbiztool.com/api/v1/media/upload/Body: multipart/form-data
Die Datei wird sofort gespeichert, und die Antwort enthält ihre file_url. Hochgeladene Dateien erscheinen außerdem auf der Seite Medienverzeichnis in Ihrem Dashboard.
Kurzes Beispiel#
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');
}Ersetzen Sie 12345 und YOUR_API_KEY durch Ihre eigenen Werte. Wo Sie diese finden, steht unter Authentifizierung.
Request-Parameter#
Senden Sie den Request als multipart/form-data. JSON-Bodys und Query-String-Parameter werden von diesem Endpoint nicht gelesen.
client_idintegererforderlichIhre API-Client-ID aus Einstellungen → API-Schlüssel.
api_keystringerforderlichIhr API-Schlüssel von derselben Seite.
media_filefileerforderlichDie hochzuladende Datei, bis zu 64 MB, und sie muss in den Medienspeicher des Arbeitsbereichs passen. Ihr Typ wird anhand der Endung des Dateinamens bestimmt, der Name muss daher auf eine der unterstützten Endungen enden.
Unterstützte Dateitypen#
| Kategorie | Endungen |
|---|---|
| Bilder | .jpg, .jpeg, .png, .gif, .webp, .bmp |
| Dokumente | .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .txt, .csv |
| Audio | .mp3, .m4a, .wav, .ogg, .aac |
| Video | .mp4, .mov, .avi |
| Archive | .zip, .rar |
Bilder werden mit file_type gleich image gespeichert, alles andere als file.
Speicherplatz pro Arbeitsbereich#
Alle Dateien im Medienverzeichnis eines Arbeitsbereichs teilen sich ein Speicherlimit, das vom Plan des Arbeitsbereichs festgelegt wird. Dateien, die mit dieser API und auf der Seite Medienverzeichnis hochgeladen werden, zählen beide, und das Löschen einer Datei gibt ihren Platz frei.
| Plan | Medienspeicher |
|---|---|
| Kostenlose Testphase | 250 MB |
| Lite | 1 GB |
| Standard | 2 GB |
| Advanced | 5 GB |
| Enterprise | 10 GB |
| AppSumo Plan 1 und Plan 2 | 1 GB |
| AppSumo Plan 3 | 2 GB |
| AppSumo Plan 4 | 3 GB |
| AppSumo Plan 5 | 5 GB |
Ältere Pläne und ein Arbeitsbereich ohne aktiven Plan haben 1 GB. Ein Upload, der nicht passt, wird mit Storage full: … abgelehnt (siehe Fehler). Ein Arbeitsbereich, der sein Limit schon überschreitet, behält seine Dateien, kann aber keine neuen hinzufügen, bis wieder Platz für sie ist.
Antwort#
Ein erfolgreicher Request gibt HTTP 200 zurück:
{
"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"
}
}
| Feld | Typ | Beschreibung |
|---|---|---|
status | integer | 1, wenn die Datei hochgeladen wurde, 0, wenn der Request fehlgeschlagen ist. |
message | string | File uploaded successfully, andernfalls der Fehler. |
data.id | integer | ID der Mediendatei. Verwenden Sie sie mit Mediendatei abrufen. |
data.file_name | string | Name, unter dem die Datei gespeichert ist, von WbizTool generiert: media_, Ihre Arbeitsbereichs-ID, der Upload-Zeitpunkt und ein zufälliger Teil, mit der Endung der Datei. |
data.original_file_name | string | Der Name der hochgeladenen Datei. |
data.file_url | string | Direkte Download-URL. Verwenden Sie sie beim Senden als img_url oder file_url. Sie ist öffentlich und läuft nicht ab, funktioniert aber nicht mehr, wenn die Datei gelöscht wird. Sie kann auf media.wbiztool.com (unserem CDN) oder auf wbiztool-static.s3.ap-southeast-1.amazonaws.com liegen; beide liefern dieselbe Datei. Speichern Sie sie also so, wie sie ist, und bauen Sie diese URLs nicht selbst zusammen. |
data.file_type | string | image oder file. |
data.file_size | integer | Größe in Bytes. |
data.file_size_display | string | Lesbare Größe mit einer Nachkommastelle, zum Beispiel 242.5 KB. |
data.mime_type | string | Aus der Endung ermittelter MIME-Typ, zum Beispiel application/pdf. |
data.is_image | boolean | true, wenn file_type den Wert image hat. |
data.file_extension | string | Endung von original_file_name in Kleinbuchstaben, ohne Punkt. |
data.created_at | string | Upload-Zeitpunkt, ISO 8601 in UTC mit der Abweichung +00:00. |
Fehler#
Auch Fehler geben HTTP 200 zurück, mit status gleich 0:
{ "status": 0, "message": "File is too large. Maximum size is 64MB. Your file: 71.3MB" }
| Meldung | Lösung |
|---|---|
Only POST method is supported | Senden Sie einen POST-Request. |
client_id is required | Fügen Sie client_id als Formularfeld hinzu. Prüfen Sie, ob der Body multipart/form-data ist und nicht JSON. |
api_key is required | Fügen Sie api_key als Formularfeld hinzu. |
media_file is required | Senden Sie die Datei in einem Feld namens media_file. |
client_id must be a valid integer | Senden Sie client_id als Zahl. |
Invalid API key | Prüfen Sie, ob der Schlüssel existiert und nicht gelöscht oder deaktiviert wurde. |
Invalid client_id for this API key | Der Schlüssel gehört zu einer anderen client_id. |
File is too large. Maximum size is 64MB. Your file: …MB | Laden Sie eine Datei mit höchstens 64 MB hoch. |
File type not supported. Type detected: … | Verwenden Sie eine der unterstützten Endungen. |
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. | Die Datei passt nicht in den Medienspeicher des Arbeitsbereichs. Löschen Sie Dateien, die Sie nicht mehr brauchen, auf der Seite Medienverzeichnis, oder kontaktieren Sie uns für mehr Platz. |
Error uploading file: … | Der Upload konnte nicht abgeschlossen werden. Versuchen Sie es erneut. Diese Meldung erhalten Sie auch, wenn der API-Schlüssel mit keinem Arbeitsbereich verknüpft ist; erstellen Sie einen neuen Schlüssel in dem Arbeitsbereich, den Sie verwenden möchten. |
Hochladen und senden#
Laden Sie die Datei hoch und übergeben Sie dann file_url an Nachricht senden: als img_url mit msg_type 1 für Bilder oder als file_url mit msg_type 2 für andere Dateien.
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());Jeder Dateityp, den diese API akzeptiert, behält seine Endung, wenn er mit msg_type 2 gesendet wird, zum Beispiel brochure.doc oder catalogue.zip. WAV- und OGG-Audio kommen als Dokumente an, nicht als abspielbares Audio, und schlagen mit File type not supported fehl, wenn sie als Bild (msg_type 1) gesendet werden. MP3, M4A und AAC kommen als Audio an, das im Chat abgespielt wird, mit dem Text als separater Nachricht. Siehe Bilder und Dateien senden. Der Name wird in Kleinbuchstaben gesendet (Invoice-4821.PDF kommt als invoice-4821.pdf an).
Mit msg_type 1 gesendete Bilder dürfen höchstens 16 MB groß sein. Größere Bilder lassen sich hier zwar hochladen, schlagen aber beim Senden mit File exceeds WhatsApp size limit (16MB max) fehl. Komprimieren Sie sie vorher oder senden Sie sie als Datei mit msg_type 2.
Tipps#
- Uploads wiederverwenden. Speichern Sie die
idoderfile_urlund senden Sie dieselbe Datei mehrfach, statt sie erneut hochzuladen. - Aussagekräftige Originalnamen verwenden.
original_file_namesehen Sie im Dashboard, und der Wert eignet sich gut alsfile_namebeim Senden. - Frühere Uploads finden Sie mit Medien auflisten.
