プログラムによるエンコード — Ultra サブスクライバー限定。 アカウント → API キーでキーを作成し、キーをそのまま下記エンドポイント URL に含めてください。
| プラン | 1 ファイル上限 | API アクセス | multipart 必須? |
|---|---|---|---|
| Free | 5 KB | — | — |
| Pro | 100 MB | — | 不要(単発 PUT で OK) |
| Ultra | 300 MB | あり | ファイル >100 MB は multipart 必須 |
Cloudflare エッジは 1 リクエスト body を 100 MB に制限します。それを超えるファイルは 50 MB の part に分割し、下記の multipart エンドポイントを使ってください。
POST https://webhook.binaryphp.com/upload/<api_key>
X-BPHP-Filename: plugin.php # 必須、拡張子は .php または .zip
X-BPHP-Domain: app.example.com,*.example.com
X-BPHP-Mac: aa:bb:cc:dd:ee:ff # 任意
X-BPHP-Expire: 2027-12-31 # 任意
X-BPHP-Webhook: https://you.example.com/wh # 任意、非同期通知用
<ファイルバイナリを request body として>
→ 200 {
"job_id": "...",
"download_url": "https://...presigned R2 URL...",
"expires_at": "2026-05-09T...",
"size": 12345,
"license": { "domains": [...], ... }
}
curl 1 行版:
curl -X POST https://webhook.binaryphp.com/upload/$API_KEY \
-H "X-BPHP-Filename: plugin.php" \
-H "X-BPHP-Domain: app.example.com" \
--data-binary @plugin.php
3 ステップ: init → 各 part を個別に PUT → complete。
POST https://webhook.binaryphp.com/upload/<api_key>/init
X-BPHP-Filename: bigplugin.zip
X-BPHP-Total-Size: 200000000
→ 200 {
"job_id": "...",
"upload_id": "...", # R2 multipart 不透明 id
"r2_key": "uploads/<job_id>.zip",
"part_size": 52428800, # 推奨 50 MB / part
"part_count": 4,
"max_part_size": 104857600, # 100 MB ハードリミット
"parts": [
{ "part_no": 1, "upload_url": "https://...presigned PUT..." },
{ "part_no": 2, "upload_url": "..." },
{ "part_no": 3, "upload_url": "..." },
{ "part_no": 4, "upload_url": "..." }
]
}
upload_url に PUTこれらの presigned URL は 直接 R2 へアクセスし、Worker 帯域を消費しません。
各 PUT 応答の ETag ヘッダは収集しておき、complete
段階でまとめて送信してください:
PUT <upload_url>
<ファイルの (part_no-1)*part_size オフセットから part_size バイトを読む>
← 200 OK
ETag: "abc123def456..."
各 part は ≥5 MB(最後の part のみ小さくて OK)、かつ ≤100 MB。
POST https://webhook.binaryphp.com/upload/<api_key>/complete
Content-Type: application/json
{
"upload_id": "...",
"r2_key": "uploads/<job_id>.zip",
"filename": "bigplugin.zip",
"parts": [
{ "part_no": 1, "etag": "\"abc...\"" },
{ "part_no": 2, "etag": "\"def...\"" },
{ "part_no": 3, "etag": "\"ghi...\"" },
{ "part_no": 4, "etag": "\"jkl...\"" }
],
"domain": "app.example.com",
"mac": "",
"expire": "2027-12-31",
"plugin": "",
"webhook": ""
}
→ 200 { "job_id", "download_url", "expires_at", "size", "license" }
途中で part アップロードに失敗した場合、/upload/<api_key>/abort
を { upload_id, r2_key } 付きで呼び出し、残った part が R2 で課金され続けるのを防いでください。
X-BPHP-Webhook(または complete body の "webhook")を
設定すると encode.completed イベントを受信できます。通知は Cloudflare エッジ IP から送信され、
弊社のホスト IP は漏洩しません。Body はあなたの API key を共有秘密鍵として HMAC-SHA256 署名されます:
POST <あなたの webhook URL>
X-BinaryPHP-Signature: t=1736208000,v1=<hex>
X-BinaryPHP-Event: encode.completed
Content-Type: application/json
{
"event": "encode.completed",
"job_id": "...",
"download_url": "...",
"expires_at": "...",
"size": 12345,
"license": { ... }
}
検証例(PHP):
$sig_h = $_SERVER['HTTP_X_BINARYPHP_SIGNATURE'] ?? '';
[$tpart, $vpart] = array_pad(explode(',', $sig_h, 2), 2, '');
$ts = (int) substr($tpart, 2);
$got = substr($vpart, 3);
if (abs(time() - $ts) > 300) http_response_code(401);
$body = file_get_contents('php://input');
$expected = hash_hmac('sha256', "$ts.$body", $YOUR_API_KEY);
if (!hash_equals($expected, $got)) http_response_code(401);
ext-curl のみ。ファイルサイズに応じて単発か multipart かを自動選択;
途中で失敗すれば R2 multipart を abort し、残片による課金を防ぎます。
API_KEY=bphp_live_xxx php upload.php big.zip --domain=app.example.com
requests のみ。同様に自動判定 + abort クリーンアップ。
| ステータスコード | 意味 | 対処方法 |
|---|---|---|
| 401 | キーが誤っているか失効済み | 「アカウント → API キー」で再作成 |
| 402 | プランがこの操作を非対応(例: Free で zip アップロード) | プランをアップグレード |
| 413 | ファイル / Content-Length がプラン上限超過 | multipart に切替、または Pro→Ultra にアップグレード(300 MB) |
| 400 | フィールド欠落またはフォーマットエラー(filename、parts 等) | 応答 body を確認、欠けているフィールドが示されます |
| 502 | R2 multipart 操作失敗 | init を再試行;R2 は <1% の確率で失敗することがあります |