レスポンス形式
API レスポンスの標準エンベロープ構造。
|
概要
BlueAI API はすべてのエンドポイントで一貫したレスポンス形式を使用します。単一オブジェクト、リスト、エラーのそれぞれに標準エンベロープが定義されており、クライアント側で統一的に処理できます。すべてのフィールド名は snake_case で返されます。
単一オブジェクトのレスポンス
単一リソースを返すエンドポイント(GET /resource/:id、POST /resource など)は、リソースオブジェクトをそのまま返します。各オブジェクトには id と object フィールドが含まれます。
{
"id": "deal_11111111111111111111111111111111",
"object": "deal",
"name": "Enterprise Contract",
"amount": 1500000,
"status": "open",
"created_at": "2025-01-15T09:00:00Z",
"updated_at": "2025-02-10T14:30:00Z"
}| Field | Type | Description |
|---|---|---|
| id | string | リソースの一意な識別子。プレフィックス付き(例: deal_xxxx, inv_xxxx)。 |
| object | string | リソースの種類を示す文字列(例: "deal", "invoice")。 |
| created_at | string | リソースの作成日時(ISO 8601 形式)。 |
| updated_at | string | リソースの最終更新日時(ISO 8601 形式)。 |
リストレスポンス
一覧を返すエンドポイントは、data 配列とページネーション情報を含む標準エンベロープで返します。
{
"object": "list",
"data": [
{
"id": "deal_11111111111111111111111111111111",
"object": "deal",
"name": "Enterprise Contract",
"amount": 1500000,
"status": "open"
},
{
"id": "deal_22222222222222222222222222222222",
"object": "deal",
"name": "Starter Plan",
"amount": 300000,
"status": "won"
}
],
"pagination": {
"page": 1,
"per_page": 50,
"total": 142,
"total_pages": 3
}
}| Field | Type | Description |
|---|---|---|
| object | string | 常に "list" が設定されます。 |
| data | array | リソースオブジェクトの配列。 |
| pagination | object | ページネーションのメタ情報(page, per_page, total, total_pages)を含むオブジェクト。 |
エラーレスポンス
エラー発生時は error オブジェクトを含むレスポンスが返されます。すべてのエラーは一貫した構造に従います。
{
"error": {
"type": "invalid_request_error",
"code": "required",
"message": "name is required",
"param": "name"
}
}422 Unprocessable Entity:
{
"error": {
"type": "validation_error",
"code": "invalid_parameters",
"message": "One or more parameters are invalid",
"errors": [
{
"field": "email",
"code": "invalid_format",
"message": "must be a valid email address"
},
{
"field": "amount",
"code": "out_of_range",
"message": "must be greater than 0"
}
]
}
}| Field | Type | Description |
|---|---|---|
| error.type | string | エラーの分類(例: invalid_request_error, authentication_error)。 |
| error.code | string | 機械可読なエラーコード(例: required, invalid_format)。 |
| error.message | string | 人間が読めるエラーの説明。 |
| error.param | string | null | エラーに関連するパラメータ名(該当する場合)。 |
| error.errors | array | null | バリデーションエラーの詳細配列(422 エラー時)。各要素は field, code, message を含みます。 |
HTTP ステータスコード
API は標準的な HTTP ステータスコードを使用して、リクエストの成否を示します。
| ステータス | 意味 | 説明 |
|---|---|---|
| 200 | OK | リクエストが成功しました。レスポンスボディにリソースが含まれます。 |
| 201 | Created | リソースが正常に作成されました。レスポンスボディに作成されたリソースが含まれます。 |
| 204 | No Content | リクエストが成功しましたが、返すコンテンツがありません(DELETE 操作など)。 |
| 400 | Bad Request | リクエストボディまたはパラメータが無効です。 |
| 401 | Unauthorized | 有効なセッションまたは API キーが提供されていません。 |
| 403 | Forbidden | 認証済みですが、この操作を実行する権限がありません。 |
| 404 | Not Found | リクエストされたリソースが存在しません。 |
| 409 | Conflict | リクエストが現在の状態と競合しています(例: 重複エントリ)。 |
| 422 | Unprocessable Entity | リクエストは正しい形式ですが、セマンティックエラーを含んでいます。errors 配列にフィールドごとの詳細が含まれます。 |
| 429 | Too Many Requests | レートリミットを超過しました。レートリミットガイドを参照してください。 |
| 500 | Internal Server Error | サーバーで予期しないエラーが発生しました。しばらく時間をおいてから再試行してください。 |
命名規約
すべてのレスポンスフィールドは snake_case で返されます。リクエストボディも snake_case で送信してください。camelCase や PascalCase は使用しないでください。
Correct (snake_case)
{
"company_name": "Acme Corp",
"created_at": "2025-01-15T09:00:00Z",
"total_amount": 1500000,
"is_active": true
}Incorrect (camelCase)
{
"companyName": "Acme Corp",
"createdAt": "2025-01-15T09:00:00Z",
"totalAmount": 1500000,
"isActive": true
}使用例
# Fetch a single deal
curl https://api.blueai.jp/api/v1/crm/deals/deal_11111111111111111111111111111111 \
-b cookies.txtconst res = await fetch(
"https://api.blueai.jp/api/v1/crm/deals",
{ credentials: "include" },
);
const json = await res.json();
if (json.error) {
// Error envelope
console.error(json.error.type, json.error.message);
} else if (json.object === "list") {
// List envelope
for (const deal of json.data) {
console.log(deal.id, deal.name);
}
console.log(`Total: ${json.pagination.total}`);
} else {
// Single object
console.log(json.id, json.name);
}