APIキーは、ログイン後の「設定」の「外部API連携」タブで発行できます。
Claude Code などのAIに使わせる場合は、次のURLの説明書を読ませてから、発行したAPIキーを渡してください。
外部API リファレンス
概要
見積・請求@SOHO の REST API です。 APIキーを使って、請求書・見積書・領収書・顧客の参照と作成、PDFの取得、メールでの送付ができます。 APIキーで扱えるのは、そのキーを発行したワークスペースのデータだけです。
ベースURL
https://invoice.atsoho.com/api/v1
はじめかた
- ログインして「設定」の「外部API連携」タブを開き、「新しいAPIキーを発行」を押します
- 使う機能に合わせてスコープ(権限)を選びます。請求書を作って送付するなら
invoices:writeとcustomers:readが要ります - 表示されたAPIキーを控えます。APIキーは発行時に一度だけ表示されます
GET /api/v1/issuer-profilesで発行者プロフィールの ID を調べます。書類の作成に必要ですGET /api/v1/customersで顧客の ID を調べ、書類を作成します
Claude Code などのAIに使わせる場合
この説明書をMarkdownのまま読めるURLを用意しています。
https://invoice.atsoho.com/docs/api.md
AIにこのURLを読ませてから、APIキーを渡してください。
APIキーは、作業に必要なスコープだけを付けたものを発行することをおすすめします。
メールを送る前に test: true でテスト送信させると、宛先と文面を確かめられます。
認証
APIキーの発行と管理
「設定」の「外部API連携」タブで行います。
・発行時にスコープと有効期限(無期限、30日、90日、180日、1年)を選びます ・発行後もスコープは「権限変更」で変えられます ・無効にしたキー、有効期限が切れたキーは使えなくなります(401が返ります) ・各キーの最終使用日時と、直近24時間のリクエスト数が画面に出ます
認証方法
すべてのリクエストに Authorization ヘッダーを付けます。
Authorization: Bearer inv_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
スコープ(権限)
| スコープ | できること |
|---|---|
invoices:read | 請求書の参照、PDFの取得 |
invoices:write | 請求書の作成・更新・削除、メール送付 |
estimates:read | 見積書の参照、PDFの取得 |
estimates:write | 見積書の作成・更新・削除、メール送付 |
receipts:read | 領収書の参照、PDFの取得 |
receipts:write | 領収書の作成・更新・削除、メール送付 |
customers:read | 顧客の参照 |
customers:write | 顧客の作成・更新・削除 |
発行者プロフィール一覧は、書類(請求書・見積書・領収書)のスコープがどれか1つあれば使えます。
共通仕様
リクエスト形式
本文は JSON で送ります。
Content-Type: application/json
日付は YYYY-MM-DD 形式で指定します(例: 2026-10-01)。時刻付きの形式は受け付けません。
金額は円単位の整数です。
レスポンス形式
成功(1件)
{
"success": true,
"data": { }
}
成功(一覧)
{
"success": true,
"data": [ ],
"pagination": {
"page": 1,
"perPage": 20,
"total": 150,
"totalPages": 8
}
}
エラー
{
"success": false,
"error": "エラーメッセージ",
"code": "VALIDATION_ERROR"
}
削除が成功したときは {"success": true, "data": {"deleted": true}} が返ります。
ページネーション
| パラメータ | 型 | 既定 | 説明 |
|---|---|---|---|
page | number | 1 | ページ番号(1から) |
perPage | number | 20 | 1ページの件数(最大100) |
レート制限
APIキーごとに 1分間に60リクエスト までです(直近60秒の件数で数えます)。 レスポンスヘッダーで残りの回数が分かります。
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1790985600
X-RateLimit-Reset は制限が戻る時刻(UNIX秒)です。
超えると HTTP 429 が返ります。
エラーコード
| コード | HTTPステータス | 意味 |
|---|---|---|
UNAUTHORIZED | 401 | APIキーが無い、形式が違う、無効にされている、有効期限が切れている |
FORBIDDEN | 403 | 必要なスコープが無い |
NOT_FOUND | 404 | 対象が見つからない(指定した顧客や発行者プロフィールが無いときも含む) |
VALIDATION_ERROR | 400 | 入力が正しくない。本文が JSON として読めないときも含む |
RATE_LIMITED | 429 | レート制限を超えた |
INTERNAL_ERROR | 500 | サーバー側のエラー |
関連する書類がある顧客・見積書を削除しようとしたときは、HTTP 400 でコード INTERNAL_ERROR が返ります。
CORS
どのオリジンからでも呼び出せます。
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS
Access-Control-Allow-Headers: Authorization, Content-Type
Access-Control-Max-Age: 86400
発行者プロフィール (Issuer Profiles)
書類の発行元(自社の名義)です。書類の作成時に issuerProfileId として指定します。
ID は画面には出ないので、このAPIで調べてください。
発行者プロフィール一覧
GET /api/v1/issuer-profiles
必要なスコープ: 書類のスコープのどれか1つ
アーカイブしたものは含みません。
レスポンス例
{
"success": true,
"data": [
{ "id": "clxxxxxxxxxxxxxx", "name": "株式会社サンプル", "isDefault": true }
]
}
請求書 (Invoices)
必要なスコープ: invoices:read(参照・PDF)、invoices:write(作成・更新・削除・メール送付)
状態(status)
| 値 | 画面の表示 |
|---|---|
draft | 作成中 |
sent | 送付済 |
paid | 入金済 |
overdue | 未入金 |
請求書一覧
GET /api/v1/invoices
| パラメータ | 型 | 説明 |
|---|---|---|
page | number | ページ番号 |
perPage | number | 1ページの件数 |
status | string | 状態で絞り込む |
customerId | string | 顧客で絞り込む |
search | string | 顧客名で絞り込む(部分一致) |
search は取得したページの中だけを絞り込みます。pagination.total には反映されません。
各請求書には、明細(items)、入金履歴(payments)、顧客(customer の id name email)、入金済みの額(paidAmount)が付きます。
リクエスト例
curl -H "Authorization: Bearer inv_xxxx" \
"https://invoice.atsoho.com/api/v1/invoices?status=sent&page=1&perPage=10"
請求書の取得
GET /api/v1/invoices/{id}
明細、顧客(担当者を含む)、入金履歴、元の見積書が付きます。
請求書の作成
POST /api/v1/invoices
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
issuerProfileId | string | ○ | 発行者プロフィールの ID |
issueDate | string | ○ | 発行日(YYYY-MM-DD) |
items | array | ○ | 明細(1件以上) |
customerId | string | 顧客の ID | |
dueDate | string | 支払期限(YYYY-MM-DD)。省略すると発行日と同じ日 | |
estimateId | string | 元の見積書の ID | |
subject | string | 件名(200字まで) | |
greeting | string | あいさつ文(500字まで) | |
notes | string | 備考(2000字まで) | |
applyWithholding | boolean | 源泉徴収をする | |
isDraft | boolean | true で作成中として保存する |
請求書番号は、発行者プロフィールの採番設定に従って自動で付きます。
明細(items)
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
description | string | 品目 | |
quantity | number | ○ | 数量(0より大きい数) |
unit | string | 単位(例: 式、個、時間) | |
unitPrice | number | ○ | 単価(税抜、0以上の整数) |
taxRate | number | ○ | 税率(%)。通常は 10、軽減税率は 8 |
リクエスト例
curl -X POST \
-H "Authorization: Bearer inv_xxxx" \
-H "Content-Type: application/json" \
-d '{
"issuerProfileId": "clxxxxxxxxxxxxxx",
"customerId": "clyyyyyyyyyyyyyy",
"issueDate": "2026-10-01",
"dueDate": "2026-10-31",
"subject": "10月分業務委託費用",
"items": [
{ "description": "システム開発", "quantity": 1, "unit": "式", "unitPrice": 500000, "taxRate": 10 },
{ "description": "交通費", "quantity": 3, "unit": "回", "unitPrice": 1500, "taxRate": 10 }
]
}' \
"https://invoice.atsoho.com/api/v1/invoices"
請求書の更新
PUT /api/v1/invoices/{id}
本文は作成と同じ形です。明細は送ったもので置き換わります。
isDraft が true でなければ、customerId と1件以上の明細が要ります。
発行者プロフィールは変えられません。
請求書の状態の変更
PATCH /api/v1/invoices/{id}
送ったフィールドだけを変えます。
| フィールド | 型 | 説明 |
|---|---|---|
status | string | 状態(draft sent paid overdue) |
paidAt | string | 入金日(YYYY-MM-DD) |
notes | string | 備考 |
・paid 以外に変えると、入金日は消えます
・paid に変えると、まだ入金されていない残りの額が入金履歴に記録されます
リクエスト例
curl -X PATCH \
-H "Authorization: Bearer inv_xxxx" \
-H "Content-Type: application/json" \
-d '{"status": "paid", "paidAt": "2026-10-20"}' \
"https://invoice.atsoho.com/api/v1/invoices/clxxxxxxxxxxxxxx"
請求書の削除
DELETE /api/v1/invoices/{id}
請求書のPDF
GET /api/v1/invoices/{id}/pdf
PDFのファイルが返ります(Content-Type: application/pdf)。
curl -H "Authorization: Bearer inv_xxxx" -o invoice.pdf \
"https://invoice.atsoho.com/api/v1/invoices/clxxxxxxxxxxxxxx/pdf"
請求書のメール送付
POST /api/v1/invoices/{id}/send-email
必要なスコープ: invoices:write
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
to | string または string[] | ○ | 宛先。誤送信を防ぐため、省略しても顧客のアドレスは補いません |
cc | string または string[] | CC | |
bcc | string または string[] | BCC | |
subject | string | 件名。省略すると、画面の送信画面に最初に出る件名と同じになります | |
body | string | 本文(テキスト)。省略すると、画面の送信画面に最初に出る本文と同じになります | |
attachPdf | boolean | PDFを添付する(既定 true) | |
sendCopyToSelf | boolean | 自社のアドレスに控えを送る(既定 false) | |
test | boolean | テスト送信にする(既定 false) |
・宛先のアドレスはすべて形式を確かめます。正しくなければ 400 が返ります
・body を指定したときも、発行者プロフィールのメール署名が末尾に付きます(本文に既に入っていれば付けません)
・本送信は、画面から送ったときと同じ扱いです。送信履歴に残り、開封が計測され、作成中の請求書は送付済になります
テスト送信(test: true)
・件名の先頭に【テスト】が付きます
・送信履歴に残らず、状態も変わりません
・to の先頭の1件にだけ送ります
リクエスト例(テスト送信)
curl -X POST \
-H "Authorization: Bearer inv_xxxx" \
-H "Content-Type: application/json" \
-d '{"to": "[email protected]", "test": true}' \
"https://invoice.atsoho.com/api/v1/invoices/clxxxxxxxxxxxxxx/send-email"
レスポンス(テスト送信)
{
"success": true,
"data": {
"test": true,
"to": "[email protected]",
"subject": "【テスト】請求書のご送付(202610-001)",
"attachedPdf": true,
"message": "[email protected] にテストメールを送信しました(送信履歴・ステータスは変更していません)"
}
}
レスポンス(本送信)
{
"success": true,
"mailTrackingEmailId": "…",
"trackingEmailId": "…"
}
本送信のレスポンスには data がありません。失敗したときは success: false と error が返ります。
見積書 (Estimates)
必要なスコープ: estimates:read(参照・PDF)、estimates:write(作成・更新・削除・メール送付)
状態(status): draft(作成中)、sent(送付済)、accepted(成約)、expired(失効)
見積書一覧
GET /api/v1/estimates
パラメータは請求書一覧と同じです(page perPage status customerId search)。
見積書の取得
GET /api/v1/estimates/{id}
見積書の作成
POST /api/v1/estimates
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
issuerProfileId | string | ○ | 発行者プロフィールの ID |
issueDate | string | ○ | 発行日(YYYY-MM-DD) |
items | array | ○ | 明細(1件以上。請求書と同じ形) |
customerId | string | 顧客の ID | |
validUntil | string | 有効期限(YYYY-MM-DD)。省略すると発行日と同じ日 | |
subject | string | 件名(200字まで) | |
notes | string | 備考(2000字まで) | |
isDraft | boolean | true で作成中として保存する |
見積書の更新
PUT /api/v1/estimates/{id}
本文は作成と同じ形です。
見積書の状態の変更
PATCH /api/v1/estimates/{id}
| フィールド | 型 | 説明 |
|---|---|---|
status | string | 状態(draft sent accepted expired) |
見積書の削除
DELETE /api/v1/estimates/{id}
請求書を作成済みの見積書は削除できません。
見積書のPDF
GET /api/v1/estimates/{id}/pdf
見積書のメール送付
POST /api/v1/estimates/{id}/send-email
必要なスコープ: estimates:write
本文の形と動きは、請求書のメール送付と同じです。本送信すると、作成中の見積書は送付済になります。
領収書 (Receipts)
必要なスコープ: receipts:read(参照・PDF)、receipts:write(作成・更新・削除・メール送付)
状態(status): draft(作成中)、issued(発行済)
領収書一覧
GET /api/v1/receipts
| パラメータ | 型 | 説明 |
|---|---|---|
page | number | ページ番号 |
perPage | number | 1ページの件数 |
status | string | 状態で絞り込む |
customerId | string | 顧客で絞り込む |
search | string | 顧客名または領収書番号で絞り込む(取得したページの中だけ) |
領収書の取得
GET /api/v1/receipts/{id}
領収書の作成
POST /api/v1/receipts
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
issuerProfileId | string | ○ | 発行者プロフィールの ID |
issueDate | string | ○ | 発行日(YYYY-MM-DD) |
customerId | string | 顧客の ID | |
invoiceId | string | 元の請求書の ID | |
receiptDate | string | 領収日(YYYY-MM-DD)。省略すると発行日と同じ日 | |
amount | number | 金額(0以上の整数) | |
subject | string | 件名 | |
paymentMethod | string | 支払方法(50字まで) | |
notes | string | 備考 |
作成した領収書は作成中(draft)になります。発行済にするには、状態の変更かメール送付を使います。
リクエスト例
curl -X POST \
-H "Authorization: Bearer inv_xxxx" \
-H "Content-Type: application/json" \
-d '{
"issuerProfileId": "clxxxxxxxxxxxxxx",
"customerId": "clyyyyyyyyyyyyyy",
"issueDate": "2026-10-20",
"subject": "コンサルティング費用",
"amount": 110000,
"paymentMethod": "銀行振込"
}' \
"https://invoice.atsoho.com/api/v1/receipts"
領収書の更新
PUT /api/v1/receipts/{id}
送った内容で全体を置き換えます。省いた項目は空になります。
作成中でなければ、customerId issueDate receiptDate amount が要ります。
領収書の状態の変更
PATCH /api/v1/receipts/{id}
| フィールド | 型 | 説明 |
|---|---|---|
status | string | 状態(draft issued) |
領収書の削除
DELETE /api/v1/receipts/{id}
領収書のPDF
GET /api/v1/receipts/{id}/pdf
領収書のメール送付
POST /api/v1/receipts/{id}/send-email
必要なスコープ: receipts:write
本文の形と動きは、請求書のメール送付と同じです。本送信すると、作成中の領収書は発行済になります。
顧客 (Customers)
必要なスコープ: customers:read(参照)、customers:write(作成・更新・削除)
顧客一覧
GET /api/v1/customers
| パラメータ | 型 | 説明 |
|---|---|---|
page | number | ページ番号 |
perPage | number | 1ページの件数 |
search | string | 顧客名で絞り込む(部分一致) |
type | string | corporate(法人)または individual(個人) |
includeArchived | boolean | アーカイブした顧客も含める(既定 false) |
更新が新しい順に並び、各顧客に担当者(contacts)が付きます。
curl -H "Authorization: Bearer inv_xxxx" \
"https://invoice.atsoho.com/api/v1/customers?search=サンプル"
顧客の取得
GET /api/v1/customers/{id}
担当者と、直近の見積書・請求書(各5件)が付きます。
顧客の作成
POST /api/v1/customers
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
name | string | ○ | 顧客名 |
type | string | corporate(法人、既定)または individual(個人) | |
honorific | string | 敬称(既定は法人「御中」、個人「様」) | |
department | string | 部署 | |
contactPerson | string | 担当者名 | |
zipCode | string | 郵便番号 | |
address | string | 住所 | |
phone | string | 電話番号 | |
email | string | メールアドレス | |
corporateNumber | string | 法人番号 | |
invoiceNumber | string | 適格請求書発行事業者の登録番号 | |
notes | string | 備考 | |
defaultIssuerProfileId | string | この顧客に既定で使う発行者プロフィールの ID | |
contacts | array | 担当者(複数可) |
担当者(contacts)
| フィールド | 型 | 説明 |
|---|---|---|
sortOrder | number | 表示順 |
department | string | 部署 |
contactPerson | string | 担当者名 |
phone | string | 電話番号 |
email | string | メールアドレス |
notes | string | 備考 |
顧客の更新
PUT /api/v1/customers/{id}
本文は作成と同じ形です。担当者は送ったもので置き換わります。
顧客の削除
DELETE /api/v1/customers/{id}
請求書または見積書がある顧客は削除できません。
定期請求 (Recurring Invoices)
毎月などの決まった周期で請求書を自動で作る雛形です。実行日になると、この内容で「作成中」の請求書が作られます。
必要なスコープ: invoices:read(参照)、invoices:write(作成・更新・削除)
周期(frequency)
| 値 | 意味 |
|---|---|
monthly | 毎月 |
bimonthly | 隔月 |
quarterly | 3か月ごと |
semiannually | 半年ごと |
annually | 毎年 |
件名・あいさつ文・備考には {{今月}} {{先月}} {{次月}} を書けます。請求書を作るときに「2026年10月」の形に置き換わります。
定期請求一覧
GET /api/v1/recurring-invoices
| パラメータ | 型 | 説明 |
|---|---|---|
page | number | ページ番号 |
perPage | number | 1ページの件数 |
isActive | boolean | true で有効なものだけ、false で停止中のものだけ |
customerId | string | 顧客で絞り込む |
各定期請求には、明細(items)と顧客(customer の id name email)が付きます。
定期請求の取得
GET /api/v1/recurring-invoices/{id}
明細、顧客、直近10回の実行履歴(executions)が付きます。
定期請求の作成
POST /api/v1/recurring-invoices
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
issuerProfileId | string | ○ | 発行者プロフィールの ID |
customerId | string | ○ | 顧客の ID |
name | string | ○ | 定期請求の名前(200字まで) |
items | array | ○ | 明細(1件以上)。形は請求書の作成と同じ |
frequency | string | 周期。省略すると monthly | |
dayOfMonth | number | 実行日(1〜31)。省略すると 1 | |
dueDateOffset | number | 発行日から支払期限までの日数(0〜90)。省略すると 30 | |
startDate | string | 開始日(YYYY-MM-DD)。省略すると今日 | |
endDate | string | 終了日(YYYY-MM-DD)。省略すると期限なし | |
isActive | boolean | false で停止中として作る | |
subject | string | 件名(200字まで) | |
greeting | string | あいさつ文(500字まで) | |
notes | string | 備考(2000字まで) | |
memo | string | 社内メモ(2000字まで。請求書には載りません) | |
pdfColorTheme | string | PDF の配色。作られる請求書に引き継がれます | |
pdfFontFamily | string | PDF の書体。作られる請求書に引き継がれます | |
applyWithholding | boolean | 源泉徴収をする |
定期請求の更新
PATCH /api/v1/recurring-invoices/{id}
送った項目だけが変わります。items を送ると、明細は送ったもので置き換わり、金額も計算し直されます。
frequency dayOfMonth startDate のどれかを送ると、次回の実行日も計算し直されます。
すでに作られた請求書には影響しません。
リクエスト例(明細の品目だけを変える)
curl -X PATCH \
-H "Authorization: Bearer inv_xxxx" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "description": "システム保守・各種相談", "quantity": 1, "unit": "式", "unitPrice": 25000, "taxRate": 10 }
]
}' \
"https://invoice.atsoho.com/api/v1/recurring-invoices/{id}"
定期請求の削除
DELETE /api/v1/recurring-invoices/{id}
雛形を消します。すでに作られた請求書は残ります。
利用例
請求書を作ってテスト送信し、確かめてから送付する
KEY="inv_xxxx"
BASE="https://invoice.atsoho.com/api/v1"
# 1. 発行者プロフィールと顧客の ID を調べる
curl -s -H "Authorization: Bearer $KEY" "$BASE/issuer-profiles"
curl -s -H "Authorization: Bearer $KEY" "$BASE/customers?search=サンプル"
# 2. 請求書を作る
INVOICE_ID=$(curl -s -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"issuerProfileId":"clxxxxxxxxxxxxxx","customerId":"clyyyyyyyyyyyyyy","issueDate":"2026-10-01","dueDate":"2026-10-31","subject":"10月分","items":[{"description":"保守費用","quantity":1,"unit":"式","unitPrice":50000,"taxRate":10}]}' \
"$BASE/invoices" | jq -r '.data.id')
# 3. 自分宛てにテスト送信して、文面とPDFを確かめる
curl -s -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"to":"[email protected]","test":true}' "$BASE/invoices/$INVOICE_ID/send-email"
# 4. 顧客へ送付する
curl -s -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"to":"[email protected]"}' "$BASE/invoices/$INVOICE_ID/send-email"
未入金の請求書を探す
curl -H "Authorization: Bearer inv_xxxx" \
"https://invoice.atsoho.com/api/v1/invoices?status=sent"
記録
APIへのリクエストは、メソッド、パス、HTTPステータス、処理時間、IPアドレス、User-Agent を記録しています。 APIキーの認証に失敗したリクエストは記録しません。