概要
Manilo APIは、iOSアプリで使っているのと同じ台帳 — 口座、カテゴリ、予算、共有グループ、トランザクション — をプログラムから操作するためのJSON REST APIです。インポーターやエクスポーター、同期ブリッジ、ダッシュボードの構築や、独自の自動化の実装に利用できます。
- ベースURL:
https://api.manilo.app(以前のベースURLapi.ledgy.appも引き続き利用できます) - バージョンプレフィックス: このドキュメントのすべてのエンドポイントは
/api/v1/の下に配置されています。 - 通信: HTTPSのみ。HTTPでのリクエストは受け付けません。
- エンコーディング: リクエストとレスポンスのボディはJSON、文字コードはUTF-8。プロパティ名は
camelCaseです。 - 認証:
Authorization: Bearer …をすべてのリクエストに付与します。 - Cloudサブスクリプション: すべてのv1エンドポイントで必要です。詳しくはサブスクリプション必須を参照してください。
https://api.manilo.app/mcp を使います。詳しくは連携をご覧ください。ここで説明しているREST APIは、ご自身で書くコードのためのものです。
クイックスタート
最初の認証済みリクエストまで、3ステップです。
1. パーソナルアクセストークンを発行する
- ご自身のManiloダッシュボードにサインインし、設定 → API Access を開きます。
- 「+ New token」をクリックします。
- トークンにわかりやすい名前を付け(例:「Zapier — 週次エクスポート」)、必要なスコープを選びます(スコープを参照)。有効期限は任意で設定できます。
- トークンをコピーします。表示されるのは一度きりです。トークンは接頭辞
lgpat_と、それに続く16進数64文字で構成されます。
同じページには、有効なトークンが最終使用日時と権限の数とともに一覧表示されます。期限が近づくと「30日以内に期限切れ」の警告が出て、ゴミ箱アイコンからいつでも即座に失効させられます。1つのアカウントで同時に保持できる有効なトークンは、最大25個です。
2. リクエストを送る
# Replace lgpat_… with your token curl "https://api.manilo.app/api/v1/accounts" \ -H "Authorization: Bearer lgpat_a1b2c3d4e5…"
3. レスポンスを確認する
{
"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/v1/ へのすべてのリクエストには、Authorization ヘッダーが必要です。使用できるトークンは2種類です:
- パーソナルアクセストークン(PAT) — ダッシュボードの設定 → API Access ページで作成する、長期間有効なベアラートークンです。形式は
lgpat_+ 16進数64文字。スコープを指定でき、いつでも失効させられ、有効期限も任意で設定できます。サードパーティ連携にはこちらを推奨します。 - セッションJWT — ファーストパーティのアプリ(iOS、ダッシュボード)に発行される短命のトークンです。スコープの制限はありません。サインイン済みのセッションから取り出せれば単発のテストに使えますが、正式にサポートされる方法はPATです。
ヘッダーの形式
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は次のように応答します:
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オブジェクトです:
{ "error": "Human-readable message" }
処理すべきステータスコード:
- 200
- OK — リソース、または一覧を返しました。
- 201
- Created — 新しいリソースを作成しました。レスポンスの
Locationヘッダーが正規のURLを指します。 - 204
- No Content — 削除に成功しました。ボディはありません。
- 400
- 検証に失敗しました — 必須フィールドの欠落、値が範囲外、JSONの形式が不正、など。
- 401
- 認証に失敗しました — 詳しくは認証を参照してください。
- 403
- 権限がありません — スコープが不足しているか、サブスクリプションが有効ではありません。
- 404
- リソースが見つからないか、権限により参照できません。
- 409
- 競合が発生しました — 一意制約違反など。
- 5xx
- サーバー側の障害です。冪等な読み取りであれば、指数バックオフを挟んで再試行して問題ありません。
ページネーションとフィルター
一覧系のエンドポイントは、既定では条件に一致するすべての項目を返します。件数が大きくなり得る唯一のリソースであるトランザクションは、カーソルベースのページネーションに対応しています。
トランザクションのカーソル
curl "https://api.manilo.app/api/v1/transactions?limit=50&type=expense&dateFrom=2026-01-01" \ -H "Authorization: Bearer lgpat_…"
レスポンスには nextCursor が含まれます。これをクエリパラメータ cursor として渡すと、次のページを取得できます。レスポンスの nextCursor が null になったら、最後まで到達したことを意味します。
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つ)に紐づきます。
/api/v1/accounts
accounts:read
認証済みユーザーが所有している、またはアクセスできるすべての口座を返します。
/api/v1/accounts/{id}
accounts:read
idを指定して口座を1件取得します。見つからない場合は 404 を返します。
/api/v1/accounts
accounts:write
新しい口座を作成します。作成されたオブジェクトとともに 201 と Location ヘッダーを返します。
| フィールド | 型 | 説明 |
|---|---|---|
| name | string | 必須表示名。最大100文字。 |
| currencyCode | string | 必須ISO-4217。ちょうど3文字。 |
| initialBalance | number | 必須開始残高。単位は currencyCode。 |
| order | integer | 必須並び順。小さいほど先に表示されます。 |
| icon | string | 任意アイコン識別子。取得元は /api/v1/icons。最大50文字。 |
| color | string | 任意16進数のカラーコード。例: "#4A90E2"。最大20文字。 |
| iconColor | string | 任意アイコンの色を上書きします。 |
POST /api/v1/accounts
{
"name": "Cash",
"currencyCode": "EUR",
"initialBalance": 50.00,
"order": 2,
"icon": "wallet",
"color": "#22C55E"
}
{
"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"
}
/api/v1/accounts/{id}
accounts:write
口座を論理削除します。紐づくトランザクションの扱いは、クエリパラメータ action で指定します。
| フィールド | 型 | 説明 |
|---|---|---|
| action | enum | 任意Detach(既定): 各トランザクションの口座参照を外します。Move: トランザクションを moveTargetAccountId に付け替えます。DeleteAll: 紐づく自分のトランザクションをすべて論理削除します。 |
| moveTargetAccountId | string | 任意指定が必須になるのは action=Move のときです。移動先の口座id。 |
カテゴリ
カテゴリは、そのトランザクションが何のためのものか(食料品、家賃、フリーランス収入など)を表します。システムカテゴリは読み取り専用で全ユーザー共通、ユーザーカテゴリは自由に管理できます。カテゴリグループは、関連するカテゴリをまとめる単位です。
/api/v1/categories/system-categories
categories:read
Maniloが厳選した「よく使われる」カテゴリ — iOSアプリに最初から入っているセット — を返します。全体でバージョン管理されているため、version をキーにキャッシュしても安全です。
ユーザーカテゴリ
/api/v1/categories
categories:read
ユーザーが定義したカテゴリをすべて一覧表示します。
/api/v1/categories/{id}
categories:read
idを指定してユーザーカテゴリを1件取得します。
/api/v1/categories
categories:write
ユーザーカテゴリを作成します。
| フィールド | 型 | 説明 |
|---|---|---|
| name | string | 必須表示名。最大100文字。 |
| type | string | 必須"income" または "expense"。 |
| order | integer | 必須グループ内での並び順。 |
| isPinned | boolean | 必須ピッカーの先頭に固定します。 |
| categoryGroupId | string | 任意親グループのid。グループに属さない場合は null。 |
| icon | string | 任意アイコン識別子。 |
| color | string | 任意16進数のカラーコード。 |
/api/v1/categories/{id}
categories:write
ユーザーカテゴリを論理削除します。トランザクションは削除されず、categoryId が空になります。
カテゴリグループ
/api/v1/categories/groups
categories:read
カテゴリグループを一覧表示します。
/api/v1/categories/groups/{id}
categories:read
カテゴリグループを1件取得します。
/api/v1/categories/groups
categories:write
カテゴリグループを作成します。
| フィールド | 型 | 説明 |
|---|---|---|
| name | string | 必須表示名。最大100文字。 |
| order | integer | 必須並び順。 |
| icon | string | 任意アイコン識別子。 |
| color | string | 任意16進数のカラーコード。 |
/api/v1/categories/groups/{id}
categories:write
カテゴリグループを置き換えます。
/api/v1/categories/groups/{id}
categories:write
グループを論理削除します。配下のカテゴリは残り、categoryGroupId が空になります。
予算
予算は、繰り返される期間ごとに、カテゴリ単位の支出(categoryId がnullの場合は台帳全体の支出)に上限を設けます。グループと共有するには groupId を設定します。
/api/v1/budgets
budgets:read
すべての予算を一覧表示します。
/api/v1/budgets/{id}
budgets:read
予算を1件取得します。
/api/v1/budgets
budgets:write
予算を作成します。
| フィールド | 型 | 説明 |
|---|---|---|
| amount | number | 必須1期間あたりの上限。0より大きい必要があります。 |
| currencyCode | string | 必須ISO-4217。 |
| period | integer | 必須0 毎週 · 1 毎月 · 2 四半期 · 3 毎年。 |
| startDate | string (ISO-8601) | 必須最初の期間の開始日。 |
| isActive | boolean | 必須この予算を現在適用するかどうか。 |
| endDate | string (ISO-8601) | 任意この日付を過ぎたら集計を停止します。 |
| name | string | 任意ラベル。最大200文字。 |
| categoryId | string | 任意対象のカテゴリ。省略すると支出全体が対象になります。 |
| groupId | string | 任意共有するグループ。省略すると個人用になります。 |
/api/v1/budgets/{id}
budgets:write
予算を置き換えます。
/api/v1/budgets/{id}
budgets:write
予算を論理削除します。
グループ
グループは共有の台帳です — 世帯、旅行、シェアハウスなど。メンバー全員が同じトランザクションを見られますが、所有権は各自のままです。メンバーの管理と招待はiOSアプリで行い、ここでのAPIが扱うのはリソースそのものです。
/api/v1/groups
groups:read
自分が所有している、またはメンバーになっているグループを一覧表示します。
/api/v1/groups/{id}
groups:read
グループを1件取得します。
/api/v1/groups
groups:write
グループを作成します。作成した人が所有者になります。メンバーの招待はiOSアプリから行ってください。
| フィールド | 型 | 説明 |
|---|---|---|
| name | string | 必須表示名。最大100文字。 |
| description | string | 任意自由記述。最大500文字。 |
| icon | string | 任意アイコン識別子。 |
| color | string | 任意16進数のカラーコード。 |
/api/v1/groups/{id}
groups:write
グループのメタデータを置き換えます。
/api/v1/groups/{id}
groups:write
グループを論理削除します。メンバーからは見えなくなり、元のトランザクションは個人のものに戻ります。
トランザクション
トランザクションは、台帳における動詞です。種類は4つ: income, expense, transfer(口座間の振替)、そして adjustment(残高の単発調整)です。基本のエンドポイントは収入と支出を作成し、振替には専用のエンドポイントがあります。大量のデータを扱うインポーター向けには、一括処理版も用意しています。
/api/v1/transactions
transactions:read
カーソルページネーションとフィルターを使って、トランザクションを一覧表示します。
| フィールド | 型 | 説明 |
|---|---|---|
| limit | integer | 任意ページサイズ。範囲は 1..200。既定値は 50。 |
| cursor | string | 任意前のレスポンスで返された、不透明な継続トークン。 |
| type | string | 任意"income", "expense", "transfer"、または "adjustment"。 |
| dateFrom | string (ISO-8601) | 任意下限(この日を含む)。 |
| dateTo | string (ISO-8601) | 任意上限(この日を含む)。 |
| categoryId | string | 任意特定のカテゴリで絞り込みます。 |
| accountId | string | 任意特定の口座で絞り込みます。 |
| groupId | string | 任意共有グループで絞り込みます。 |
{
"items": [ /* TransactionDto[] */ ],
"totalCount": 317,
"nextCursor": "eyJrIjoiMjAyNi0wNS0xM1QxMDoz…"
}
/api/v1/transactions/{id}
transactions:read
トランザクションを1件取得します。
| フィールド | 型 | 説明 |
|---|---|---|
| type | string | 必須"income" または "expense"。 |
| amount | number | 必須正の金額。単位は currencyCode。 |
| currencyCode | string | 必須ISO-4217。 |
| date | string (ISO-8601) | 必須トランザクションが発生した日時(UTC)。 |
| accountId | string | 任意入出金元・入出金先の口座。 |
| categoryId | string | 任意カテゴリのラベル。 |
| payee | string | 任意店名または取引相手。最大200文字。 |
| note | string | 任意自由記述のメモ。最大2000文字。 |
| groupId | string | 任意グループと共有します。 |
| exchangeRate | number | 任意為替レート(currencyCode がユーザーのメイン通貨と異なる場合)。 |
| convertedAmount | number | 任意ユーザーのメイン通貨に換算した金額。 |
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"
}
/api/v1/transactions/{id}
transactions:write
トランザクションを1件論理削除します。
/api/v1/transactions/transfer
transactions:write
2つの口座のあいだで振替を作成します。カテゴリはありません。通貨をまたぐ振替では、exchangeRate と、送金先の通貨での convertedAmount を指定してください。
| フィールド | 型 | 説明 |
|---|---|---|
| fromAccountId | string | 必須送金元の口座。 |
| toAccountId | string | 必須送金先の口座。送金元とは別である必要があります。 |
| amount | number | 必須送金する金額。単位は currencyCode。 |
| currencyCode | string | 必須送金元の通貨。ISO-4217。 |
| date | string (ISO-8601) | 必須振替の日付。 |
| exchangeRate | number | 任意送金元と送金先の通貨が異なる場合は必須です。 |
| convertedAmount | number | 任意送金先に入金される金額。送金先の通貨で指定します。 |
| note | string | 任意最大2000文字。 |
一括操作
インポーター向けの機能です。1バッチあたりの上限は100件で、動作はベストエフォートです。1行が不正でも、ほかの行までロールバックされることはありません。成功した項目と行ごとのエラーは分けて返されるため、失敗した分だけを再試行できます。
/api/v1/transactions/bulk
transactions:write
1回の呼び出しで最大100件のトランザクションを作成します。
{
"items": [ /* successful TransactionDto[] */ ],
"errors": [
{ "index": 3, "error": "Invalid currency code" }
]
}
/api/v1/transactions/bulk
transactions:write
1回の呼び出しで最大100件のトランザクションを更新します。各項目には、トランザクションの全ボディに加えて id を含める必要があります。
/api/v1/transactions/bulk-delete
transactions:write
1回の呼び出しで最大100件のトランザクションを論理削除します。すべてのHTTPクライアントでリクエストボディが受け付けられるよう、POST を使います(DELETE ではありません)。
| フィールド | 型 | 説明 |
|---|---|---|
| ids | string[] | 必須1〜100件のトランザクションid。 |
{
"deleted": 97,
"notFound": [ "tx_old1", "tx_old2", "tx_old3" ]
}
トランザクションオブジェクト
| フィールド | 型 | 説明 |
|---|---|---|
| id | string | 不透明な識別子。 |
| type | string | income · expense · transfer · adjustment. |
| amount | number | 単位は currencyCode。 |
| currencyCode | string | ISO-4217。 |
| exchangeRate | number | null | 通貨をまたぐ記録で設定されます。 |
| convertedAmount | number | null | 同じ金額を、ユーザーのメイン通貨で表したもの。 |
| date | string | ISO-8601のUTC。 |
| accountId | string | null | 振替の場合は、送金元の口座です。 |
| toAccountId | string | null | 振替の場合のみ、送金先の口座。 |
| categoryId | string | null | 振替ではnullになります。 |
| groupId | string | null | グループと共有している場合に設定されます。 |
| payee | string | null | 店名または取引相手。 |
| note | string | null | 自由記述。 |
| receiptImagePath | string | null | 添付されたレシートのパス。取得はレシート用のエンドポイント(v1とは別)から行います。 |
| recurringTransactionId | string | null | 定期ルールから生成された行の場合に設定されます。 |
| source | string | 作成元のタグ — api, mobile, web, import など。 |
| createdAt | string | ISO-8601のUTC。 |
| updatedAt | string | ISO-8601のUTC。 |
アイコン
Maniloには、口座・カテゴリ・グループのすべてで使われる、厳選されたアイコンセットとカラーパレットが用意されています。カタログは一度取得してキャッシュし、リソースを作成するときに識別子を使い回してください。
/api/v1/icons
カテゴリごとに分類されたアイコンライブラリ全体を、対応するカラーパレットとあわせて返します。バージョン管理されているため、version フィールドをキーにキャッシュしても安全です。
{
"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 までご連絡ください。