API
パネルの機能はすべて、2 つの独立した API から利用できます。どちらも同じアカウント、同じ残高、同じカタログを使い、違いは形式と機能にあります。
パネルの機能はすべて、2 つの独立した API から利用できます。どちらも同じアカウント、同じ残高、同じカタログを使い、違いは形式と機能にあります。
なぜ API が 2 つあるのか
業界全体で使われている従来のリセラー API (v2) は、単一のエンドポイントにフォームを送信し、常に HTTP 200 を返します。既製のパネルソフトウェアが期待する形式はまさにこれなので、そのまま維持しています。一方、自分でシステムを書く開発者は、この形式の制約に繰り返しぶつかっていました。エラーを区別できず、カタログは一塊で返り、注文ステータスを知るには問い合わせ続けるしかありませんでした。v3 はその要求に応えるために書かれました。
比較
| 項目 | レガシー (v2) | 新 (v3) |
|---|---|---|
| 形式 | 単一エンドポイント、フォーム送信、action パラメーター | リソース指向の REST、JSON ボディ |
| HTTP ステータスコード | 失敗時も常に 200 | 実際のコード (400、401、402、404、409、429、502) |
| エラー | 自由形式のテキスト | type + 固定の code + ローカライズされたメッセージ + param + doc_url |
| 注文ステータス | ローカライズされたテキストのみ | 固定の機械可読値に加えて表示用ラベルも別途提供 |
| サービス説明 | なし | 10 言語の説明、平均所要時間、プラットフォーム、カテゴリー |
| 注文フィールド | 型名から推測 | サービスごとに独自のフィールドスキーマを公開 |
| 価格の単位 | 明示されない (パッケージで 1000 倍のずれを生む原因) | per_1000 または per_order として明示 |
| カタログ | 1 回のレスポンスに全サービス | フィルターとカーソルページネーション |
| 重複注文の防止 | なし | Idempotency-Key |
| ステータス通知 | 継続的なポーリング | 署名付き Webhook またはイベントストリーム |
| スキーマ | なし | OpenAPI 3.1 |
| 言語 | 英語とトルコ語 (アドレスが別) | 10 言語 (ヘッダーまたはパラメーターで指定) |
どちらを選ぶべきか
既製のパネルソフトウェア、ボット、リセラーパネルを使っているならレガシー API を選んでください。多くの場合、API のアドレスとキーを差し替えるだけで、数分で動き出します。
自分のアプリケーション、ストア、自動化を書いているなら v3 を選んでください。エラー処理、重複注文の防止、通知の仕組みが最初から備わっており、注文フォームをサービススキーマから自動生成できます。
はじめに
- 1「キー」タブから API キーを 1 つ作成します。
- 2サービス一覧を取得し、使うサービスの id とフィールドスキーマを確認します。
- 3注文をまず preview で検証し、そのうえで作成します。
- 4ステータスを追うために Webhook を登録するか、イベントストリームを読みます。
自分でシステムを書く開発者向けに設計した REST API です。リソース指向のパス、実際の HTTP ステータスコード、機械可読なエラー、署名付き通知を備えています。
ベースアドレス
すべてのパスはこのアドレスに続きます。バージョンはパスに含まれます。互換性を壊す変更が必要になった場合は新しいパス (v4) を公開し、現在のパスは手を加えないまま動き続けます。仕様の公開日は、すべてのレスポンスの X-Api-Version ヘッダーで返されます。
https://panelfollows.com/api/v3認証
API キーは Authorization ヘッダーに Bearer トークンとして送ってください。代替として X-Api-Key ヘッダーも受け付けます。
GET https://panelfollows.com/api/v3/account
Authorization: Bearer pf_live_...既存のレガシーキーは v3 でも使えるので、すぐに試せます。本番環境では v3 キーを使ってください。ラベルを付けられ、1 本ずつ失効でき、平文で保存されることもありません。
クイックスタート
curl https://panelfollows.com/api/v3/services?limit=5 \
-H "Authorization: Bearer YOUR_API_KEY"言語
レスポンスの言語は Accept-Language ヘッダーまたは ?lang= パラメーターで指定します。パラメーターがヘッダーより優先されます。サービス名、サービス説明、カテゴリー名、注文ステータスのラベル、注文フィールドのラベル、エラーメッセージが、指定した言語で返ります。
機械可読値はどの言語でも変わりません。error.code、order.status、service.type、currency は常に同じです。条件分岐はこれらの値で書き、ユーザーにはテキストを表示してください。
Accept-Language: tr
# veya
GET https://panelfollows.com/api/v3/services?lang=trリクエストとレスポンスの形式
リクエストボディは JSON (application/json) です。手早く試すための form-urlencoded も受け付けます。レスポンスは JSON で、単一のリソースは素のオブジェクト、リストは data、has_more、next_cursor を持つエンベロープで返ります。すべてのオブジェクトには、自身の種類を示す object フィールドがあります。
金額は浮動小数点数ではなく、10 進数の文字列 ("1.2340") で返ります。端数が失われないよう、クライアント側でも 10 進数型として扱ってください。通貨は USD です。
タイムスタンプは RFC 3339 形式です (2026-08-21T00:24:45.255Z)。
エラー
失敗した場合は実際の HTTP ステータスコードが返り、ボディには 1 つの error オブジェクトが入ります。コード側は error.code の値で分岐してください。この値は固定で、言語によって変わりません。
HTTP/1.1 400 Bad Request
Content-Type: application/json
X-Request-Id: req_0c858d8af7f65eca001b2f5a
{
"object": "error",
"error": {
"type": "invalid_request_error",
"code": "quantity_out_of_range",
"message": "Miktar, bu servisin izin verdiği aralığın dışında.",
"param": "quantity",
"doc_url": "https://panelfollows.com/api-docs#error-quantity_out_of_range",
"request_id": "req_0c858d8af7f65eca001b2f5a"
}
}| type | 大まかな分類です。再試行すべきか、呼び出し側の誤りかを示します。 |
| code | 固定の機械可読値です。条件分岐はこの値で書いてください。 |
| message | 指定した言語の、人が読むための説明です。 |
| param | エラーの原因になったフィールド名です (該当する場合)。 |
| doc_url | このドキュメントの該当セクションへのリンクです。 |
| request_id | サポートに問い合わせる際に伝える唯一の参照値です。 |
レート制限
キーごとに毎分 600 リクエスト、さらに IP ごとに毎分 900 リクエストです。すべてのレスポンスに RateLimit-Limit、RateLimit-Remaining、RateLimit-Reset ヘッダーが付くので、上限に達する前に自分で速度を落とせます。上限を超えると 429 と Retry-After ヘッダーが返ります。
ページネーション
リストはカーソルでページ送りします。limit にページサイズ (最大 500)、starting_after に前ページ最後の項目の id を指定してください。has_more が false になるまで続ければよく、next_cursor が次のリクエストに使えるカーソルをそのまま返します。範囲外の limit は黙って切り詰められずエラーになります。黙って切り詰めると、クライアントが「すべて取得できた」と誤解するためです。
重複注文の防止 (Idempotency-Key)
注文を作成するときは、リクエストにランダムな Idempotency-Key ヘッダーを付けてください。通信が切れて同じキーで再試行しても、2 件目の注文は作られません。最初のリクエストのレスポンスがそのまま返り、Idempotent-Replay: true ヘッダーが付きます。記録は 24 時間保持されます。
同じキーを異なるボディで送ると 409 idempotency_key_reuse が返ります。これはほぼ確実に、クライアント側のキー生成が壊れていることを示します。失敗したリクエストがキーを消費することはないので、問題を直して同じキーで再試行できます。
注文の作成
curl -X POST https://panelfollows.com/api/v3/orders \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 8f14e45f-ea3a-4b1c-9c1e-2b0d5c6a7e91" \
-d '{
"service": 1234,
"link": "https://instagram.com/username",
"quantity": 1000
}'サービスのフィールドスキーマ
各サービスは、注文時に必要なフィールドを fields 配列で公開します。フィールド名、型、必須かどうか、上限と下限に加えて、ユーザーの言語のラベルと説明が含まれます。あるフィールドの determines_quantity が true の場合、数量はそのフィールドの行数から算出されます。
// Servisin kendi alan şemasından formu OTOMATİK üretmek:
// hiçbir servis tipini koda gömmeniz gerekmez.
const res = await fetch("https://panelfollows.com/api/v3/services/1234", {
headers: { Authorization: "Bearer YOUR_API_KEY", "Accept-Language": "tr" },
});
const service = await res.json();
for (const field of service.fields) {
renderInput({
name: field.name,
label: field.label, // kullanıcının dilinde
hint: field.description, // kullanıcının dilinde
required: field.required,
type: field.type, // url | integer | string | text_lines
min: field.min,
max: field.max,
// true ise miktarı bu alanın satır sayısı belirler
countsLines: field.determines_quantity === true,
});
}サービスオブジェクト
{
"object": "service",
"id": 1234,
"name": "Instagram Takipçi | Türk | 30 gün telafi",
"description": "Gerçek hesaplardan Türk takipçi. Başlangıç 0-1 saat.",
"type": "default",
"platform": "instagram",
"category": { "slug": "instagram-takipci", "name": "Instagram Takipçi" },
"pricing": {
"rate": "1.2340",
"currency": "USD",
"unit": "per_1000",
"unit_note": "Fiyat 1000 adet içindir."
},
"limits": { "min": 100, "max": 100000 },
"features": { "refill": true, "cancel": false, "dripfeed": true },
"average_time_seconds": 4320,
"fields": [
{
"name": "link",
"type": "url",
"required": true,
"label": "Bağlantı",
"description": "Gönderimin yapılacağı profilin herkese açık adresi."
},
{
"name": "quantity",
"type": "integer",
"required": true,
"label": "Miktar",
"description": "Kaç adet gönderileceği.",
"min": 100,
"max": 100000
}
],
"is_active": true,
"updated_at": "2026-08-20T09:15:00.000Z"
}注文のプレビュー (ドライラン)
POST /orders/preview は、注文を作成せずに検証し、料金を計算します。顧客に価格を提示したり、残高が足りるかを事前に確認したりできます。残高からの引き落としはなく、プロバイダーにも送信されません。
一括注文
POST /orders/batch では 1 回の呼び出しで最大 50 件の注文を送れます。各項目は順に処理され、それぞれが個別の結果を受け取ります。1 件が失敗しても残りは作成され、どれがなぜ失敗したのかは各項目の結果でわかります。
関連オブジェクトの埋め込み
注文系のエンドポイントで include=service を指定すると、サービスオブジェクトがレスポンスに埋め込まれ、2 回目のリクエストが不要になります。
エンドポイントリファレンス
| メソッド | エンドポイント | 説明 |
|---|---|---|
| GET | /api/v3 | Discovery document: version, endpoints, limits and event types. |
| GET | /api/v3/openapi.json | OpenAPI 3.1 schema for this API. |
| GET | /api/v3/account | Account balance, currency and current rate-limit window. |
| PATCH | /api/v3/account | Set the low balance alert threshold that triggers account.low_balance. |
| GET | /api/v3/services | List services with filters and cursor pagination. |
| GET | /api/v3/services/{id} | Retrieve one service, including its order field schema. |
| GET | /api/v3/categories | List categories with their active service counts. |
| GET | /api/v3/platforms | List platform keys usable as the ?platform= filter, with counts. |
| POST | /api/v3/orders | Create an order. Supports the Idempotency-Key header. |
| POST | /api/v3/orders/preview | Validate an order and compute its charge without creating it. |
| POST | /api/v3/orders/batch | Create up to 50 orders in one call; each item reports its own result. |
| GET | /api/v3/orders | List your orders, newest first. |
| GET | /api/v3/orders/{id} | Retrieve one order. |
| POST | /api/v3/orders/{id}/cancel | Request cancellation. Only for services whose features.cancel is true. |
| POST | /api/v3/orders/{id}/refill | Request a refill for a completed order. |
| GET | /api/v3/refills | List your refill requests, newest first. |
| GET | /api/v3/refills/{id} | Retrieve one refill; refreshes its status from the provider. |
| GET | /api/v3/events | Read your event stream oldest-first; the polling alternative to webhooks. |
| GET | /api/v3/webhooks | List your webhook endpoints. |
| POST | /api/v3/webhooks | Register a webhook endpoint. The signing secret is returned once. |
| GET | /api/v3/webhooks/{id} | Retrieve one webhook endpoint. |
| PATCH | /api/v3/webhooks/{id} | Update a webhook endpoint's url, events, description or active state. |
| DELETE | /api/v3/webhooks/{id} | Delete a webhook endpoint and its delivery log. |
| POST | /api/v3/webhooks/{id}/test | Send a test event to this endpoint, ignoring its event filter. |
| POST | /api/v3/webhooks/{id}/rotate_secret | Generate a new signing secret. The old one stops working immediately. |
| GET | /api/v3/webhooks/{id}/deliveries | Delivery log for one endpoint: attempts, response codes and errors. |
OpenAPI スキーマ
すべてのエンドポイントを機械可読な形で定義したものです。このファイルをクライアントジェネレーター (openapi-generator、Kiota) や Postman に読み込ませれば、お使いの言語のクライアントがそのまま手に入ります。
https://panelfollows.com/api/v3/openapi.jsonよくある質問
レガシーキーは v3 でも使えますか
使えます。試すために新しいキーを作る必要はありません。ただし本番環境では v3 キーに移行してください。失効でき、平文で保存されません。
価格が文字列なのはなぜですか
浮動小数点数は小数の金額で端数を失います。金額を文字列で返し、クライアント側で 10 進数型として扱うことで、丸め誤差という問題そのものがなくなります。
unit フィールドが重要なのはなぜですか
ほとんどのサービスは 1000 単位で価格が付きますが (per_1000)、パッケージサービスは 1 件単位で販売され (per_order)、価格はパッケージ全体を指します。この区別を見ずに計算していた連携は、パッケージの価格を 1000 倍間違えていました。
注文は作成されたのにステータスが pending のままです
プロバイダーへの引き渡しが遅れている可能性があります。残高はすでに確保されており、注文が失われることはありません。当社側で自動的に再送します。レスポンスの processing_delayed フィールドがこの状態を示します。
キャンセルとリフィルはすべてのサービスで使えますか
いいえ。サービスオブジェクトの features.cancel と features.refill を確認してください。対応していないサービスで該当エンドポイントを呼ぶと 400 が返ります。
2 つの API を同時に使えますか
使えます。同じアカウント、同じ残高、同じ注文です。v2 で作成した注文を v3 から参照できます。
業界標準となっている従来のリセラー API です。既製のパネルソフトウェアが期待する形式はこれです。
エンドポイント
POST https://panelfollows.com/api/v2
POST https://panelfollows.com/api/v2/tr認証
すべてのリクエストで key パラメーターを送ります。キーは秘密にし、漏れた場合はただちに再発行してください。
リクエストとレスポンスの形式
リクエストは POST でフォーム (application/x-www-form-urlencoded) として送信し、レスポンスは JSON です。失敗した場合も HTTP 200 が返り、ボディに { "error": "..." } が入ります。
これまで記載していませんでしたが、次の方法もサポートしています。GET で呼び出すこともでき、ボディを application/json として送ることもできます。
レート制限
キーごとに毎分 240 リクエスト、さらに IP ごとに毎分 300 リクエストです。超過したリクエストは 429 で拒否されます。
アクションとパラメーター
| action | パラメーター | 説明 |
|---|---|---|
| services | key, action | 有効なサービスをすべて一覧します (id、名前、カテゴリー、価格、最小 / 最大、リフィル、キャンセル、分割配信)。 |
| add | key, action, service, link, quantity[, runs, interval, comments, username, posts, min, max] | 注文を作成します。service はカタログのサービス id です。分割配信には runs と interval を、特殊な種類には対応するフィールドを追加してください。 |
| status | key, action, order | orders | 注文ステータスです。1 件なら order、複数ならカンマ区切りの orders を使います。 |
| balance | key, action | アカウントの残高と通貨です。 |
| refill | key, action, order | orders | リフィル依頼を作成します。依頼はプロバイダーへ直接送られます。 |
| refill_status | key, action, refill | refills | リフィルのステータスを照会します。 |
| cancel | key, action, orders | 注文をキャンセルします。プロバイダーがキャンセルに対応しているサービスでのみ動作します。 |
例
curl -X POST https://panelfollows.com/api/v2 \
-d "key=YOUR_API_KEY" \
-d "action=add" \
-d "service=1234" \
-d "link=https://instagram.com/username" \
-d "quantity=1000"
# Yanıt: { "order": 23501 }トルコ語のレスポンス
アドレスの末尾に /tr を付けると、サービス名、カテゴリー、注文ステータス、エラーメッセージをトルコ語で受け取れます。パラメーター、アクション、レスポンスの構造はまったく同じで、キーもどちらのアドレスでも使えます。技術的なフィールド (type、refill_status、currency) は標準との互換性のため英語のままです。
v3 への移行
移行は必須ではありません。移行する場合も、パラメーター名が変わらないためビジネスロジックの大部分はそのまま残ります。変わるのは通信の形式とエラーの読み取り方です。
- 1キーをボディの key フィールドから Authorization: Bearer ヘッダーへ移します。
- 2action=... の代わりにリソースパスを呼び出します (add の代わりに POST /orders)。
- 3失敗の判定を「error フィールドがあるか」ではなく HTTP ステータスコードと error.code で行います。
- 4注文ステータスは表示用テキストではなく status の機械可読値と比較します。
- 5注文を作成するときに Idempotency-Key を付けます。
- 6ステータスのポーリングを Webhook に置き換えます。
キーはアカウント全体へのアクセス権を与えます。共有しない、クライアント側のコードに埋め込まない、公開リポジトリに上げない、を徹底してください。
v3 キー
キーは必要な数だけ作成でき、それぞれにラベルを付けて 1 本ずつ失効できます。サーバー側にはキーの暗号学的ダイジェストのみが保存されます。
無料アカウントを作成レガシーキー
従来のリセラー API (v2) が使う唯一のキーです。v3 でも使えます。再発行すると、古いキーはその場で無効になります。
セキュリティ
- キーは環境変数に保持し、ソースコードには書かないでください。
- ブラウザーで動くコードにキーを置かず、リクエストは自社のサーバー経由にしてください。
- システムごとに別のキーを作れば、1 本を失効させても他に影響しません。
- 漏えいが疑われる場合は、まず新しいキーを稼働させ、そのあとで古いキーを失効させてください。
注文のステータスが変わると、署名付きの通知をお客様のサーバーへ送信します。ステータスを問い合わせ続ける必要はありません。
なぜ Webhook なのか
ポーリングは遅いうえに無駄が多い方法です。数千件の注文を毎分問い合わせればレート制限を使い切り、それでも変化を知るのは数分後になります。Webhook なら、変化は起きたその瞬間に届きます。
セットアップ
- 1公開された https のアドレスを用意します (ローカルアドレスや内部ネットワークのアドレスは受け付けません)。
- 2下でアドレスを追加し、一度だけ表示される署名キーを保存します。
- 3受信側で署名を検証し、2xx を返します。
- 4テスト送信ボタンで、経路全体を端から端まで確認します。
送信されるリクエスト
POST /hooks/pf HTTP/1.1
Content-Type: application/json
Webhook-Id: evt_7f910fba7cd042ef9d9069ba5c074fa0
Webhook-Timestamp: 1787261223
Webhook-Signature: t=1787261223,v1=9c1e2b0d5c6a7e91...
{
"object": "event",
"id": "evt_7f910fba7cd042ef9d9069ba5c074fa0",
"type": "order.completed",
"created_at": "2026-08-21T00:27:03.531Z",
"data": {
"previous_status": "in_progress",
"order": {
"object": "order",
"id": 23501,
"status": "completed",
"status_label": "Tamamlandı",
"service": 1234,
"quantity": 1000,
"start_count": 4210,
"remains": 0,
"charge": "1.2340",
"currency": "USD"
}
}
}署名の検証
各リクエストには Webhook-Signature ヘッダーが付きます。t はタイムスタンプ、v1 は署名です。署名は、シークレットキーを使って計算した "<タイムスタンプ>.<生のボディ>" という文字列の HMAC-SHA256 です。
- 1ヘッダーから t と v1 の値を取り出します。
- 2リプレイ攻撃を防ぐため、t が 5 分より古くないことを確認します。
- 3"<t>.<生のボディ>" の HMAC-SHA256 をシークレットキーで計算します。
- 4結果を v1 と定数時間で比較し、一致しなければリクエストを拒否します。
検証の例
import crypto from "node:crypto";
import express from "express";
const app = express();
// ÖNEMLİ: imza HAM gövde üzerinden hesaplanır. JSON'a çevirip yeniden
// dizeye dönüştürürseniz boşluklar değişir ve imza tutmaz.
app.post("/hooks/pf", express.raw({ type: "application/json" }), (req, res) => {
const raw = req.body.toString("utf8");
const header = req.get("Webhook-Signature") ?? "";
const m = /t=(\d+),v1=([0-9a-f]+)/.exec(header);
if (!m) return res.sendStatus(400);
const [, timestamp, signature] = m;
// Tekrar saldırısına karşı: 5 dakikadan eski damgayı reddet.
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return res.sendStatus(400);
const expected = crypto
.createHmac("sha256", process.env.WEBHOOK_SECRET)
.update(`${timestamp}.${raw}`, "utf8")
.digest("hex");
const ok =
expected.length === signature.length &&
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
if (!ok) return res.sendStatus(401);
const event = JSON.parse(raw);
// 2xx dönmezseniz gönderim artan aralıklarla tekrar denenir.
res.sendStatus(200);
if (event.type === "order.completed") {
// ... siparişi kendi sisteminizde tamamlandı olarak işaretleyin
}
});再送
最初の送信はイベントの発生と同時に行われます。2xx 以外が返るか接続できなかった場合は、1 分後、5 分後、30 分後、2 時間後、6 時間後に再送します。合計 6 回試みても届かない場合、送信は失敗として記録され、配信ログに表示されます。
イベントの種類
購読したい種類だけを選ぶことも、すべて受け取ることもできます。ステータスが変わると生成されるイベントはちょうど 1 件で、新しいステータスに最もよく合う種類が選ばれます。
| order.created | 注文が作成されました。 |
| order.processing | プロバイダーが注文の処理を開始しました。 |
| order.completed | 注文が完了しました。 |
| order.partial | 注文は一部のみ配信され、残りは返金されました。 |
| order.canceled | 注文がキャンセルまたは返金されました。 |
| order.updated | ステータスが上記以外の形で変わりました。 |
| refill.created | リフィル依頼が作成されました。 |
| refill.updated | リフィルのステータスが変わりました。 |
| account.low_balance | 残高が PATCH /account で設定したしきい値を下回りました。しきい値を下回るたびではなく、下回った時点で一度だけ発生し、残高がしきい値を上回ると再び有効になります。 |
Webhook を用意できない場合
同じイベントは GET /api/v3/events からカーソルで読み取れます。ローカルで開発しているとき、固定 IP がないとき、ファイアウォールの内側にいるときはこの方法を使ってください。
// Webhook kuramıyorsanız (yerelde geliştirme, sabit IP yok) aynı bilgiyi
// imleçle çekebilirsiniz. İmleci kendi tarafınızda saklayın.
let cursor = loadCursor(); // en son işlediğiniz olayın "cursor" değeri
const url = new URL("https://panelfollows.com/api/v3/events");
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("starting_after", String(cursor));
const res = await fetch(url, { headers: { Authorization: "Bearer YOUR_API_KEY" } });
const { data, has_more } = await res.json();
for (const event of data) {
handle(event); // sizin işleyiciniz
cursor = event.cursor; // imleci ilerlet
}
saveCursor(cursor);エラー (48)
| コード | ステータス | 説明 |
|---|---|---|
| missing_api_key | 401 | API キーが送信されていません。'Authorization: Bearer <key>' ヘッダーで送信してください。 |
| invalid_api_key | 401 | 指定された API キーは有効ではありません。 |
| revoked_api_key | 401 | この API キーは失効しているため、使用できません。 |
| account_banned | 403 | このアカウントは利用禁止になっています。 |
| account_suspended | 403 | このアカウントは停止されています。 |
| insufficient_scope | 403 | この API キーには、このエンドポイントへの権限がありません。 |
| invalid_json | 400 | リクエストボディが有効な JSON ではありません。 |
| unsupported_content_type | 415 | サポートされていない Content-Type です。application/json または application/x-www-form-urlencoded を使用してください。 |
| method_not_allowed | 405 | この HTTP メソッドは、このエンドポイントでは使用できません。 |
| payload_too_large | 413 | リクエストボディが大きすぎます。 |
| missing_parameter | 400 | 必須パラメーターが不足しています。 |
| invalid_parameter | 400 | パラメーターの値が不正です。 |
| invalid_link | 400 | リンクが指定されていないか、有効な http(s) URL ではありません。 |
| invalid_quantity | 400 | 数量が有効な正の整数ではありません。 |
| quantity_out_of_range | 400 | 数量がこのサービスで許可されている範囲外です。 |
| invalid_comments | 400 | コメント欄が空か、行数が多すぎます。 |
| invalid_username | 400 | このサービスでは無効なユーザー名です。 |
| invalid_subscription | 400 | サブスクリプションのパラメーターが不正です。 |
| invalid_runs | 400 | ドリップフィードの 'runs' の値が不正です。 |
| invalid_interval | 400 | ドリップフィードの 'interval' の値が不正です。 |
| dripfeed_not_supported | 400 | このサービスはドリップフィードに対応していません。 |
| missing_required_field | 400 | このサービスタイプに必要なフィールドが不足しているか、不正です。 |
| service_inactive | 400 | このサービスは現在注文できません。 |
| invalid_cursor | 400 | ページネーションカーソルが不正です。 |
| invalid_limit | 400 | 'limit' パラメーターが許可された範囲外です。 |
| invalid_webhook_url | 400 | Webhook の URL は公開された https:// のアドレスが必要です。 |
| invalid_events | 400 | 指定されたイベントタイプのうち、1 つ以上が不明です。 |
| batch_too_large | 400 | 1 回のバッチリクエストに含まれる項目が多すぎます。 |
| cancel_not_supported | 400 | このサービスはキャンセルに対応していません。 |
| refill_not_supported | 400 | このサービスはリフィルを提供していません。 |
| unknown_endpoint | 404 | 不明なエンドポイントです。利用可能なルートは API リファレンスをご覧ください。 |
| service_not_found | 404 | この id のサービスは存在しません。 |
| order_not_found | 404 | アカウント内にこの id の注文は存在しません。 |
| refill_not_found | 404 | アカウント内にこの id のリフィルは存在しません。 |
| webhook_not_found | 404 | アカウント内にこの id の Webhook エンドポイントは存在しません。 |
| order_not_cancelable | 409 | 現在のステータスのため、この注文はキャンセルできません。 |
| cancel_rejected | 409 | プロバイダーがキャンセル要求を拒否しました。 |
| order_not_completed | 409 | リフィルは完了した注文にのみ申請できます。 |
| duplicate_link | 409 | このリンクにはすでに進行中の注文があります。完了までお待ちください。 |
| idempotency_key_reuse | 409 | この Idempotency-Key は、別のリクエストボディですでに使用されています。 |
| idempotency_in_progress | 409 | この Idempotency-Key のリクエストは処理中です。しばらくしてから再試行してください。 |
| webhook_limit_reached | 409 | Webhook エンドポイントの上限に達しました。 |
| insufficient_balance | 402 | この注文に必要な残高が不足しています。 |
| rate_limit_exceeded | 429 | レート制限を超えました。Retry-After レスポンスヘッダーをご覧ください。 |
| provider_error | 502 | プロバイダーがエラーを返しました。再試行してください。 |
| refill_failed | 502 | リフィル要求はプロバイダーに拒否されました。 |
| service_temporarily_unavailable | 503 | このサービスは一時的に利用できません。しばらくしてから再試行してください。 |
| internal_error | 500 | 当社側で予期しないエラーが発生しました。 |