開発者向け

API v1リファレンス

REST · JSON · OAuth 2.0 Bearer https://api.manilo.app 安定版 — v1内で破壊的変更はありません

概要

Manilo APIは、iOSアプリで使っているのと同じ台帳 — 口座、カテゴリ、予算、共有グループ、トランザクション — をプログラムから操作するためのJSON REST APIです。インポーターやエクスポーター、同期ブリッジ、ダッシュボードの構築や、独自の自動化の実装に利用できます。

  • ベースURL: https://api.manilo.app(以前のベースURL api.ledgy.app も引き続き利用できます)
  • バージョンプレフィックス: このドキュメントのすべてのエンドポイントは /api/v1/ の下に配置されています。
  • 通信: HTTPSのみ。HTTPでのリクエストは受け付けません。
  • エンコーディング: リクエストとレスポンスのボディはJSON、文字コードはUTF-8。プロパティ名は camelCase です。
  • 認証: Authorization: Bearer … をすべてのリクエストに付与します。
  • Cloudサブスクリプション: すべてのv1エンドポイントで必要です。詳しくはサブスクリプション必須を参照してください。
AIアシスタントをお探しですか?Claude、ChatGPT、Cursorからあなたに代わってManiloを操作したい場合は、Model Context Protocolのエンドポイント https://api.manilo.app/mcp を使います。詳しくは連携をご覧ください。ここで説明しているREST APIは、ご自身で書くコードのためのものです。

クイックスタート

最初の認証済みリクエストまで、3ステップです。

1. パーソナルアクセストークンを発行する

  1. ご自身のManiloダッシュボードにサインインし、設定 → API Access を開きます。
  2. + New token」をクリックします。
  3. トークンにわかりやすい名前を付け(例:「Zapier — 週次エクスポート」)、必要なスコープを選びます(スコープを参照)。有効期限は任意で設定できます。
  4. トークンをコピーします。表示されるのは一度きりです。トークンは接頭辞 lgpat_ と、それに続く16進数64文字で構成されます。

同じページには、有効なトークンが最終使用日時と権限の数とともに一覧表示されます。期限が近づくと「30日以内に期限切れ」の警告が出て、ゴミ箱アイコンからいつでも即座に失効させられます。1つのアカウントで同時に保持できる有効なトークンは、最大25個です。

2. リクエストを送る

cURL口座を一覧取得
# Replace lgpat_… with your token
curl "https://api.manilo.app/api/v1/accounts" \
  -H "Authorization: Bearer lgpat_a1b2c3d4e5…"

3. レスポンスを確認する

200 OKapplication/json
{
  "items": [
    {
      "id": "acc_01HK8V…",
      "name": "Wise EUR",
      "currencyCode": "EUR",
      "initialBalance": 1240.50,
      "icon": "wallet",
      "color": "#4A90E2",
      "order": 0,
      "createdAt": "2026-04-12T08:13:09Z",
      "updatedAt": "2026-05-01T17:02:31Z"
    }
  ],
  "totalCount": 1
}
トークンはパスワードと同じように扱ってください。トークンを持つ人は誰でも、付与されたスコープの範囲であなたの台帳を読み書きできます。漏洩したおそれのあるトークンは、設定 → API Access からただちに失効させてください。

認証

エンドポイント /api/v1/ へのすべてのリクエストには、Authorization ヘッダーが必要です。使用できるトークンは2種類です:

  • パーソナルアクセストークン(PAT) — ダッシュボードの設定 → API Access ページで作成する、長期間有効なベアラートークンです。形式は lgpat_ + 16進数64文字。スコープを指定でき、いつでも失効させられ、有効期限も任意で設定できます。サードパーティ連携にはこちらを推奨します。
  • セッションJWT — ファーストパーティのアプリ(iOS、ダッシュボード)に発行される短命のトークンです。スコープの制限はありません。サインイン済みのセッションから取り出せれば単発のテストに使えますが、正式にサポートされる方法はPATです。

