ファイルアップロード
ウォレットにファイルを取り込む際は、複数のエンドポイントを組み合わせた3ステップのフローを実施します。 ファイルはRIKYUサーバーを経由せず、クライアントから GCS(Google Cloud Storage)へ直接アップロード する方式です。
フロー概要
[1] POST /v1/wallets/{wallet-id}/upload-csv/presigned-urls
└─ 署名付きURLとfilePathを取得
[2] PUT {uploadUrl}
└─ GCSへファイルを直接アップロード(RIKYUサーバー経由なし)
[3] POST /v1/wallets/{wallet-id}/upload-csv
└─ アップロード済みファイルの処理を開始(非同期)
[4] GET /v1/async-events/{async-event-id}
└─ 処理完了をポーリングで確認
Step 1: 署名付きURLの取得
POST /v1/wallets/{wallet-id}/upload-csv/presigned-urls を呼び出し、アップロード先の署名付きURLとファイルパスを取得します。
リクエスト
curl -X POST "https://api.rikyu.jp/v1/wallets/42/upload-csv/presigned-urls" \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{
"files": [
{
"index": 0,
"fileName": "transactions.csv",
"contentType": "text/csv"
}
]
}'
| フィールド | 型 | 説明 |
|---|---|---|
files[].index | number | ファイルの識別インデックス(0始まり)。複数ファイルを一括取得する際に使用 |
files[].fileName | string | ファイル名(拡張子付き) |
files[].contentType | string | コンテントタイプ(例: text/csv) |
レスポンス
{
"uploadUrls": [
{
"index": 0,
"uploadUrl": "https://storage.googleapis.com/rikyu-uploads/...",
"filePath": "uploads/company-id/wallet-id/uuid.csv"
}
]
}
| フィールド | 説明 |
|---|---|
uploadUrls[].index | リクエスト時に指定したインデックス |
uploadUrls[].uploadUrl | GCSへのPUTリクエスト用署名付きURL(有効期限あり) |
uploadUrls[].filePath | Step 3で使用するファイルパス |
注意:
uploadUrlには有効期限があります。取得後すぐにStep 2を実施してください。
Step 2: GCSへのファイルアップロード
Step 1で取得した uploadUrl に対して、PUT リクエストでファイルを直接アップロードします。
このリクエストはRIKYUサーバーではなく GCS に対して行います。
curl -X PUT "{uploadUrl}" \
-H "Content-Type: text/csv" \
--data-binary @transactions.csv
アップロード成功時はHTTPステータス 200 が返ります。
Step 3: アップロード処理の開始
POST /v1/wallets/{wallet-id}/upload-csv を呼び出し、アップロード済みファイルの処理を開始します。
Step 1で取得した filePath を指定します。
リクエスト
curl -X POST "https://api.rikyu.jp/v1/wallets/42/upload-csv" \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{
"filePaths": ["uploads/company-id/wallet-id/uuid.csv"]
}'
レスポンス(202 Accepted)
{
"results": [
{
"index": 0,
"filePath": "uploads/company-id/wallet-id/uuid.csv",
"status": "ACCEPTED",
"asyncEventId": "01ABCDEFGHIJKLMNOPQRSTUVWX",
"errorCode": null,
"errorMessage": null
}
]
}
status | 説明 |
|---|---|
ACCEPTED | ファイルの形式が有効で、バックグラウンドで処理が開始された |
FAILED | ファイルの形式が不正など、処理を開始できなかった。errorCode / errorMessage に原因が含まれる |
FAILED の場合、他のファイルの処理には影響しません(各ファイルは独立して評価されます)。
Step 4: 処理完了の確認
status が ACCEPTED の場合、処理はバックグラウンドで非同期に実行されます。
asyncEventId を使って GET /v1/async-events/{async-event-id} をポーリングし、完了を確認します。
curl -X GET "https://api.rikyu.jp/v1/async-events/01ABCDEFGHIJKLMNOPQRSTUVWX" \
-H "Authorization: Bearer <api_key>"
{
"asyncEventId": "01ABCDEFGHIJKLMNOPQRSTUVWX",
"asyncEventStatus": "COMPLETED",
"errorCode": null,
"errorMessage": null
}
asyncEventStatus が COMPLETED になるまで 5〜30 秒間隔 でポーリングすることを推奨します。
詳細は 非同期イベント を参照してください。
複数ファイルの一括アップロード
Step 1 の files 配列に複数要素を指定することで、複数ファイルを一度に処理できます。
# Step 1: 複数ファイル分の署名付きURLを一括取得
curl -X POST "https://api.rikyu.jp/v1/wallets/42/upload-csv/presigned-urls" \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{
"files": [
{ "index": 0, "fileName": "transactions_2024.csv", "contentType": "text/csv" },
{ "index": 1, "fileName": "transactions_2025.csv", "contentType": "text/csv" }
]
}'
# Step 3: 全ファイルの filePath をまとめて指定
curl -X POST "https://api.rikyu.jp/v1/wallets/42/upload-csv" \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{
"filePaths": [
"uploads/company-id/wallet-id/uuid1.csv",
"uploads/company-id/wallet-id/uuid2.csv"
]
}'
各ファイルは独立して処理されます。一部が FAILED でも、他のファイルは ACCEPTED になります。
エラーケース
| ケース | HTTPステータス | 対処 |
|---|---|---|
| ウォレットが存在しない | 404 | wallet-id を確認する |
| 書き込み権限がない | 403 | WRITE権限を持つAPIキーを使用する |
| ファイル形式が不正 | 202 / status: FAILED | errorMessage を確認してファイルを修正する |
uploadUrl の有効期限切れ | Step 2で 4xx | Step 1からやり直す |