クイックスタート
始める前に、Eraのアカウントと、少なくとも1つの金融機関の接続が必要です。接続がないと、これらのエンドポイントは返すものがありません。
- 1
Eraにサインインし、まだなら金融機関を接続します。
- 2
ダッシュボードのAPIキーを開いてキーを作成します。スコープは最初からすべてチェックが入っているので、要らないものを外してください。これらのエンドポイントに残すのはbanking:readです。有効期限も選びます。無期限という選択肢はありません。
- 3
キーをコピーします。表示は一度だけで、再表示はできません。コピーしてシークレットマネージャーなど安全な場所に保管してください。キーを紛失した場合、二度と表示できません。代わりに新しいキーを作成してください。
- 4
リクエストのヘッダーに載せて送ります。
cURL
curl "https://forge.era.app/api/banking/transactions?page=1&pageSize=20" \
-H "X-API-Key: fmk_your_key_here"
レスポンス · 200
{
"transactions": [ … ],
"pagination": {
"currentPage": 1,
"pageSize": 20,
"totalItems": 412,
"totalPages": 21
},
"historyWindowApplied": true,
"historyWindowFloorDate": "2026-06-28",
"historyWindowHiddenCount": 137,
"historyWindowEarliestDate": "2024-03-02",
"historyWindowDegraded": false
}
利用可能なAPI
Era APIには次のAPIが含まれます:
- GET/banking/accounts
接続しているすべての金融機関にわたる、閲覧できるすべての口座。
- GET/banking/accounts/{accountId}/balance
一つの口座の残高。負債の場合はクレジット関連のフィールドも含む。
- GET/banking/accounts/summary
閲覧できるすべての口座の合計。
- GET/banking/transactions
取引履歴を、ページ単位で。
- PUT/banking/transactions/{id}
取引を一件変更する
- PUT/banking/transactions/bulk
一度に100件まで変更する
- GET/banking/categories
カテゴリ体系全体。サブカテゴリも入れ子で。
- POST/banking/categories
カテゴリを追加する
- GET/banking/tags
アカウントのすべてのタグを、一回のレスポンスで。
- POST/banking/tags
タグを作成する
認証
キーは次のいずれかの方法で送ってください:
| 方法 | 認証情報 |
|---|---|
| ヘッダー | X-API-Key: fmk_your_key_here |
| ベアラートークン | Authorization: Bearer fmk_your_key_here |
すべてのリクエストはTLSで暗号化されます。
キーには有効期限があり、作るときにどれくらいで切れるかを選びます。最長は無料プランで90日、有料プランで365日です。無期限という選択肢はないので、これを使って作るものには、期限が来る前にキーを入れ替える段取りが要ります。
レスポンスヘッダー
すべてのレスポンスには次が含まれます:
| ヘッダー | 説明 |
|---|---|
| fly-request-id | リクエストを一意に識別するIDです。特定のリクエストについてサポートに連絡する際はこれを伝えてください。参照: リクエストID |
エラー
このAPIが返すエラーのステータスコードは次のとおりです:
- 400
不正な入力: パラメータの誤り、空または100件を超える一括更新、あるいは同じ呼び出しで同じフィールドを設定と解除の両方を行う書き込み。
- 401
キーがない、または解析できないキー。X-API-Keyヘッダーかベアラートークンとして送ってください。
- 402
プランのクォータに引っかかっています — 現時点ではカテゴリ作成にのみ当てはまります。
- 403
キーがこの呼び出しに必要なスコープを持っていない — または、二つの取引書き込みのいずれかで、idが他人のものか、そもそも存在しない場合。APIはこの二つを区別しません。
- 409
書き込み中に別の何かがその行を変更しました。もう一度読み込んで、もう一度書き込んでください。
エラーの形
すべてのエラーは同じ形で返ります: statusCode、message、そして何が問題だったかを示すerrorsオブジェクトです。キーがない、または無効な場合は、本文なしで返ることもあります。
例
{
"statusCode": 403,
"message": "One or more errors occurred!",
"errors": {
"generalErrors": ["Transaction does not belong to the authenticated user"]
}
}
リクエストID
すべてのレスポンスにはfly-request-idヘッダーが付きます。特定のリクエストについてサポートに連絡する際はこれを伝えてください。
cURL
# Print the response headers, including fly-request-id; discard the body
curl -sS -D - -o /dev/null "https://forge.era.app/api/banking/transactions?page=1&pageSize=20" \
-H "X-API-Key: fmk_your_key_here"
cURL(書き込み呼び出し)
# A write call: same header, plus a JSON body
curl -sS -D - -X PUT "https://forge.era.app/api/banking/transactions/utgr_your_transaction_id" \
-H "X-API-Key: fmk_your_key_here" \
-H "Content-Type: application/json" \
-d '{"categoryKey": "fcat_dining", "merchantName": "Corner Cafe"}'
よくあるエラー
同じ書き込みでフィールドを設定と解除の両方を行う — 400。
一括更新で100件を超えるid — 400、何も変更されません。1件未満も同様です。
自分のものではない、あるいは存在しない取引 — 403、404にはなりません。つまりレスポンスは、そのidが存在するかどうかを決して教えず、ただ「あなたのものではない」とだけ伝えます。
他の何かが先にその行を変更した — 409。
制限
ドキュメント化された10のエンドポイントのうち2つは、1回の呼び出しでリクエストできる量に上限があります。残りの8つにはありません。
上限がないからといって無制限というわけではありません: キーには引き続き有効期限があり、書き込みには引き続きフィールド長の制限があり、プランによっては古い履歴が引き続き隠されることがあります。これらはいずれもレート制限ではありません — 下記を参照してください。
アカウント、残高、サマリー、カテゴリ、タグ、そして単一トランザクションの書き込みには、呼び出しごとの量的な上限がありません。指定したセット全体、または指定した1行がそのまま返されます。
pageSizeは拒否ではなく100に切り詰められます。それ以上を要求しても、200とともに100件が返ってきます — 送った値を信じるのではなく、レスポンスのpagination.pageSizeを読んでください。
取引の一括書き込みは100件のidに制限されており、pageSizeと違って切り詰めではなく拒否されます: 101件送ると400が返り、何も変更されません。
キーは作成時に選んだスケジュールで期限切れになります — 無料プランで最大90日、有料プランで365日です。無期限のオプションはありません。
プランによっては、古い取引を隠す履歴ウィンドウの下限が適用されることがあります。取引のレスポンスには、下限が適用されたかどうかとその位置を示すhistoryWindowフィールドが含まれます。
プランはAPIリクエストの割り当ても示します — 無料プランで500件、有料プランではさらに多くなります。
ここにないもの: 現時点ではRESTにリクエスト単位のスロットリングはなく、429も、レート制限ヘッダーもありません — つまり漏えいしたキーは、こちら側の仕組みでは何にも減速されません。キーについて少しでも不安があれば、取り消してください: それで即座に遮断されます(上のセキュリティとキー管理を参照)。そしてこのAPIはベータ版なので、それがずっと続くとは思わないでください。
共通の決まり
レスポンスのフィールドはcamelCaseです。クエリパラメータは大文字と小文字を区別しないので、こちらもcamelCaseで通ります。公開している仕様書ではPascalCaseで書かれているため、両方の書き方を見かけることになります。
暦の上の一日を指すフィールドはYYYY-MM-DDです。ある瞬間を指すフィールドは、オフセット付きのISO 8601です。
ページの大きさは、はねつけられるのではなく丸められます。pageSizeに500を指定しても、返るのは100件と200であって、エラーではありません。送った値を信じるのではなく、pagination.pageSizeを読み返してください。
レスポンスには、このページに載っていないフィールドが入っていることがあります。知らないものはエラーにせず読み飛ばしてください。そうしておけば、APIが広がっても手元のクライアントは動き続けます。
RESTは素のHTTPなので、呼び出すのにSDKは要りません。HTTPクライアントのある言語ならどれでも大丈夫です。インストールするものはありません。
セキュリティとキーの扱い
エージェントを承認するとキーが一つ作られます
OAuthでエージェントを承認すると、EraはそのためのAPIキーを作ります。自分で作ったキーと同じダッシュボードの一覧に、クライアント自身の名前からEraが組み立てた名前で並びます。
名前の付き方
Auto -- Claudeその画面で承認したスコープをそのまま持ち、それ以外は持ちません。ダッシュボードから失効させれば、再度承認するまでエージェントはアカウントに届かなくなります。
素のREST呼び出しは記録されません
キーの作成と失効はどちらもアクティビティログに残り、エージェントがMCPで行うツール呼び出しもすべて残ります。REST呼び出しは一件ごとには残りません——読み取りでも書き込みでも、今日のところこの経路にリクエスト単位のログはありません。
キーに不安を感じたら、失効させてください。失効はすぐに効き、RESTとMCPの両方でそのキーを止めます。作り直しにかかるのは1分です。
| 項目 | 意味 |
|---|---|
| スコープは粗い | banking:readはこのページの六つの読み取りよりずっと広い範囲を読みます。同じスコープがアカウントの残りの読み取り、つまり残高、保有資産、接続、支出までカバーします。スコープはこれひとつ、これより狭い選択肢はありません。 書き込み系のスコープも、読み取り系と同じく選択肢に入っています——キーはあなたのアカウントとして動くので、パスワードと同じように扱ってください。口座の一部ではなく、アカウント全体として動きます。 banking:writeが変更・管理できるのはカテゴリ、タグ、取引のメタデータに加えて、手動アカウントと残高、そして金融機関の接続・解除です — このページのどのスコープも、あなたの銀行口座間でお金を動かすことはできません。 |
| スコープは更新されない | キーのスコープは作成時に決まり、あとから変わることはありません。これは、スコープに含まれてはいてもまだ使えないものについて効いてきます。今日social:writeを渡せば、共有ビューが使えるようになった日にもそのキーはそれを持ったままです。今使うものだけを渡し、いつか使うかもしれないものは渡さないでください。 |
| 承認は不要 | あなたはすでに自分のアカウントにサインインしているので、キーの作成にほかの人の承認は要りません。審査も順番待ちもなく、Eraの誰かが申請を承認することもありません。作成した瞬間にアクティビティログへ記録されるので、身に覚えのないキーはすぐに気づけます。 |
| 銀行のログイン情報には届かない | キーは銀行のログイン情報に届きません。Eraがそれを持っていないからです。入力するのはデータ提供事業者が用意した接続画面で、Eraの画面ではありません。Eraが後に保持するのは接続ごとのアクセストークンだけで、AES-256で暗号化されて保存され、金融機関の接続を解除すれば捨てられます。 |
| 保存されるのはハッシュのみ | キーは256ビットのランダムなデータで、保存前にSHA-256でハッシュ化されます。手元に残るのはハッシュであってキーではありません。紛失したら失効させて作り直してください。 |
主なリソース
口座
必要なスコープ
banking:read接続済みの金融機関をまたいで、見えている口座をすべて返します。外してある口座の件数も一緒に付きます。どの口座にも、残高のエンドポイントがパスで受け取る値であるaccountGroupKeyと、その口座が属するconnectionIdが入っているので、まずはこの呼び出しから始めてください。connectionIdで一つの接続に絞り込め、includeExcludedで自分が隠した口座も含められます。
connectionId任意 | 一つの接続の口座だけに絞り込みます。 |
|---|---|
includeExcluded任意 | tier除外や非表示の口座も含め、残高を難読化して返します。デフォルトはfalseです。 |
レスポンス · 200
{
"accounts": [
{
"accountGroupKey": "uagr_7f3c9a21",
"connectionId": "ucon_4b19e02c",
"name": "Everyday Checking",
"currentBalance": 4820.16,
"supportsTransactions": true,
…
}
],
"excludedAccountCount": 1
}
自分が隠した口座や、プランの対象外になっている口座では、残高のフィールドはゼロではなくnullで返ります。nullは「空」ではなく「伏せてある」という意味です。supportsTransactionsのnullも同じ考え方で、Eraには言えないという意味であって、答えが「いいえ」だという意味では決してありません。
口座の残高
必要なスコープ
banking:read一つの口座の残高です。その口座が負債なら、クレジット関連のフィールドも埋まります。パスで受け取るのはその口座のaccountGroupKeyで、/banking/accountsがその口座について返すのと同じ値です。形の違うキーは、照会が走る前に弾かれます。
レスポンス · 200
{
"accountGroupKey": "uagr_7f3c9a21",
"currentBalance": 4820.16,
"availableBalance": 4712.03,
"creditLimit": null,
"currencyCode": "USD",
"availableCredit": null,
"asOf": "2026-08-11T09:32:00Z",
"visibility": null
}
隠した口座も、接続が切れた口座も、返ってくるのは200のままで、残高のフィールドがnullになります。404が返るのは、その口座が本当に存在しないときだけです。ここではvisibilityのフィールドに注意してください。口座が見えているときはnull、見えていないときはtier_excludedのような文字列が入ります。
口座のまとめ
必要なスコープ
banking:read見えている口座の合計です。totalAssets、totalLiabilities、そして前者から後者を引いたnetWorthHintが入ります。パラメータはありません。
レスポンス · 200
{
"userId": "7d1c0b93a8e24f60",
"accounts": [ … ],
"totalVisibleCount": 6,
"totalHiddenCount": 2,
"totalAssets": 48210.75,
"totalLiabilities": 9327.40,
"netWorthHint": 38883.35,
"computedAt": "2026-08-11T09:32:00Z"
}
netWorthHintが数えるのはこのレスポンスに入っている口座だけなので、何が抜けているかはtotalHiddenCountが教えてくれます。確定した純資産ではなく、出発点の数字として扱ってください。
取引
必要なスコープ
banking:read取引を1ページずつ、ページ数の情報と一緒に包んで返します。pageとpageSize(上限は100)を受け取り、口座、期間、適用済みルール、付与済みタグでの絞り込みも指定できます。
accountId任意 | 一つの口座の取引に絞り込みます。その口座のaccountGroupKeyで指定します。 |
|---|---|
fromDate任意 | この日付以降の取引だけを返します。 |
toDate任意 | この日付以前の取引だけを返します。 |
page任意 | ページ番号。1から始まります。デフォルトは1です。 |
pageSize任意 | 1ページあたりの件数。デフォルトは50で、100までに制限されます。 |
sortBy任意 | 並べ替えるフィールド:transactionDate、amount、description、category、merchantNameのいずれか。 |
sortDirection任意 | ascまたはdesc。デフォルトは降順です。 |
categoryKey任意 | 一つのカテゴリの取引だけに絞り込みます。fcat_キーで指定します。 |
search任意 | 加盟店名、説明、カテゴリ、口座名、金額を対象にした全文検索です。 |
ruleIds任意 | 自動化ルールが適用された取引だけに絞り込みます。ルールのキーで指定します。 |
tagKeys任意 | 指定したタグのいずれかが付いた取引だけに絞り込みます。 |
reviewStatus任意 | needs_review、reviewed、flaggedのいずれかです。 |
includeChildren任意 | categoryKeyを指定したとき、その下位カテゴリも含めます。デフォルトはfalseです。 |
レスポンス · 200
{
"transactions": [ … ],
"pagination": {
"currentPage": 1,
"pageSize": 20,
"totalItems": 412,
"totalPages": 21
},
"historyWindowApplied": true,
"historyWindowFloorDate": "2026-06-28",
"historyWindowHiddenCount": 137,
"historyWindowEarliestDate": "2024-03-02",
"historyWindowDegraded": false
}
プランによっては履歴ウィンドウの境目が適用され、それより古い取引は隠れます。レスポンスにhistoryWindowのフィールドが並んでいるのはそのためです。historyWindowAppliedは境目が実際に何かを隠したことを示し、historyWindowFloorDateはその境目の位置、historyWindowHiddenCountは後ろに何件あるか、historyWindowEarliestDateは履歴が実際にどこまで遡れるかを示します。これがないと、件数が少ない結果は「それ以上古い取引がない口座」と見分けがつきません。このうち二つは書くコードを左右します。historyWindowHiddenCountは境目が適用されていてもnullになることがあるので、nullはゼロではなく「不明」として読んでください。historyWindowDegradedがtrueのときは、その読み取りでEraがプランを確認できていないため、境目の日付は事実ではなく推測です。プランを確認できた有料の読み取りでは境目は適用されず、historyWindowAppliedはfalseで返ります。
プランにはAPIリクエストの割り当ても示されています。無料プランは500、有料プランはいずれもそれ以上です。現在の数値は、プランの他の上限と一緒に載せています。
取引を一件変更する
取引のうち、自分で上書きできるのは四つです。カテゴリ、加盟店名、自分で付けるメモ、そしてレビューステータス。変更するものだけを送ってください——省略した項目はそのままです。パスのidは、その取引のutgr_キーです。データを変更するので、banking:readではなくbanking:writeが必要です。
必要なスコープ
banking:writecategoryKey任意 | 割り当てるカテゴリのfcat_キー。省略すると、取引は今のカテゴリのままです。 |
|---|---|
merchantName任意 | 自分で付ける加盟店名。最大1000文字。省略すると、今の名前のままです。 |
description任意 | この取引に自分で付けるメモ。最大5000文字。省略すると、今のメモのままです。 |
reviewStatus任意 | needs_review、reviewed、flaggedのいずれかを付けます。 |
clearCategory任意 | カテゴリの上書きを外し、Era自身の分類に戻します。デフォルトはfalseです。 |
clearMerchantName任意 | 加盟店名の上書きを外し、銀行から届いた名前に戻します。デフォルトはfalseです。 |
clearDescription任意 | メモの上書きを外し、銀行から届いた説明に戻します。デフォルトはfalseです。 |
clearReviewStatus任意 | レビューステータスの上書きを外します。デフォルトはfalseです。 |
レスポンス · 200
{
"transaction": { … }
}
更新された取引がまるごと返ります。形は上の一覧が返すものと同じです——ここでは繰り返して載せていません、大きなオブジェクトでまだ変わり続けているためです。同じ呼び出しの中でフィールドを設定しつつ同時にクリアすると400が返ります。自分のものではない取引、あるいはそもそも存在しない取引は403が返ります——このAPIは両者を区別しません。書き込んでいる間に別の何かが同じ行を変更していた場合は409が返ります。読み直してから、もう一度送ってください。
一度に100件まで変更する
同じ四つの上書きを、一度の呼び出しで複数の取引のリストに適用します。リストに含めたすべてのidが同じ変更を受け取ります——取引ごとに内容を変えることはできません。データを変更するので、banking:readではなくbanking:writeが必要です。
必要なスコープ
banking:writetransactionIds | 変更する取引のutgr_キー。最低1件、最大100件です。100件を超えると、上のpageSizeとは違って丸められるのではなく拒否されます——400が返り、何も変更されません。 |
|---|---|
categoryKey任意 | 割り当てるカテゴリのfcat_キー。省略すると、取引は今のカテゴリのままです。 |
merchantName任意 | 自分で付ける加盟店名。最大1000文字。省略すると、今の名前のままです。 |
description任意 | この取引に自分で付けるメモ。最大5000文字。省略すると、今のメモのままです。 |
reviewStatus任意 | needs_review、reviewed、flaggedのいずれかを付けます。 |
clearCategory任意 | カテゴリの上書きを外し、Era自身の分類に戻します。デフォルトはfalseです。 |
clearMerchantName任意 | 加盟店名の上書きを外し、銀行から届いた名前に戻します。デフォルトはfalseです。 |
clearDescription任意 | メモの上書きを外し、銀行から届いた説明に戻します。デフォルトはfalseです。 |
clearReviewStatus任意 | レビューステータスの上書きを外します。デフォルトはfalseです。 |
レスポンス · 200
{
"transactions": [ … ]
}
更新された取引が返ります。形は上の一覧が返すものと同じです。同じ呼び出しの中でフィールドを設定しつつ同時にクリアすると400が返り、空のリストを送った場合も400です。自分のものではない取引、あるいはそもそも存在しない取引がリストに一件でも含まれていると、呼び出し全体が403になります——何も変更されません。書き込んでいる間に別の何かがそれらの行のどれかを変更していた場合は409が返ります。読み直してから、もう一度送ってください。
カテゴリ
必要なスコープ
banking:readカテゴリ体系のすべて。カテゴリのまとまりごとに、その下位カテゴリが入れ子で入ります。この体系は共通で、口座ごとではありません。
レスポンス · 200
{
"packs": [
{
"packSlug": "default",
"packName": "Era default categories",
"isDefault": true,
"categories": [
{
"projectionKey": "fcat_food_dining",
"categoryName": "Food & dining",
"isTopLevel": true,
"children": [ … ]
}
]
}
],
"meterLimit": 25,
"canCreateCustomCategories": true
}
カテゴリを追加する
既存の親カテゴリの下に作る、ユーザー定義のカテゴリです。データを変更するので、banking:readではなくbanking:writeが必要です。
必要なスコープ
banking:writeslug | URLで使える識別子——小文字、数字、ハイフンのみ、2〜50文字。 |
|---|---|
parentCategoryKey | このカテゴリを入れ子にする親カテゴリのfcat_キー。 |
name | 表示名。 |
description任意 | 任意の説明。 |
iconName任意 | 任意のアイコン名。 |
spendingType任意 | 任意の支出分類。 |
displayOrder任意 | 兄弟カテゴリの中での任意の並び順。 |
assignmentEligibility任意 | このカテゴリをどの取引に割り当てられるかを決める任意のルール。 |
sourceSystemKeys任意 | 今後ここへ振り分ける、既存カテゴリキーの任意のリスト。 |
applyRetroactively任意 | trueにすると、過去の取引も新しい振り分けで再評価します。デフォルトはfalseです。 |
レスポンス · 201
{
"categoryKey": "fcat_side_hustle_9f2a",
"overlayProjectionKey": "fcov_9f2a1c",
"action": "created",
"isQuotaExceeded": false,
"createdMappingRuleKeys": [ … ],
…
}
レスポンスにはretroactiveAffectedCount、mergeSourcesHiddenCount、mergeSourcesTotalCount、meterGateも含まれます。これらはカテゴリの統合や上限付きの新規作成とこの呼び出しが共有するフィールドで、ここには表示していません。