ヘッダーの形式

HTTP
Authorization: Bearer lgpat_a1b2c3d4e5f6…

トークンの上限

  • 1つのManiloアカウントにつき、有効なPATは最大25個です。
  • 作成時に有効期限を任意で設定できます。期限切れのトークンは 401 Unauthorized を返します。
  • 失効させたトークンは、ただちに使えなくなります。Maniloが保存するのはトークンのSHA-256ハッシュだけで、値そのものは保存しません。そのため漏洩したトークンを復元することはできず、失効させて作り直すことになります。

よくある認証エラー

401
トークンがない、形式が不正、期限切れ、または失効しています。
403
トークンは有効ですが、リクエストしたエンドポイントに必要なスコープをPATが持っていないか、Cloudサブスクリプションが有効ではありません。

スコープ

PATはデフォルトで拒否のモデルに従います。トークンが呼び出せるのは、必要なスコープを保持しているエンドポイントだけで、それ以外はすべて 403 Forbidden を返します。連携に本当に必要な、最小限のスコープだけを付与してください。

利用できるスコープ:

accounts:read accounts:write categories:read categories:write budgets:read budgets:write groups:read groups:write transactions:read transactions:write tags:read tags:write recurring:read recurring:write settings:read settings:write

以下の各エンドポイントには、必要なスコープが小さな紫色のチップで表示されます。スコープ :write:read を含みません。両方必要な場合は、両方をリクエストしてください。

サブスクリプション必須

読み取り専用のものも含め、すべてのv1エンドポイントは、呼び出すユーザーに有効なManilo Cloudサブスクリプションがあることを前提とします。サブスクリプションが停止・期限切れになっている場合や、一度も開始されていない場合、APIは次のように応答します:

403 Forbidden
HTTP/1.1 403 Forbidden
X-Subscription-Required: true
Content-Type: application/json

{ "error": "Active cloud subscription required" }

レスポンスの X-Subscription-Required ヘッダーによって、サブスクリプションによるブロックと、一般的な権限エラーをクライアント側で区別できます。アクセスを回復するには、iOSアプリまたは dashboard.manilo.app/upgrade でCloudを再度有効にしてください。

エラー

エラーには標準のHTTPステータスコードを使用します。レスポンスボディは、フィールドが1つだけのJSONオブジェクトです:

JSON
{ "error": "Human-readable message" }

処理すべきステータスコード:

200
OK — リソース、または一覧を返しました。
201
Created — 新しいリソースを作成しました。レスポンスの Location ヘッダーが正規のURLを指します。
204
No Content — 削除に成功しました。ボディはありません。
400
検証に失敗しました — 必須フィールドの欠落、値が範囲外、JSONの形式が不正、など。
401
認証に失敗しました — 詳しくは認証を参照してください。
403
権限がありません — スコープが不足しているか、サブスクリプションが有効ではありません。
404
リソースが見つからないか、権限により参照できません。
409
競合が発生しました — 一意制約違反など。
5xx
サーバー側の障害です。冪等な読み取りであれば、指数バックオフを挟んで再試行して問題ありません。

ページネーションとフィルター

一覧系のエンドポイントは、既定では条件に一致するすべての項目を返します。件数が大きくなり得る唯一のリソースであるトランザクションは、カーソルベースのページネーションに対応しています。

トランザクションのカーソル

cURLページ分割された一覧
curl "https://api.manilo.app/api/v1/transactions?limit=50&type=expense&dateFrom=2026-01-01" \
  -H "Authorization: Bearer lgpat_…"

レスポンスには nextCursor が含まれます。これをクエリパラメータ cursor として渡すと、次のページを取得できます。レスポンスの nextCursornull になったら、最後まで到達したことを意味します。

  • limit — ページサイズ。範囲は 1..200 に丸められます。既定値は 50 です。
  • cursor — 不透明なトークンです。中身は解釈せず、そのまま扱ってください。
  • type, dateFrom, dateTo, categoryId, accountId, groupId — 任意のフィルターです。詳しくはトランザクションの一覧取得エンドポイントを参照してください。

