メディアAPI
メディアのアップロードAPI
画像、ドキュメント、音声、動画ファイルをワークスペースのメディアライブラリにアップロードし、ダウンロードURLを取得します。自前のファイルホスティングがない場合に、その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として送信してください。このエンドポイントは、JSONボディやクエリ文字列のパラメータを読み取りません。
client_idinteger必須設定 → APIキーに表示されるAPIクライアントIDです。
api_keystring必須同じページにあるAPIキーです。
media_filefile必須アップロードするファイルで、最大64 MBです。ファイルの種類はファイル名の拡張子で判定されるため、名前は対応している拡張子のいずれかで終わる必要があります。
対応しているファイル形式#
| カテゴリ | 拡張子 |
|---|---|
| 画像 | .jpg、.jpeg、.png、.gif |
| ドキュメント | .pdf、.doc、.xls、.ppt、.txt、.csv |
| 音声 | .mp3、.wav |
| 動画 | .mp4、.mov |
| アーカイブ | .zip |
画像はfile_typeがimageとして保存され、それ以外はすべてfileになります。
レスポンス#
リクエストが成功すると、HTTP 200が返ります。
{
"status": 1,
"message": "File uploaded successfully",
"data": {
"id": 5122,
"file_name": "media_12345_17895804001234.pdf",
"original_file_name": "invoice-4821.pdf",
"file_url": "https://wbiztool-static.s3.ap-southeast-1.amazonaws.com/media/org_12345/media_12345_17895804001234.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 | メディアファイルのID。メディアファイルの取得で使用します。 |
data.file_name | string | Wbiztoolが生成した、ファイルの保存名。 |
data.original_file_name | string | アップロードしたファイルの名前。 |
data.file_url | string | 直接ダウンロードURL。送信時にimg_urlまたはfile_urlとして使用します。 |
data.file_type | string | imageまたはfile。 |
data.file_size | integer | サイズ(バイト)。 |
data.file_size_display | string | 小数点以下1桁の読みやすいサイズ(例:242.5 KB)。 |
data.mime_type | string | 拡張子から判定したMIMEタイプ(例:application/pdf)。 |
data.is_image | boolean | file_typeがimageの場合はtrue。 |
data.file_extension | string | original_file_nameの小文字の拡張子(ドットなし)。 |
data.created_at | string | アップロード日時。+00:00オフセット付きのUTCのISO 8601形式です。 |
エラー#
エラーの場合も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をフォームフィールドとして追加してください。ボディがJSONではなくmultipart/form-dataになっているか確認してください。 |
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: … | 対応している拡張子のいずれかを使用してください。 |
Error uploading file: … | アップロードを完了できませんでした。もう一度お試しください。APIキーがワークスペースに紐づいていない場合にも返されます。使用したいワークスペースで新しいキーを作成してください。 |
アップロードして送信する#
ファイルをアップロードし、file_urlをメッセージ送信に渡します。画像の場合はmsg_type 1でimg_urlとして、その他のファイルの場合はmsg_type 2でfile_urlとして指定します。
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には独自の対応拡張子の一覧があります。このAPIで受け付ける形式のうち、.doc、.ppt、.csv、.zip、.wav、.movのファイルをmsg_type 2で送信すると、名前に.pdfが付加されて届きます(例:brochure.doc.pdf)。ドキュメントは送信前にPDFに変換してください。画像とファイルの送信をご覧ください。また、名前は小文字で送信されます(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の値としても適しています。 - 以前のアップロードを探すには、メディア一覧を使用してください。
