請求書生成API

自社サーバーからプログラムでプロフェッショナルな請求書PDFを生成できます。社内システム、マーケットプレイス、自社のSaaS製品に適しています。

1. 認証#

app.invosend.com/settings/api-keysでAPIキーを作成してください。有料のワークスペースプランとオーナー権限が必要です。

すべてのリクエストで、AuthorizationヘッダーにBearerトークンとしてキーを送信してください:

Authorization: Bearer isk_live_xxxxxxxxxxxxxxxxxxxxxxxx
APIキーが未指定、不正な形式、無効、または失効している場合は403で拒否されます。ワークスペースが無料プラン、停止中、または期限切れの場合もキーは拒否されます。

2. エンドポイント#

POST/api/invoices/generate-external

ベースURL: https://app.invosend.com

機械可読の API 定義:OpenAPI 3.1 と Postman collection。どちらも Postman、Insomnia、SDK ジェネレーターにインポートできます。

3. リクエストボディ#

フィールド型必須説明
customer_namestring必須クライアントまたは請求書受取人の名前。
customer_emailstring任意有効なメールアドレス。この呼び出しで作成された請求書はメール送信されません(このAPIはメールを送信しません)。定期請求書では必須:その後に生成される各請求書がこのアドレスに送信されます。
customer_tax_idstring任意顧客の税務登録番号(インドネシアではNPWP、最大40文字)。請求書の顧客住所の下に印刷されます。
itemsarray必須説明、quantity > 0、price >= 0を含む有効な項目を1つ以上指定してください。
items[].descriptionstring任意商品またはサービス名。空の場合はItemが使われます。
items[].quantitynumber必須数量。小数点以下2桁まで指定できます(例:1.5時間)。範囲は0.01〜999,999です。
items[].pricenumber必須単価。
items[].discountnumber任意項目ごとの割引額。デフォルトは0。
currencystring任意IDRやUSDなどの通貨コード。デフォルトはIDR。
tax_ratenumber任意割引後の小計から計算される税率(%)。デフォルトは0。
due_datestring任意YYYY-MM-DD形式。デフォルトは生成日から14日後。
notesstring任意請求書に表示される追加の備考。
items[].unitstring任意数量の横に表示される単位ラベル(pcsやhourなど)。
items[].tax_ratenumber任意項目ごとの税率上書き(0〜100)。省略した場合、その項目には請求書レベルのtax_rateが使用されます。
discount_totalnumber任意請求書レベルの割引。税金の計算前に差し引かれるため、税額は割引後の金額に対して計算されます(各明細の金額に応じて按分)。デフォルトは0。
templatestring任意使用する請求書テンプレートのID。利用可能なものは GET /api/invoices/external/templates で取得できます。省略すると、設定で選んだデフォルトのテンプレート、次にInvosendのデフォルトが使われます。
document_languagestring任意請求書ドキュメント(PDF とメール)の文言の言語:en(デフォルト)、id, es, fr, de, nl, it, pt, zh, ja, hi, ar(インドネシア語、スペイン語、フランス語、ドイツ語、オランダ語、イタリア語、ブラジルポルトガル語、簡体字中国語、日本語、ヒンディー語、アラビア語)。それ以外の値はエラーで拒否されます。テンプレートがない場合にのみ使われるシンプルな組み込みレイアウトは、常に英語です。
custom_payment_notesstring任意PDFに表示される追加の支払い案内。
footer_textstring任意PDFの下部に表示される短いテキスト。
is_recurringboolean任意定期請求書のシリーズを作成します。この請求書が最初の1通で、以降の請求書はスケジュールに従って自動生成されcustomer_emailに送信されます(1通につき請求書クレジット1)。定期請求書機能を含むプランが必要で、recurring_intervalとcustomer_emailも必要です。
recurring_intervalstring任意シリーズの繰り返し間隔:weekly、fortnightly、monthly、quarterly、semi-annually、yearlyのいずれか。is_recurringがtrueの場合は必須。
recurring_countinteger任意この最初の1通を含むシリーズの請求書の総数:2〜121の整数。デフォルトは4。このフィールドかrecurring_end_dateのどちらか一方のみ指定してください。
recurring_end_datestring任意これ以降は請求書を生成しない日付。YYYY-MM-DD形式で、未来の日付。このフィールドかrecurring_countのどちらか一方のみ指定してください。
payment_gatewaystring任意midtrans、xendit、stripe、paypal、razorpay、mollieのいずれか。ゲートウェイはワークスペースで既に接続されている必要があります。
payment_accountstring任意請求書に紐付ける既存の支払いアカウント(銀行情報)のID。