型とフォーマット

  • ID — 不透明な文字列です。解析せず、大文字と小文字を区別するUTF-8の識別子として扱ってください。
  • タイムスタンプ — UTCのISO-8601形式で、末尾に Z が付きます。例: "2026-05-13T10:30:00Z"
  • 日付(トランザクションの date など) — 同じISO-8601の形式ですが、意味を持つのは日付の部分だけです。
  • 金額 — JSONの数値で、単位は主単位、小数点以下は最大4桁です(例: 12.50)。補助単位は使いません。必ず currencyCode と組み合わせて扱われます。
  • 通貨コード — ISO-4217に従い、大文字のアルファベットちょうど3文字です(例: "EUR", "USD", "GBP")。
  • 削除 — 削除の操作はすべて論理削除です。削除した項目は一覧や取得のレスポンスに現れなくなりますが、共有相手や過去のレシートはそのまま保持されます。
  • 副作用 — 口座・カテゴリ・グループを削除しても、それに紐づくトランザクションは残り、参照だけが外れます。口座の削除エンドポイントでは、その動作を明示的に指定できます。

口座

口座は、残高を持つ入れ物です — 銀行口座、クレジットカード、現金の財布、証券口座など。すべてのトランザクションは、いずれか1つの口座(振替の場合は2つ)に紐づきます。

GET /api/v1/accounts accounts:read

認証済みユーザーが所有している、またはアクセスできるすべての口座を返します。

GET /api/v1/accounts/{id} accounts:read

idを指定して口座を1件取得します。見つからない場合は 404 を返します。

POST /api/v1/accounts accounts:write

新しい口座を作成します。作成されたオブジェクトとともに 201Location ヘッダーを返します。

リクエストボディ
フィールド説明
namestring必須表示名。最大100文字。
currencyCodestring必須ISO-4217。ちょうど3文字。
initialBalancenumber必須開始残高。単位は currencyCode
orderinteger必須並び順。小さいほど先に表示されます。
iconstring任意アイコン識別子。取得元は /api/v1/icons。最大50文字。
colorstring任意16進数のカラーコード。例: "#4A90E2"。最大20文字。
iconColorstring任意アイコンの色を上書きします。
リクエスト
POST /api/v1/accounts
{
  "name": "Cash",
  "currencyCode": "EUR",
  "initialBalance": 50.00,
  "order": 2,
  "icon": "wallet",
  "color": "#22C55E"
}
201 Created
{
  "id": "acc_01HK8V…",
  "name": "Cash",
  "currencyCode": "EUR",
  "initialBalance": 50.00,
  "order": 2,
  "icon": "wallet",
  "color": "#22C55E",
  "iconColor": null,
  "shareInviteToken": null,
  "createdAt": "2026-05-13T10:30:00Z",
  "updatedAt": "2026-05-13T10:30:00Z"
}
PUT /api/v1/accounts/{id} accounts:write

既存の口座を置き換えます。ボディは作成と同じで、すべてのフィールドを指定する必要があります。

DELETE /api/v1/accounts/{id} accounts:write

口座を論理削除します。紐づくトランザクションの扱いは、クエリパラメータ action で指定します。

クエリパラメータ
フィールド説明
actionenum任意Detach(既定): 各トランザクションの口座参照を外します。Move: トランザクションを moveTargetAccountId に付け替えます。DeleteAll: 紐づく自分のトランザクションをすべて論理削除します。
moveTargetAccountIdstring任意指定が必須になるのは action=Move のときです。移動先の口座id。

カテゴリ

カテゴリは、そのトランザクションが何のためのものか(食料品、家賃、フリーランス収入など)を表します。システムカテゴリは読み取り専用で全ユーザー共通、ユーザーカテゴリは自由に管理できます。カテゴリグループは、関連するカテゴリをまとめる単位です。

