Claude などの AI アシスタントから raxel を操作したい場合は、この REST API を直接呼ぶ代わりにAI エージェント連携 (MCP) が使えます (設定 1 つで接続でき、エンドポイントの知識が不要になります)。
REST APIを使用して、外部システムからレコードの取得・作成・更新・削除を行えます。 すべてのAPIリクエストにはAPIトークンによる認証が必要です。
リクエストヘッダーに X-API-Token を含めてAPIトークンを送信します。 APIトークンはアプリの設定画面から発行できます。
curl -H "X-API-Token: YOUR_API_TOKEN" \
https://example.com/api/apps/{appId}/recordsAPIトークンには以下の権限を個別に付与できます。必要最小限の権限を設定してください。
| 権限 | 説明 | 対応メソッド |
|---|---|---|
| read | レコードの閲覧・取得 | GET |
| write | レコードの作成・更新 | POST, PUT |
| delete | レコードの削除 | DELETE |
429 Too Many Requests が返されます。429 レスポンスにはX-RateLimit-Limit /X-RateLimit-Remaining /X-RateLimit-Reset ヘッダーが付与されます (Reset は Unix 秒)。429 が返されます。/api/apps/{appId}/recordsレコード一覧を取得します。フィルタ・ソート・ページネーションに対応しています。
| page | ページ番号(1始まり、デフォルト: 1) |
| perPage | 1ページあたりの件数(デフォルト: 20、最大: 500) |
| cursor | シークページング用カーソル。前のレスポンスに含まれる nextCursor の値をそのまま渡します。指定時は page より優先されます。単一ソートのみ対応(sorts に2件以上指定した状態での cursor 指定は 400 エラー)。 |
| sortField | ソート対象フィールドコード。組み込みフィールドは recordNumber / createdAt / updatedAt を指定可能 |
| sortDirection | ソート順 asc / desc(デフォルト: desc) |
| sorts | 複数ソート用の JSON 配列。例: [{"field":"priority","direction":"desc"},{"field":"createdAt","direction":"asc"}](最大5件)。cursor と同時使用する場合は1件のみ指定可 |
| filters | フィルタ条件の JSON 配列。各要素は { field, operator, value } |
| filter[フィールドコード] | 単純な等価フィルタ。例: filter[status]=completed |
| filterMode | 複数フィルタの結合 and / or(デフォルト: and) |
| query | 比較演算子・論理演算子・関数を使ったクエリ文字列でレコードを絞り込みます。詳細は下記「クエリ文字列によるフィルタ」を参照。filters / filterTree / filterMode / filter[...] とは併用不可 |
| filterTree | 入れ子の AND/OR グループを JSON(FilterNode 形式)で指定します。詳細は下記「クエリ文字列によるフィルタ」内の filterTree 節を参照。filters / filterMode / filter[フィールドコード] とは併用不可 |
| search | 全文検索キーワード |
| categoryId | カテゴリID(子孫カテゴリも含めて絞り込み) |
/api/apps/{appId}/records/{recordId}指定したレコードの詳細を取得します。権限で閲覧できないレコードは 404 を返します(存在するかどうかは判定できません)。
/api/apps/{appId}/records新しいレコードを作成します。レコードの値は data オブジェクトに、フィールドコードをキーとして指定します。
{
"data": {
"title": "サンプルタイトル",
"priority": "high",
"dueDate": "2026-04-01"
}
}/api/apps/{appId}/records/{recordId}既存のレコードを更新します。data に指定したフィールドのみ更新されます。
{
"data": {
"priority": "medium"
},
"expectedHistoryVersion": 5
}💡 expectedHistoryVersion を指定すると楽観的排他制御が有効になります。サーバー側の現在値と一致しない場合は 409 Conflict が返されます。
/api/apps/{appId}/records/{recordId}指定したレコードを削除します。
/api/apps/{appId}/records/bulk複数レコードに同じ内容を一括で適用して更新します(最大100件)。すべてのレコードに共通の data を反映したいケース向けです。
{
"recordIds": ["rec_001", "rec_002"],
"data": {
"status": "completed"
}
}💡 レコードごとに異なる値を指定したい場合は /records/bulk-individual を使用してください。
/api/apps/{appId}/records/bulk複数レコードを一括削除します(最大100件)。
{
"recordIds": ["rec_001", "rec_002"]
}/api/apps/{appId}/records/bulk-individualレコードごとに異なる内容で作成・更新・削除を混在させて実行します(合計最大200件)。
{
"creates": [
{ "data": { "title": "新規1" } }
],
"updates": [
{ "recordId": "rec_001", "data": { "title": "更新1" } },
{ "recordId": "rec_002", "data": { "title": "更新2" } }
],
"deletes": ["rec_900"]
}💡 creates / updates / deletes のいずれか1つ以上を指定してください。updates 内の要素ごとに異なる data を渡せます。
/api/apps/{appId}アプリの基本情報(名前・説明・設定など)を取得します。
/api/apps/{appId}/fieldsアプリのフィールド定義一覧を取得します。
/api/apps/{appId}/records/summary数値フィールドの集計値(合計・平均・最小・最大・件数)を取得します。フィルタ・検索で対象を絞り込めます。
| field | 集計するフィールドコード(複数指定可: ?field=amount&field=price) |
| filters | FilterCondition の JSON 配列(filterMode: and / or と併用) |
| filterTree | FilterNode の JSON(filters と排他) |
| search | 全文検索文字列 |
| categoryId | カテゴリでの絞り込み |
💡 フィールド権限・レコード権限を尊重した集計結果が返ります。
/api/apps/{appId}/records/{recordId}/workflowレコードの現在のワークフロー状態(ステータス・作業者・実行可能な遷移・履歴)を取得します。
/api/apps/{appId}/records/{recordId}/workflowレコードのワークフローステータスを遷移させます。
{
"transitionId": "<transitionId>",
"comment": "承認しました",
"assignee": "<userId>"
}💡 transitionId は必須(実行可能な遷移は GET または一括遷移候補 API で取得できます)。comment と assignee(次のステータスの作業者に指定するユーザー ID)は省略可能です。遷移ルールの実行条件・実行可能なユーザーの制約は通常どおり適用されます。
/api/bulk-request複数アプリをまたぐ操作(レコード作成・更新・削除、ステータス遷移、作業者変更、コメント投稿・削除)を 1 つのトランザクションでまとめて実行します(最大 20 件、全件成功か全件取消のどちらか)。
{
"operations": [
{ "op": "record.create", "appId": "<appId>", "data": { "title": "新規" } },
{ "op": "record.update", "appId": "<appId>", "id": "rec_001", "data": { "title": "更新" } },
{ "op": "record.status", "appId": "<appId>", "id": "rec_002", "transitionId": "<transitionId>" },
{ "op": "comment.create", "appId": "<appId>", "recordId": "rec_003", "body": "コメント" }
]
}💡 op は record.create / record.update / record.delete / record.status / record.assignee / comment.create / comment.delete のいずれか。パスにアプリ ID を含まないため、各操作の appId をボディで指定します。API トークンで呼ぶ場合はトークンのアプリに属する操作のみ実行できます。1 件でも失敗すると全体がロールバックされ、レスポンスの results に操作ごとの結果が返ります。
/api/apps/{appId}/records/bulk/workflow指定した複数レコードに対して、共通して実行可能なワークフロー遷移の候補一覧を返します(最大200件)。一括遷移UIのプルダウン構築に使用します。
{
"recordIds": ["rec_001", "rec_002"]
}💡 すべての指定レコードに共通して適用可能な遷移のみが返されます。各レコードの現在のステータスが異なる場合、それぞれのステータスに有効な遷移の積集合が返されます。
/api/apps/{appId}/records/bulk/workflow複数レコードのワークフローステータスを一括で遷移させます(最大200件)。現在のステータスごとに実行する遷移IDを指定します。
{
"recordIds": ["rec_001", "rec_002"],
"transitionIdsByFromStatus": {
"<fromStatusId>": "<transitionId>"
},
"comment": "一括承認しました"
}💡 transitionIdsByFromStatus は「現在のステータスID → 実行する遷移ID」のマッピングです。comment は省略可能(最大1000文字)。各レコードの遷移認可は内部で個別にチェックされ、1件失敗しても残りは続行されます。レスポンスには成功・失敗それぞれのレコードIDが含まれます。
/api/apps/{appId}/records/{recordId}/commentsレコードのコメント一覧を取得します(カーソルページネーション)。
| take | 取得件数(既定 50、最大 200) |
| cursor | 前ページ最後のコメントの id を指定すると、その続きから取得 |
| order | 並び順。asc または desc(既定 desc = 新しい順) |
💡 レスポンスは { "data": [...], "total": n } の形です。続きを取得するには data の最後の要素の id を次リクエストの cursor に渡します。アプリのコメント機能が無効の場合は data が空配列で commentsEnabled: false が返ります。
/api/apps/{appId}/records/{recordId}/commentsレコードにコメントを投稿します。
{
"body": "コメント本文",
"mentions": [
{ "type": "user", "targetId": "<userId>" }
]
}💡 本文のキー名は body です(最大 65,535 文字)。mentions は省略可能(最大 10 件)で、type は user / group / organization のいずれか、targetId はそれぞれの ID です。実在しない対象は無視されます。メンションされた相手には通知が送られます。レスポンスは作成されたコメントです。
/api/apps/{appId}/records/{recordId}/comments/{commentId}指定したコメントを削除します。API トークンで削除できるのは、トークンの発行者本人が投稿したコメントだけです(トークンの発行者がアプリ管理者でも、他のユーザーのコメントは削除できません)。
💡 このエンドポイントには write 権限が必要です。他のユーザーが投稿したコメントを指定すると 403 が返され、コメントは削除されません。トークンの発行者が閲覧できないレコードのコメントは 404 になります。レスポンスは { "success": true } です。
/api/apps/{appId}/records/{recordId}/workflow/assigneeレコードの現在の作業者を変更または解除します。アプリ管理者だけが画面から行える操作で、API トークンでは実行できません(トークンの発行者がアプリ管理者でも同じです)。
{
"assigneeUserId": "<userId>"
}💡 API トークンで呼び出すと 403(errorKey: apiToken.adminOperationForbidden)が返され、作業者は変わりません。画面から操作する場合、assigneeUserId に null を指定すると担当者を解除(unclaim)します。ワークフローが設定されていないレコードや、存在しないユーザーIDを指定した場合は 400 が返されます。
/api/apps/{appId}/records/batch複数レコードを一括で作成します(最大100件)。1件でも失敗した場合は全件ロールバックされ、何も確定しません。
{
"records": [
{ "data": { "title": "タスクA", "priority": "high" } },
{ "data": { "title": "タスクB", "priority": "medium" } }
]
}💡 成功時は作成されたレコードの id / recordNumber / historyVersion を配列で返します。エラー時は失敗した要素の index と recordId を含むエラー情報が返され、全件ロールバックされます。
/api/apps/{appId}/records/batch複数レコードをそれぞれ異なる内容で一括更新します(最大100件)。1件でも失敗した場合は全件ロールバックされます。
{
"records": [
{
"id": "<recordId>",
"data": { "priority": "high" },
"expectedHistoryVersion": 3
},
{
"updateKey": { "field": "externalCode", "value": "ABC-001" },
"data": { "status": "completed" }
}
]
}💡 id の代わりに updateKey(unique 制約付きフィールドのコードと値)でレコードを指定できます。updateKey はキーに一致するレコードを更新するのみで、一致するレコードが存在しない場合はエラーになります(新規作成は行いません)。expectedHistoryVersion を指定すると楽観的排他制御が有効になります。
/api/apps/{appId}/records/batch複数レコードを一括削除します(最大100件)。1件でも失敗した場合は全件ロールバックされます。
{
"records": [
{ "id": "<recordId>" },
{ "id": "<recordId>" }
]
}POST /api/bulk-request を使うと、 複数の操作を1リクエストにまとめて単一トランザクションで原子実行できます。 1つでも操作が失敗した場合は全操作がロールバックされ、何も確定しません。 レコードの CRUD・ワークフロー遷移・コメント操作を、複数のアプリをまたいで混在させることができます。
リクエストボディは { "operations": [ ... ] } 形式で、 最大 20 操作まで指定できます。各操作は op(操作種別)とappId を必ず含みます。
| op | フィールド | 説明 |
|---|---|---|
record.create | op, appId, data | レコードを作成します。write 権限が必要です。 |
record.update | op, appId, id | updateKey, data, expectedHistoryVersion? | レコードを更新します。id または updateKey のいずれか一方を指定します。write 権限が必要です。 |
record.delete | op, appId, id, expectedHistoryVersion? | レコードを削除します。delete 権限が必要です。 |
record.status | op, appId, id, transitionId, comment?, assignee? | ワークフローを遷移させます。write 権限が必要です。 |
record.assignee | op, appId, id, assigneeUserId | null | レコードの作業者を変更または解除します。アプリ管理者だけが画面から行える操作で、API トークンでは実行できません(トークンの発行者がアプリ管理者でも 403 apiToken.adminOperationForbidden になり、一括全体が実行されません)。assigneeUserId に null を指定すると解除します。 |
comment.create | op, appId, recordId, body, mentions? | コメントを投稿します。mentions は [{ "type": "...", "targetId": "..." }] 形式(最大10件)。write 権限が必要です。 |
comment.delete | op, appId, recordId, commentId | コメントを削除します。API トークンで削除できるのは、トークンの発行者本人が投稿したコメントだけです(トークンの発行者がアプリ管理者でも、他のユーザーのコメントは削除できません)。write 権限が必要です。 |
record.createop, appId, datarecord.updateop, appId, id | updateKey, data, expectedHistoryVersion?id または updateKey のいずれか一方を指定します。write 権限が必要です。record.deleteop, appId, id, expectedHistoryVersion?record.statusop, appId, id, transitionId, comment?, assignee?record.assigneeop, appId, id, assigneeUserId | nullapiToken.adminOperationForbidden になり、一括全体が実行されません)。assigneeUserId に null を指定すると解除します。comment.createop, appId, recordId, body, mentions?mentions は [{ "type": "...", "targetId": "..." }] 形式(最大10件)。write 権限が必要です。comment.deleteop, appId, recordId, commentId成功時は { "results": [ ... ] } を返します。results は入力の operations と同じ順序で、各 op の結果が入ります。 レコード操作の結果には op・id・recordNumber・historyVersion が含まれます。 コメント操作の結果には op・commentId が含まれます。
いずれかの操作が失敗した場合は、失敗した操作の情報を含む以下のエラーレスポンスが返され、全操作がロールバックされます。
{
"error": "エラーメッセージ",
"index": 1,
"op": "record.update",
"appId": "<appId>",
"code": "PERMISSION_DENIED", // 省略されることがあります
"details": { ... } // 省略されることがあります
}セッション認証(ログインユーザー)では複数アプリの操作を1リクエストに混在させることができます。APIトークン認証では、トークンを発行したアプリの操作のみ実行できます(他のアプリを指定した操作は 403 になります)。 また、各 op には対応するトークンスコープが必要です(record.delete には delete 権限、それ以外は write 権限)。
通知・ルックアップ集計などの副作用(post-commit side effects)は、トランザクションのコミット後にまとめて実行されます。 副作用の失敗はリクエスト全体の結果には影響しません。
# APIトークンで record.create と comment.create を1リクエストで原子実行する例
curl -X POST \
-H "X-API-Token: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"operations": [
{
"op": "record.create",
"appId": "app_001",
"data": { "title": "新規タスク", "priority": "high" }
},
{
"op": "comment.create",
"appId": "app_001",
"recordId": "rec_existing_001",
"body": "関連タスクを作成しました。"
}
]
}' \
"https://example.com/api/bulk-request"
# 成功時のレスポンス例
{
"results": [
{
"op": "record.create",
"id": "rec_new_001",
"recordNumber": 42,
"historyVersion": 1
},
{
"op": "comment.create",
"commentId": "cmt_001"
}
]
}
# 失敗時のレスポンス例(全操作ロールバック)
{
"error": "アプリ app_001 に対する操作権限がありません",
"index": 1,
"op": "comment.create",
"appId": "app_001",
"code": "PERMISSION_DENIED"
}レコードのフィールドにファイルを添付するには、まずファイルをアップロードしてid を取得し、 その id をレコードの data に指定します。
POST /api/upload にmultipart/form-data でファイルを送信します。write 権限の API トークンが必要です。
# fieldId は添付フィールドの id (フィールドコードではない)。
# GET /api/apps/{appId}/fields が返す各フィールドの "id" で調べる
curl -X POST \
-H "X-API-Token: YOUR_API_TOKEN" \
-F "appId=<appId>" \
-F "fieldId=<attachmentFieldId>" \
-F "file=@/path/to/document.pdf" \
"https://example.com/api/upload"
# レスポンス例
{
"id": "clxxxxxxxxxxxxxxxx",
"fileName": "document.pdf",
"fileSize": 204800,
"mimeType": "application/pdf",
"url": "/api/upload/clxxxxxxxxxxxxxxxx"
}フォームフィールドの指定:
| フィールド名 | 必須 | 説明 |
|---|---|---|
appId | 必須 | ファイルを添付するアプリの ID |
fieldId | 必須 | 添付フィールドの id(フィールドコードではありません)。GET /api/apps/{appId}/fields が返す各フィールドの id で取得できます |
file | 必須 | アップロードするファイル |
recordId | 任意 | 既存レコードの添付フィールドへ添付する場合の、そのレコードの ID(fieldId と一緒に指定します) |
appIdfieldIdGET /api/apps/{appId}/fields が返す各フィールドの id で取得できますfilerecordIdfieldId と一緒に指定します)既存レコードの添付フィールドにファイルを追加するときは、recordId にそのレコードの ID を指定してください。 レコードに依存するフィールドのアクセス権(作成者・ワークフローの担当者などを対象にした設定)と、 ステータスごとのフィールドの編集制限が、そのレコードに対して評価されます。 指定したレコードが存在しない・閲覧できない場合は 404、閲覧はできるが編集できない場合は 403 を返します。recordId を指定しても、ファイルはまだレコードに紐づきません。 下の「レコードへの添付」のとおり、レコードの更新で data に指定してください。
recordId を指定しない場合は、特定のレコードを前提にせずに権限を確認します。 新しく作るレコードか既存のレコードのどちらかでそのフィールドに書き込めれば受け付けます。 新しく作るレコードとしての確認では、作成者をトークンの発行者とみなします(新規登録の画面と同じ扱い)。 それ以外のレコードに依存する設定(ワークフローの担当者・ユーザー選択フィールドの値など)と、 ステータスごとのフィールドの編集制限は評価されません。
アップロードで取得した id を、 レコード作成・更新時の data に指定します。 添付フィールドの値は [{ "id": "<id>" }] の配列形式です。
# レコード作成時にファイルを添付
curl -X POST \
-H "X-API-Token: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"data": {
"title": "提出書類",
"attachment": [{ "id": "clxxxxxxxxxxxxxxxx" }]
}
}' \
"https://example.com/api/apps/1/records"
# 一括登録(batch)でも同様に指定できます
curl -X POST \
-H "X-API-Token: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"records": [
{ "data": { "title": "書類A", "attachment": [{ "id": "clxxxxxxxxxxxxxxxx" }] } },
{ "data": { "title": "書類B", "attachment": [{ "id": "clyyyyyyyyyyyyyy" }] } }
]
}' \
"https://example.com/api/apps/1/records/batch"GET /api/upload/{id} でファイルをダウンロードできます。read 権限の API トークンが必要です。
curl -H "X-API-Token: YOUR_API_TOKEN" \ "https://example.com/api/upload/clxxxxxxxxxxxxxxxx" \ -o document.pdf
data の直下はフィールドコードがキーですが、テーブル(サブテーブル)フィールドの明細行のキーだけはサブフィールドの id です(コードではありません)。 ここだけキーの種類が変わるので、コードで送ると明細が保存されません。
サブフィールドの id はGET /api/apps/{appId}/fields のsettings.subFields[].id で取得できます。 レコード取得(GET)が返す明細行も同じ id キーなので、更新時はその形のまま送り返せます。
# 1. サブフィールドの id を調べる
curl -H "X-API-Token: YOUR_API_TOKEN" \
"https://example.com/api/apps/1/fields"
# => { "code": "details", "type": "subtable",
# "settings": { "subFields": [ { "id": "sf_a1b2", "code": "item_name", ... },
# { "id": "sf_c3d4", "code": "amount", ... } ] } }
# 2. 明細行のキーには id を使う (code ではない)
curl -X POST \
-H "X-API-Token: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"data":{"title":"8月分の経費","details":[{"sf_a1b2":"交通費","sf_c3d4":1200}]}}' \
"https://example.com/api/apps/1/records"行に未知のキー(サブフィールドのコードや綴り違い、削除済みサブフィールドの旧 id)が 含まれる場合は 400 になり、コードで送っていたときはコード → id の対応表がエラーメッセージに入ります。 一部のキーだけをコードで送った場合も、その列だけが黙って消えることはなく 400 になります。 すべてのキーが未知の場合は「この行は空行として保存されます」と明示されるので、 メッセージの対応表どおりにキーを置き換えて再送してください。
なお、明細の値そのものを条件にした絞り込み・集計はできません。filters のfield にdetails.amount のような 指定をしてもエラーにはならず、常に 0 件になります(明細は配列なので この形では値に届きません)。明細の値で絞り込む・集計するには、レコード側に計算フィールドまたは 関連レコード集計フィールドを用意して、そのフィールドコードを使ってください。
大量のレコードを順次取得する際は、offset ページング(page)ではなくcursor ページングを使用することを推奨します。 cursor ページングはシーク方式のため、レコードの追加・削除が発生しても重複や取りこぼしが起きません。
レスポンスに nextCursor が含まれる場合、次のリクエストのcursor パラメータにその値を渡すことで次ページを取得できます。nextCursor が含まれない場合は最終ページです。
| ソート指定 | cursor 利用 | 備考 |
|---|---|---|
| recordNumber(組み込み) | 可(全件確実に取得可能) | 件数上限なし。最も安定 |
| createdAt / updatedAt(組み込み) | 可(全件確実に取得可能) | 件数上限なし。タイムスタンプ+recordNumber の複合カーソル |
| 任意の単一フィールド(カスタムフィールド) | 可(5,000件以内のみ) | cursor 利用時は対象件数が5,000件を超えるとシークが安定しないため recordNumber 降順にフォールバック(sortFallback: true がレスポンスに含まれます)。page によるページングでは件数上限なし(2026-09-02〜。ただしカンバン列の絞り込み・「担当者のみ」・「自分の作業」のいずれかを併用した場合は従来どおり 5,000 件上限が残ります) |
| 複数ソート(sorts に2件以上) | 不可 | cursor と同時指定すると 400 エラー。offset ページング(page)を使用してください |
sortFallback: true がレスポンスに含まれます)。page によるページングでは件数上限なし(2026-09-02〜。ただしカンバン列の絞り込み・「担当者のみ」・「自分の作業」のいずれかを併用した場合は従来どおり 5,000 件上限が残ります)全件を確実かつ順次取得したい場合は、組み込みフィールド(recordNumber / createdAt / updatedAt)でのソート + cursorを使用してください。件数上限なく取りこぼしなく全件を traverse できます。 任意フィールドでのソート + cursor は、対象件数が 5,000 件以内の場合のみ安定して動作します。
# 1ページ目を取得(cursor なし)
curl -H "X-API-Token: YOUR_API_TOKEN" \
"https://example.com/api/apps/1/records?sortField=recordNumber&sortDirection=asc&perPage=100"
# レスポンス例
{
"records": [ ... ],
"total": 3500,
"page": 1,
"perPage": 100,
"nextCursor": "eyJybiI6MTAwfQ"
}
# 2ページ目以降は nextCursor を cursor に渡す
curl -H "X-API-Token: YOUR_API_TOKEN" \
"https://example.com/api/apps/1/records?sortField=recordNumber&sortDirection=asc&perPage=100&cursor=eyJybiI6MTAwfQ"
# nextCursor が含まれなくなったら最終ページレコード一覧取得(GET /api/apps/{appId}/records)のquery パラメータに文字列を渡すと、 比較演算子・論理演算子・括弧・関数を使ったクエリ文字列でレコードを絞り込めます。 既存の filters(JSON配列)やfilter[フィールドコード] と同じ絞り込みを、 括弧を使った入れ子条件も含めて1本の文字列で表現できます。 このパラメータはレコード一覧取得 API 専用です(CSVエクスポート・集計・公開ビュー等の API では利用できません)。
| 構文 | 意味 | 例 |
|---|---|---|
= | 等しい | status = "open" |
!= | 等しくない | status != "closed" |
> | より大きい | amount > 1000 |
< | より小さい | amount < 1000 |
>= | 以上 | amount >= 1000 |
<= | 以下 | amount <= 1000 |
like "値" | 部分一致 | title like "予算" |
in (...) | いずれかに一致 | status in ("open", "in_progress") |
not in (...) | いずれにも一致しない | status not in ("closed", "cancelled") |
is empty | 値が未入力 | dueDate is empty |
is not empty | 値が入力済み | dueDate is not empty |
=status = "open"!=status != "closed">amount > 1000<amount < 1000>=amount >= 1000<=amount <= 1000like "値"title like "予算"in (...)status in ("open", "in_progress")not in (...)status not in ("closed", "cancelled")is emptydueDate is emptyis not emptydueDate is not empty条件は and /or で連結し、( ) でグルーピングできます(ネストは最大3階層)。and /or /in /like /is /not /empty /order /by /asc /desc /limit /offset の各キーワードは大文字・小文字を区別しません。 文字列値はダブルクォートで囲みます(\" でエスケープ可)。 数値やクォートなしの値もそのまま書けます。フィールドコードは日本語コードも使用できます。
※ order /limit /offset の3語だけは、クエリ全体の先頭トークンとしてはフィールド名に使えません (そこでのみ「フィルタ式が無く句が始まる」と解釈されるためです)。 これらと同名のフィールドを先頭条件で使いたい場合は括弧で包む((order = "1"))か、 後述の filterTree を使用してください。
値の位置に関数を書くと、実行時の日時や実行ユーザーに応じた値へ解決されます。
| 関数 | 解決される値 |
|---|---|
TODAY() | 今日の日付 |
YESTERDAY() / TOMORROW() | 昨日 / 明日の日付 |
THIS_WEEK_START() / THIS_WEEK_END() | 今週の開始日・終了日 |
LAST_WEEK_START() / LAST_WEEK_END() | 先週の開始日・終了日 |
NEXT_WEEK_START() / NEXT_WEEK_END() | 来週の開始日・終了日 |
THIS_MONTH_START() / THIS_MONTH_END() | 今月の初日・末日 |
LAST_MONTH_START() / LAST_MONTH_END() | 先月の初日・末日 |
NEXT_MONTH_START() / NEXT_MONTH_END() | 来月の初日・末日 |
THIS_YEAR_START() / THIS_YEAR_END() | 今年の初日・末日 |
LAST_YEAR_START() / LAST_YEAR_END() | 昨年の初日・末日 |
THIS_WEEK() / LAST_WEEK() / NEXT_WEEK() | 今週・先週・来週の範囲(開始〜終了を含む一致) |
THIS_MONTH() / LAST_MONTH() / NEXT_MONTH() | 今月・先月・来月の範囲 |
THIS_YEAR() / LAST_YEAR() | 今年・昨年の範囲 |
LAST_7_DAYS() | 直近7日間の範囲 |
DAYS_AGO(n) / DAYS_LATER(n) | n日前 / n日後の日付 |
LAST_N_DAYS(n) / NEXT_N_DAYS(n) | 直近 / 今後n日間の範囲 |
LOGINUSER() | リクエストを実行したユーザー(APIトークンの発行者) |
TODAY()YESTERDAY() / TOMORROW()THIS_WEEK_START() / THIS_WEEK_END()LAST_WEEK_START() / LAST_WEEK_END()NEXT_WEEK_START() / NEXT_WEEK_END()THIS_MONTH_START() / THIS_MONTH_END()LAST_MONTH_START() / LAST_MONTH_END()NEXT_MONTH_START() / NEXT_MONTH_END()THIS_YEAR_START() / THIS_YEAR_END()LAST_YEAR_START() / LAST_YEAR_END()THIS_WEEK() / LAST_WEEK() / NEXT_WEEK()THIS_MONTH() / LAST_MONTH() / NEXT_MONTH()THIS_YEAR() / LAST_YEAR()LAST_7_DAYS()DAYS_AGO(n) / DAYS_LATER(n)LAST_N_DAYS(n) / NEXT_N_DAYS(n)LOGINUSER()※ 未対応の関数名を指定した場合は構文エラー(400)になります。関数名も大文字・小文字を区別しません。
※ 範囲を表す関数(THIS_WEEK() 〜 LAST_7_DAYS() / LAST_N_DAYS(n) / NEXT_N_DAYS(n)、上表で「〜の範囲」と説明されている行)は演算子 = としか組み合わせられません(!= / > 等と組み合わせると構文エラー(400)になります)。
order by field1 [asc|desc], field2 [asc|desc], ... — ソート順(最大5件)。既存の sorts / sortField パラメータとは併用できません(同時指定は400)limit N — 1ページの件数(perPage 相当。1〜500にクランプ、0は400エラー)。既存の perPage とは併用できませんoffset N — 開始位置(page 相当に変換)。実効ページサイズ(limit 句を指定していればその値、なければ既定値20)の倍数である必要があります(倍数でない場合は400)。既存の page とは併用できませんquery 文字列全体: 4KB(4096バイト)までin (...) の展開後の件数も含む)not in (...) の値: 最大200件(超過は400エラー)offset の値: 最大100000(超過は400エラー)not in (...) の値リストには関数呼び出し(TODAY() 等)を指定できません(動的な値の解決対象外になり、意図せず全件一致してしまうのを防ぐための制限です。動的な除外条件が必要な場合は!= 条件を and で並べてください)not in ()(値0件)と in () は非対称です。not in () は「除外対象なし」=全件一致として扱われますが、in () は値を1件も指定できないため400エラーになりますquery はfilters /filterTree /filterMode /filter[フィールドコード] のいずれとも同時に指定できません(同時指定は400)。
絞り込み条件をクエリ文字列ではなくJSON構造で直接組み立てたい場合は、filterTree パラメータを使用します。 入れ子の AND / OR グループを持つツリー構造(FilterNode)をJSON化して渡します。 上限(ネスト深さ3・条件合計50・1階層あたりグループ数10)は query と共通です。 JSON文字列自体のサイズにも上限があります(16KB(16384バイト)まで、超過は400エラー)。
{
"mode": "and",
"conditions": [
{ "field": "status", "operator": "eq", "value": "open" }
],
"groups": [
{
"mode": "or",
"conditions": [
{ "field": "priority", "operator": "eq", "value": "high" },
{ "field": "priority", "operator": "eq", "value": "urgent" }
]
}
]
}1条件の operator に指定できるのはeq /neq /gt /lt /gte /lte /contains /empty /not_empty /not_in(値は候補配列をJSON文字列化したもの)です。filterTree もfilters /filterMode /filter[フィールドコード] とは同時に指定できません(同時指定は400)。
# 例1: シンプルな条件(優先度が high のレコードを取得)
curl -G \
-H "X-API-Token: YOUR_API_TOKEN" \
--data-urlencode 'query=priority = "high"' \
"https://example.com/api/apps/1/records"
# 例2: 括弧を使った入れ子条件
#(優先度が high または urgent、かつステータスが open のレコード)
curl -G \
-H "X-API-Token: YOUR_API_TOKEN" \
--data-urlencode 'query=(priority = "high" or priority = "urgent") and status = "open"' \
"https://example.com/api/apps/1/records"
# 例3: order by / limit 付き
#(今月中が期限のレコードを、期限の昇順で先頭20件)
curl -G \
-H "X-API-Token: YOUR_API_TOKEN" \
--data-urlencode 'query=dueDate = THIS_MONTH() order by dueDate asc limit 20' \
"https://example.com/api/apps/1/records"
# 例4: filterTree で同じ内容の絞り込みを JSON で組み立てる
curl -G \
-H "X-API-Token: YOUR_API_TOKEN" \
--data-urlencode 'filterTree={"mode":"and","conditions":[{"field":"status","operator":"eq","value":"open"}],"groups":[{"mode":"or","conditions":[{"field":"priority","operator":"eq","value":"high"},{"field":"priority","operator":"eq","value":"urgent"}]}]}' \
"https://example.com/api/apps/1/records"query /filterTree に関するエラーは、ステータス400と共に{ "error": "説明文", "code": "..." } の形式で返されます。
| code | 意味 |
|---|---|
QUERY_PARSE_ERROR | query 文字列の構文エラー(エラーメッセージに文字位置を含む)。order by の指定件数が上限(5件)を超えた場合もここに含まれます |
QUERY_UNKNOWN_FIELD | 存在しないフィールドコードを指定した |
QUERY_FORBIDDEN_FIELD | 閲覧権限がないフィールドコードを指定した |
QUERY_SORT_CONFLICT | order by 句と sorts / sortField を同時に指定した、または order by 句が複数件かつ cursor と同時に指定した |
QUERY_PAGING_CONFLICT | limit / offset 句と page / perPage を同時に指定した |
QUERY_OFFSET_MISALIGNED | offset が実効ページサイズの倍数になっていない |
QUERY_TOO_LONG | query 文字列が上限(4KB)を超えた |
QUERY_FILTER_CONFLICT | query と filters / filterTree / filterMode を同時に指定した |
FILTER_TREE_INVALID | filterTree の JSON が不正、またはスキーマ検証に失敗した |
FILTER_TREE_CONFLICT | filterTree と filters / filterMode / filter[フィールドコード] を同時に指定した |
QUERY_PARSE_ERRORorder by の指定件数が上限(5件)を超えた場合もここに含まれますQUERY_UNKNOWN_FIELDQUERY_FORBIDDEN_FIELDQUERY_SORT_CONFLICTQUERY_PAGING_CONFLICTQUERY_OFFSET_MISALIGNEDQUERY_TOO_LONGQUERY_FILTER_CONFLICTFILTER_TREE_INVALIDFILTER_TREE_CONFLICTアプリの公開状態(published /suspended)の変更はPUT /api/apps/{appId}/status で行います。 このエンドポイントは APIトークンでは利用できません。アプリ管理者(admin)権限を持つユーザーのセッションでのみ呼び出せます。
curlを使ったレコード取得の例:
# レコード一覧を取得(フィルタ付き)
curl -X GET \
-H "X-API-Token: YOUR_API_TOKEN" \
"https://example.com/api/apps/1/records?filter[priority]=high&perPage=10"
# JSON フィルタを使う例(複数条件)
curl -X GET \
-H "X-API-Token: YOUR_API_TOKEN" \
--data-urlencode 'filters=[{"field":"priority","operator":"eq","value":"high"}]' \
-G "https://example.com/api/apps/1/records"
# レコードを作成
curl -X POST \
-H "X-API-Token: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"data":{"title":"新規タスク","priority":"medium"}}' \
"https://example.com/api/apps/1/records"
# レコードを更新(楽観ロック付き)
curl -X PUT \
-H "X-API-Token: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"data":{"priority":"high"},"expectedHistoryVersion":3}' \
"https://example.com/api/apps/1/records/42"| ステータスコード | 意味 | 対処方法 |
|---|---|---|
| 400 Bad Request | リクエストの形式が不正 | リクエストボディやパラメータを確認してください |
| 401 Unauthorized | APIトークンが無効または未指定 | X-API-Tokenヘッダーを確認してください |
| 403 Forbidden | トークンに必要な権限がない | トークンの権限設定を確認してください |
| 404 Not Found | 指定されたリソースが存在しない、または権限不足で閲覧できない | appId / recordId と、レコード単位の閲覧権限を確認してください(存在自体を秘匿するため、権限不足でも 404 を返します) |
| 409 Conflict | 楽観的排他制御の競合 | 最新の expectedHistoryVersion を取得して再試行してください |
| 429 Too Many Requests | レート制限超過 | X-RateLimit-Reset に示された時刻以降に再試行してください |
| 500 Internal Server Error | サーバー内部エラー | 時間をおいて再試行し、解決しない場合はサポートへ連絡してください |