完全なリクエスト例:

curl -X POST https://app.invosend.com/api/invoices/generate-external \
  -H "Authorization: Bearer isk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_name": "Acme Corp",
    "customer_email": "billing@acme.com",
    "items": [
      { "description": "Consulting Services", "quantity": 2, "price": 75000, "tax_rate": 11 }
    ],
    "discount_total": 7500,
    "currency": "JPY",
    "notes": "Thank you for your business."
  }'

定期請求書の例(最初の1通は今すぐ、以降は毎月1通、合計6通):

curl -X POST https://app.invosend.com/api/invoices/generate-external \
  -H "Authorization: Bearer isk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_name": "Acme Corp",
    "customer_email": "billing@acme.com",
    "items": [
      { "description": "Monthly retainer", "quantity": 1, "price": 375000 }
    ],
    "currency": "JPY",
    "recurring_interval": "monthly",
    "recurring_count": 6
  }'
タイムアウトやネットワークエラーのあとに安全に再試行するには、Idempotency-Key ヘッダー(1〜255 文字。請求書ごとに生成した UUID など)を追加してください。最初のリクエストが成功していた場合、再試行では同じレスポンスが Idempotent-Replayed: true ヘッダー付きで返され、請求書の再作成やクレジットの再消費は行われません(credits_remaining は最初の呼び出し時の値です)。キーはワークスペースごとに 24 時間保持されます。保存されるのは成功したレスポンスのみなので、失敗したリクエストは同じキーで再試行できます。

4. レスポンス#

200 OKは、請求書が作成されPDFが生成されたことを意味します:

{
  "data": {
    "id": "cjld2cjxh0000qzrmn831i7rn",
    "invoice_number": "INV-1-202609-0016",
    "pdf_url": "https://cdn.invosend.com/company/1/pdf/Invoice_INV_1_202609_0016_UNPAID_0da2beeabb.pdf",
    "credits_remaining": 24,
    "is_recurring": false,
    "template": {
      "id": "k3p9x2m7c0000abcd1234efgh",
      "name": "Classic",
      "source": "system_default"
    }
  }
}
ワークスペースが無制限クォータの場合、credits_remainingはnullになります。idは以下の追加エンドポイントでこの請求書を識別するために使用されます。このAPIで作成された請求書は、ワークスペースの請求書一覧にも表示され、手動作成された請求書と同じ請求書番号の連番を使用します。 請求書番号はINV-{ワークスペースID}-{YYYYMM}-{連番}の形式です。定期請求書の場合、レスポンスにはrecurringオブジェクトも含まれます:schedule_id、interval、occurrences、next_issue_date、end_date。 recurring.schedule_id は、以下の定期エンドポイントで使う ID です。

5. エラーコード#

ステータス原因
400必須フィールドの欠落または無効:customer_name、空のitems、有効な項目がない、認識できないpayment_gateway、このワークスペースで接続されていないpayment_gateway、または定期請求書でrecurring_intervalまたはcustomer_emailがない、recurring_count / recurring_end_dateが無効。PDFを生成できなかった場合もこのステータスが返ります。リクエストを再試行してください(クレジットは差し引かれません)。
402ワークスペースのinvoice_credits残高が0です。続行するにはクレジットをチャージしてください。
403Authorizationヘッダーが欠落または不正な形式である、APIキーが無効または失効している、またはワークスペースプランにAPIアクセスが含まれていません。
403(定期請求)is_recurringが指定されましたが、ワークスペースプランに定期請求書機能が含まれていません。
409同じ Idempotency-Key のリクエストがまだ処理中です。少し待ってから再試行してください。
422この Idempotency-Key は別のリクエスト本文で使用済みです。新しい請求書には新しいキーを使用してください。
429レート制限を超過しました。レート制限のセクションを参照してください。

6. レート制限#