GET /api/v1/categories/system-categories categories:read

Maniloが厳選した「よく使われる」カテゴリ — iOSアプリに最初から入っているセット — を返します。全体でバージョン管理されているため、version をキーにキャッシュしても安全です。

ユーザーカテゴリ

GET /api/v1/categories categories:read

ユーザーが定義したカテゴリをすべて一覧表示します。

GET /api/v1/categories/{id} categories:read

idを指定してユーザーカテゴリを1件取得します。

POST /api/v1/categories categories:write

ユーザーカテゴリを作成します。

リクエストボディ
フィールド説明
namestring必須表示名。最大100文字。
typestring必須"income" または "expense"
orderinteger必須グループ内での並び順。
isPinnedboolean必須ピッカーの先頭に固定します。
categoryGroupIdstring任意親グループのid。グループに属さない場合は null
iconstring任意アイコン識別子。
colorstring任意16進数のカラーコード。
PUT /api/v1/categories/{id} categories:write

ユーザーカテゴリを置き換えます。ボディは作成と同じです。

DELETE /api/v1/categories/{id} categories:write

ユーザーカテゴリを論理削除します。トランザクションは削除されず、categoryId が空になります。

カテゴリグループ

GET /api/v1/categories/groups categories:read

カテゴリグループを一覧表示します。

GET /api/v1/categories/groups/{id} categories:read

カテゴリグループを1件取得します。

POST /api/v1/categories/groups categories:write

カテゴリグループを作成します。

リクエストボディ
フィールド説明
namestring必須表示名。最大100文字。
orderinteger必須並び順。
iconstring任意アイコン識別子。
colorstring任意16進数のカラーコード。
PUT /api/v1/categories/groups/{id} categories:write

カテゴリグループを置き換えます。

DELETE /api/v1/categories/groups/{id} categories:write

グループを論理削除します。配下のカテゴリは残り、categoryGroupId が空になります。

予算

予算は、繰り返される期間ごとに、カテゴリ単位の支出(categoryId がnullの場合は台帳全体の支出)に上限を設けます。グループと共有するには groupId を設定します。

GET /api/v1/budgets budgets:read

すべての予算を一覧表示します。

GET /api/v1/budgets/{id} budgets:read

予算を1件取得します。

POST /api/v1/budgets budgets:write

予算を作成します。

リクエストボディ
フィールド説明
amountnumber必須1期間あたりの上限。0より大きい必要があります。
currencyCodestring必須ISO-4217。
periodinteger必須0 毎週 · 1 毎月 · 2 四半期 · 3 毎年。
startDatestring (ISO-8601)必須最初の期間の開始日。
isActiveboolean必須この予算を現在適用するかどうか。
endDatestring (ISO-8601)任意この日付を過ぎたら集計を停止します。
namestring任意ラベル。最大200文字。
categoryIdstring任意対象のカテゴリ。省略すると支出全体が対象になります。
groupIdstring任意共有するグループ。省略すると個人用になります。
PUT /api/v1/budgets/{id} budgets:write

予算を置き換えます。

DELETE /api/v1/budgets/{id} budgets:write

予算を論理削除します。

グループ

グループは共有の台帳です — 世帯、旅行、シェアハウスなど。メンバー全員が同じトランザクションを見られますが、所有権は各自のままです。メンバーの管理と招待はiOSアプリで行い、ここでのAPIが扱うのはリソースそのものです。

GET /api/v1/groups groups:read

自分が所有している、またはメンバーになっているグループを一覧表示します。

GET /api/v1/groups/{id} groups:read

グループを1件取得します。

POST /api/v1/groups groups:write

グループを作成します。作成した人が所有者になります。メンバーの招待はiOSアプリから行ってください。

リクエストボディ
フィールド説明
namestring必須表示名。最大100文字。
descriptionstring任意自由記述。最大500文字。
iconstring任意アイコン識別子。
colorstring任意16進数のカラーコード。
PUT /api/v1/groups/{id} groups:write