範囲制限
ワークスペースごと(すべてのAPIリクエストの合計)Professional 10/min · Specialist 20/min · Business 30/min · Enterprise 60/min
IPアドレスごと(すべてのAPIリクエストの合計)毎分30リクエスト
ワークスペースごとの有効なAPIキー数Professional 3 · Specialist 5 · Business 10 · Enterprise 20
請求書の生成と、読み取り/管理系エンドポイントは同じ制限を共有します。成功レスポンスにはX-RateLimit-LimitとX-RateLimit-Remainingヘッダーが含まれます。ワークスペースのAPIクォータは、Invosendのメンバーシッププランごとに設定されています。より高い本番環境のボリュームが必要ですか?ワークスペースアカウントからお問い合わせください。 失効したキーはキー数の上限に含まれません。

7. 追加エンドポイント#

同じAPIキーを使用して、generate-externalで作成した請求書を読み取り・管理することもできます:

メソッドパス説明
GET/api/invoices/externalこのワークスペースの請求書一覧を取得します。?status=および?page=/?pageSize=クエリパラメータに対応しています。
GET/api/invoices/external/templatestemplate で指定できる請求書テンプレートの一覧。プランで利用できるか、どれがデフォルトかも分かります。
GET/api/invoices/external/:idid(generate-externalが返す値)で1件の請求書を取得します。
PUT/api/invoices/external/:id/status請求書のステータスを更新します。ボディ:{ "status": "paid" }(unpaid、paid、overdue、cancelledのいずれか)。
PUT/api/invoices/external/:id/archive請求書をアーカイブまたはアーカイブ解除します。ボディ:{ "is_archived": true }。
POST/api/invoices/external/:id/pdf必要に応じて再生成し、PDFのURLを再取得します。強制的に再生成するにはボディ:{ "force": true }。
GET/api/invoices/external/recurring定期シリーズの一覧を取得します。?status=(active、paused、completed)と ?page=/?pageSize= に対応しています。
GET/api/invoices/external/recurring/:id1 つのシリーズ(generate-external が返す recurring.schedule_id)を、すべての回の日付・ステータス・各回で作成された請求書の id とともに取得します。
PUT/api/invoices/external/recurring/:id/statusシリーズを一時停止または再開します。ボディ:{ "status": "paused" } または { "status": "active" }。再開には定期請求書を含むプランが必要です。
PUT/api/invoices/external/recurring/:id/extend最後の回の後ろに回を追加します。ボディ:{ "count": 3 } または { "end_date": "2027-12-31" }。
PUT/api/invoices/external/recurring/:id/frequencyシリーズの繰り返し頻度を変更します。まだ作成されていない今後の回は置き換えられます。ボディ:{ "frequency": "monthly", "start_date": "2027-01-01", "count": 6 }(count の代わりに end_date も使用可。start_date は未来の日付)。
POST/api/invoices/external/recurring/:id/skip今後の回を 1 つ削除します。ボディ:{ "date": "2027-01-01" }。すでに請求書を作成した回は削除できません。
オンライン決済を受け付けるには、generate-externalでpayment_gateway(必要に応じてpayment_accountも)を指定し、請求書の公開支払いページhttps://app.invosend.com/p/invoice/{id}(idはAPIが返す値)を顧客に送ってください。顧客はそのページで接続済みのゲートウェイから支払い、請求書は自動的に支払い済みになります。決済はこのページが処理するため、別途呼び出す公開チェックアウト用エンドポイントはありません。

8. Webhook#

ポーリングの代わりに HTTPS の URL を登録すると、請求書が変更されるたびに Invosend がその URL へ JSON 本文の POST リクエストを送信します。エンドポイントは 設定 > Webhooks で追加できます(ワークスペースのオーナー、API アクセス付きのプラン、最大 5 件)。各エンドポイントには固有の署名シークレットがあり、表示されるのは一度だけです。

イベントは、ダッシュボードで作成された請求書とこの API で作成された請求書の両方で送信されます。定期請求のテンプレートは送信されません。

イベント送信されるタイミング
invoice.created請求書が作成されたとき。PDF がまだ準備できていない場合があるため、pdf_url は null になることがあります。
invoice.paidステータスが paid に変わったとき(ご自身、API、またはオンライン決済による)。
invoice.overdueステータスが overdue に変わったとき(期日経過後の自動変更、または手動)。
invoice.cancelledステータスが cancelled に変わったとき。