グループのメタデータを置き換えます。

DELETE /api/v1/groups/{id} groups:write

グループを論理削除します。メンバーからは見えなくなり、元のトランザクションは個人のものに戻ります。

トランザクション

トランザクションは、台帳における動詞です。種類は4つ: income, expense, transfer(口座間の振替)、そして adjustment(残高の単発調整)です。基本のエンドポイントは収入と支出を作成し、振替には専用のエンドポイントがあります。大量のデータを扱うインポーター向けには、一括処理版も用意しています。

GET /api/v1/transactions transactions:read

カーソルページネーションとフィルターを使って、トランザクションを一覧表示します。

クエリパラメータ
フィールド説明
limitinteger任意ページサイズ。範囲は 1..200。既定値は 50
cursorstring任意前のレスポンスで返された、不透明な継続トークン。
typestring任意"income", "expense", "transfer"、または "adjustment"
dateFromstring (ISO-8601)任意下限(この日を含む)。
dateTostring (ISO-8601)任意上限(この日を含む)。
categoryIdstring任意特定のカテゴリで絞り込みます。
accountIdstring任意特定の口座で絞り込みます。
groupIdstring任意共有グループで絞り込みます。
200 OK
{
  "items": [ /* TransactionDto[] */ ],
  "totalCount": 317,
  "nextCursor": "eyJrIjoiMjAyNi0wNS0xM1QxMDoz…"
}
GET /api/v1/transactions/{id} transactions:read

トランザクションを1件取得します。

POST /api/v1/transactions transactions:write

収入または支出のトランザクションを1件作成します。振替の場合は /transfer を使います。

リクエストボディ
フィールド説明
typestring必須"income" または "expense"
amountnumber必須正の金額。単位は currencyCode
currencyCodestring必須ISO-4217。
datestring (ISO-8601)必須トランザクションが発生した日時(UTC)。
accountIdstring任意入出金元・入出金先の口座。
categoryIdstring任意カテゴリのラベル。
payeestring任意店名または取引相手。最大200文字。
notestring任意自由記述のメモ。最大2000文字。
groupIdstring任意グループと共有します。
exchangeRatenumber任意為替レート(currencyCode がユーザーのメイン通貨と異なる場合)。
convertedAmountnumber任意ユーザーのメイン通貨に換算した金額。
リクエスト昨日のコーヒー €8.50(Wise)
POST /api/v1/transactions
{
  "type": "expense",
  "amount": 8.50,
  "currencyCode": "EUR",
  "date": "2026-05-12T09:14:00Z",
  "accountId": "acc_01HK8V…",
  "categoryId": "cat_food_drinks",
  "payee": "Pret",
  "note": "Flat white"
}
PUT /api/v1/transactions/{id} transactions:write

トランザクションを置き換えます。ボディは作成と同じです。

DELETE /api/v1/transactions/{id} transactions:write

トランザクションを1件論理削除します。

POST /api/v1/transactions/transfer transactions:write

2つの口座のあいだで振替を作成します。カテゴリはありません。通貨をまたぐ振替では、exchangeRate と、送金先の通貨での convertedAmount を指定してください。

リクエストボディ
フィールド説明
fromAccountIdstring必須送金元の口座。
toAccountIdstring必須送金先の口座。送金元とは別である必要があります。
amountnumber必須送金する金額。単位は currencyCode
currencyCodestring必須送金元の通貨。ISO-4217。
datestring (ISO-8601)必須振替の日付。
exchangeRatenumber任意送金元と送金先の通貨が異なる場合は必須です。
convertedAmountnumber任意送金先に入金される金額。送金先の通貨で指定します。
notestring任意最大2000文字。

一括操作

インポーター向けの機能です。1バッチあたりの上限は100件で、動作はベストエフォートです。1行が不正でも、ほかの行までロールバックされることはありません。成功した項目と行ごとのエラーは分けて返されるため、失敗した分だけを再試行できます。

POST /api/v1/transactions/bulk transactions:write

1回の呼び出しで最大100件のトランザクションを作成します。

200 OK
{
  "items": [ /* successful TransactionDto[] */ ],
  "errors": [
    { "index": 3, "error": "Invalid currency code" }
  ]
}
PUT /api/v1/transactions/bulk transactions:write

1回の呼び出しで最大100件のトランザクションを更新します。各項目には、トランザクションの全ボディに加えて id を含める必要があります。

POST /api/v1/transactions/bulk-delete transactions:write

1回の呼び出しで最大100件のトランザクションを論理削除します。すべてのHTTPクライアントでリクエストボディが受け付けられるよう、POST を使います(DELETE ではありません)。

リクエストボディ
フィールド説明
idsstring[]必須1〜100件のトランザクションid。
200 OK
{
  "deleted": 97,
  "notFound": [ "tx_old1", "tx_old2", "tx_old3" ]
}

トランザクションオブジェクト

フィールド説明
idstring不透明な識別子。
typestringincome · expense · transfer · adjustment.
amountnumber単位は currencyCode
currencyCodestringISO-4217。
exchangeRatenumber | null通貨をまたぐ記録で設定されます。
convertedAmountnumber | null同じ金額を、ユーザーのメイン通貨で表したもの。
datestringISO-8601のUTC。
accountIdstring | null振替の場合は、送金元の口座です。
toAccountIdstring | null振替の場合のみ、送金先の口座。
categoryIdstring | null振替ではnullになります。
groupIdstring | nullグループと共有している場合に設定されます。
payeestring | null店名または取引相手。
notestring | null自由記述。
receiptImagePathstring | null添付されたレシートのパス。取得はレシート用のエンドポイント(v1とは別)から行います。
recurringTransactionIdstring | null定期ルールから生成された行の場合に設定されます。
sourcestring作成元のタグ — api, mobile, web, import など。
createdAtstringISO-8601のUTC。
updatedAtstringISO-8601のUTC。

アイコン

Maniloには、口座・カテゴリ・グループのすべてで使われる、厳選されたアイコンセットとカラーパレットが用意されています。カタログは一度取得してキャッシュし、リソースを作成するときに識別子を使い回してください。

GET /api/v1/icons

カテゴリごとに分類されたアイコンライブラリ全体を、対応するカラーパレットとあわせて返します。バージョン管理されているため、version フィールドをキーにキャッシュしても安全です。

200 OK
{
  "version": "2026.05.10",
  "library": "font-awesome-6",
  "categories": [
    {
      "id": "finance",
      "name": "Finance",
      "icons": [ "wallet", "credit-card", "piggy-bank" ]
    }
  ],
  "colors": [
    { "name": "Blue", "hex": "#4A90E2" },
    { "name": "Green", "hex": "#22C55E" }
  ]
}

バージョニング

  • v1内で破壊的変更はありません。追加するのは、新しいエンドポイント、任意指定の新しいフィールド、新しい列挙値だけです。フィールドの型やnull許容、必須かどうかが変わることはありません。
  • 新しい列挙値は破壊的変更ではありません。未知の type, source、または action の値は、クラッシュさせるのではなく「表示しない」として扱ってください。プロダクトの成長に合わせて追加していきます。
  • 破壊的な変更(もし必要になった場合)は /api/v2/ の下で提供し、少なくとも6か月の並行提供期間と、v1のレスポンスへの非推奨ヘッダーを伴います。

サポート

バグを見つけた、エンドポイントを追加してほしい、ドキュメントにない挙動に出会った — そんなときはヘルプセンターを開くか、support@manilo.app までメールでご連絡ください。問題を報告される際は、リクエストid(レスポンスヘッダー X-Request-Id に返されます)を添えていただけると助かります。

セキュリティに関わるご報告(トークンの漏洩、権限のバイパス、不正な読み取りなど)は、security@manilo.app までご連絡ください。