すべてのイベントは同じ形式です。data.object は請求書で、GET /api/invoices/external/:id と同じ形です。ステータスのイベントには data.previous_status も含まれます:

{
  "id": "evt_9f2c1b7a4e3d5c6b8a1f0e2d",
  "object": "event",
  "type": "invoice.paid",
  "created": "2026-10-01T09:30:12.000Z",
  "data": {
    "object": {
      "id": "cjld2cjxh0000qzrmn831i7rn",
      "invoice_number": "INV-1-202610-0007",
      "customer_name": "Acme Corp",
      "customer_email": "billing@acme.com",
      "currency": "USD",
      "subtotal": 500,
      "discount_total": 0,
      "tax_rate": 0,
      "tax_amount": 0,
      "amount": 500,
      "amount_paid": 500,
      "amount_credited": 0,
      "amount_received": 500,
      "invoice_status": "paid",
      "is_archived": false,
      "is_recurring": false,
      "recurring_interval": "none",
      "issue_date": "2026-10-01T02:15:40.000Z",
      "due_date": "2026-10-15",
      "paid_at": "2026-10-01T09:30:11.000Z",
      "pdf_url": "https://cdn.invosend.com/company/1/pdf/Invoice_INV_1_202610_0007_PAID.pdf",
      "pdf_status": "ready"
    },
    "previous_status": "unpaid"
  }
}

各リクエストには次のヘッダーが付きます。検証するには、エンドポイントのシークレットで {t}.{生の本文} の HMAC-SHA256 を計算して v1 と比較し、t が 5 分より古い場合は拒否してください:

POST /your/webhook/url
Content-Type: application/json
Invosend-Event: invoice.paid
Invosend-Delivery: evt_9f2c1b7a4e3d5c6b8a1f0e2d
Invosend-Signature: t=1790847012,v1=5b1d...e9a2

// Node.js
import crypto from "crypto";

function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
  const expected = crypto
    .createHmac("sha256", secret)
    .update(parts.t + "." + rawBody)
    .digest("hex");
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}
10 秒以内に任意の 2xx ステータスを返してください。それ以外の場合は最大 7 回まで再試行されます(1 分後、5 分後、30 分後、2 時間後、6 時間後、12 時間後、24 時間後)。失敗し続けるエンドポイントは無効になり、通知されます。イベントは複数回、または順不同で届くことがあります。重複はイベントの id で無視し、invoice_status を正としてください。配信ログは 30 日間保存され、設定 > Webhooks から任意のイベントを再送できます。

9. 制限事項#

このAPIは、意図的に請求書生成と軽量な請求書管理に範囲を限定しています。以下は現時点では利用できません:

  • Webhook の対象は、請求書の作成・支払い済み・期限超過・キャンセルのみです。編集やアーカイブなどその他の変更は送信されません。現在の状態は GET /invoices/external/:id で取得してください。
  • 各リクエストで作成された請求書はメール送信されません。このAPIはPDFの生成のみを行うため、顧客への送付はご自身で行うか、ダッシュボードをご利用ください。例外は定期シリーズで、スケジューラが生成する後続の各請求書はcustomer_emailに自動送信されます。
  • 作成後の請求書編集は不可 — このAPIで変更できるのは、ステータスとアーカイブ状態のみです。
  • 支払いゲートウェイの利用には、ダッシュボードで事前にゲートウェイが接続されている必要があります。このAPIは請求書に紐付けるだけで、単独でゲートウェイを接続することはできません。
  • 定期シリーズは API から一時停止・再開・延長・スケジュール変更・今後の回のスキップができますが、内容(明細・顧客・金額)の編集やシリーズの削除は API からはできません。ダッシュボードで行ってください。

よくある質問#

Invosend APIキーはどのように取得しますか?

app.invosend.comでアカウントを作成し、ワークスペースを有料プランにアップグレードした後、Settings > API Keysを開き、Generate keyをクリックしてください。生のキーは作成時に一度だけ表示されます。

請求書生成APIの呼び出し1回あたりの料金はいくらですか?

成功したリクエストごとに、ワークスペース残高から請求書クレジット1件が差し引かれます。ダッシュボードから作成した請求書と同じ請求書クレジットプールを使用します。

このAPIのレート制限はどのくらいですか?

ワークスペースのレート制限は、有料プランの設定に従います。上のRate Limitセクションに、各プランの現在の上限が記載されています。