REST API

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}/records

トークン権限

APIトークンには以下の権限を個別に付与できます。必要最小限の権限を設定してください。

権限
read
説明
レコードの閲覧・取得
対応メソッド
GET
権限
write
説明
レコードの作成・更新
対応メソッド
POST, PUT
権限
delete
説明
レコードの削除
対応メソッド
DELETE

レート制限

  • APIトークンごとに 600リクエスト/分 の制限があります。
  • 制限を超えた場合、ステータスコード 429 Too Many Requests が返されます。
  • レート制限に達した 429 レスポンスにはX-RateLimit-Limit /X-RateLimit-Remaining /X-RateLimit-Reset ヘッダーが付与されます (Reset は Unix 秒)。
  • テナントごとの同時接続数上限とアプリごとの日次リクエスト上限も別途適用され、超過時はいずれも429 が返されます。

エンドポイント一覧

GET
/api/apps/{appId}/records
read

レコード一覧を取得します。フィルタ・ソート・ページネーションに対応しています。

pageページ番号(1始まり、デフォルト: 1)
perPage1ページあたりの件数(デフォルト: 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(子孫カテゴリも含めて絞り込み)
GET
/api/apps/{appId}/records/{recordId}
read

指定したレコードの詳細を取得します。権限で閲覧できないレコードは 404 を返します(存在するかどうかは判定できません)。

POST
/api/apps/{appId}/records
write

新しいレコードを作成します。レコードの値は data オブジェクトに、フィールドコードをキーとして指定します。

{
  "data": {
    "title": "サンプルタイトル",
    "priority": "high",
    "dueDate": "2026-04-01"
  }
}
PUT
/api/apps/{appId}/records/{recordId}
write

既存のレコードを更新します。data に指定したフィールドのみ更新されます。

{
  "data": {
    "priority": "medium"
  },
  "expectedHistoryVersion": 5
}

💡 expectedHistoryVersion を指定すると楽観的排他制御が有効になります。サーバー側の現在値と一致しない場合は 409 Conflict が返されます。

DELETE
/api/apps/{appId}/records/{recordId}
delete

指定したレコードを削除します。

PUT
/api/apps/{appId}/records/bulk
write

複数レコードに同じ内容を一括で適用して更新します(最大100件)。すべてのレコードに共通の data を反映したいケース向けです。

{
  "recordIds": ["rec_001", "rec_002"],
  "data": {
    "status": "completed"
  }
}

💡 レコードごとに異なる値を指定したい場合は /records/bulk-individual を使用してください。

DELETE
/api/apps/{appId}/records/bulk
delete

複数レコードを一括削除します(最大100件)。

{
  "recordIds": ["rec_001", "rec_002"]
}
PUT
/api/apps/{appId}/records/bulk-individual
write

レコードごとに異なる内容で作成・更新・削除を混在させて実行します(合計最大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 を渡せます。

GET
/api/apps/{appId}
read

アプリの基本情報(名前・説明・設定など)を取得します。

GET
/api/apps/{appId}/fields
read

アプリのフィールド定義一覧を取得します。

GET
/api/apps/{appId}/records/summary
read

数値フィールドの集計値(合計・平均・最小・最大・件数)を取得します。フィルタ・検索で対象を絞り込めます。

field集計するフィールドコード(複数指定可: ?field=amount&field=price)
filtersFilterCondition の JSON 配列(filterMode: and / or と併用)
filterTreeFilterNode の JSON(filters と排他)
search全文検索文字列
categoryIdカテゴリでの絞り込み

💡 フィールド権限・レコード権限を尊重した集計結果が返ります。

GET
/api/apps/{appId}/records/{recordId}/workflow
read

レコードの現在のワークフロー状態(ステータス・作業者・実行可能な遷移・履歴)を取得します。

POST
/api/apps/{appId}/records/{recordId}/workflow
write

レコードのワークフローステータスを遷移させます。

{
  "transitionId": "<transitionId>",
  "comment": "承認しました",
  "assignee": "<userId>"
}

💡 transitionId は必須(実行可能な遷移は GET または一括遷移候補 API で取得できます)。comment と assignee(次のステータスの作業者に指定するユーザー ID)は省略可能です。遷移ルールの実行条件・実行可能なユーザーの制約は通常どおり適用されます。

POST
/api/bulk-request
write

複数アプリをまたぐ操作(レコード作成・更新・削除、ステータス遷移、作業者変更、コメント投稿・削除)を 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 に操作ごとの結果が返ります。

POST
/api/apps/{appId}/records/bulk/workflow
read

指定した複数レコードに対して、共通して実行可能なワークフロー遷移の候補一覧を返します(最大200件)。一括遷移UIのプルダウン構築に使用します。

{
  "recordIds": ["rec_001", "rec_002"]
}

💡 すべての指定レコードに共通して適用可能な遷移のみが返されます。各レコードの現在のステータスが異なる場合、それぞれのステータスに有効な遷移の積集合が返されます。

PUT
/api/apps/{appId}/records/bulk/workflow
write

複数レコードのワークフローステータスを一括で遷移させます(最大200件)。現在のステータスごとに実行する遷移IDを指定します。

{
  "recordIds": ["rec_001", "rec_002"],
  "transitionIdsByFromStatus": {
    "<fromStatusId>": "<transitionId>"
  },
  "comment": "一括承認しました"
}

💡 transitionIdsByFromStatus は「現在のステータスID → 実行する遷移ID」のマッピングです。comment は省略可能(最大1000文字)。各レコードの遷移認可は内部で個別にチェックされ、1件失敗しても残りは続行されます。レスポンスには成功・失敗それぞれのレコードIDが含まれます。

GET
/api/apps/{appId}/records/{recordId}/comments
read

レコードのコメント一覧を取得します(カーソルページネーション)。

take取得件数(既定 50、最大 200)
cursor前ページ最後のコメントの id を指定すると、その続きから取得
order並び順。asc または desc(既定 desc = 新しい順)

💡 レスポンスは { "data": [...], "total": n } の形です。続きを取得するには data の最後の要素の id を次リクエストの cursor に渡します。アプリのコメント機能が無効の場合は data が空配列で commentsEnabled: false が返ります。

POST
/api/apps/{appId}/records/{recordId}/comments
write

レコードにコメントを投稿します。

{
  "body": "コメント本文",
  "mentions": [
    { "type": "user", "targetId": "<userId>" }
  ]
}

💡 本文のキー名は body です(最大 65,535 文字)。mentions は省略可能(最大 10 件)で、type は user / group / organization のいずれか、targetId はそれぞれの ID です。実在しない対象は無視されます。メンションされた相手には通知が送られます。レスポンスは作成されたコメントです。

DELETE
/api/apps/{appId}/records/{recordId}/comments/{commentId}
write

指定したコメントを削除します。API トークンで削除できるのは、トークンの発行者本人が投稿したコメントだけです(トークンの発行者がアプリ管理者でも、他のユーザーのコメントは削除できません)。

💡 このエンドポイントには write 権限が必要です。他のユーザーが投稿したコメントを指定すると 403 が返され、コメントは削除されません。トークンの発行者が閲覧できないレコードのコメントは 404 になります。レスポンスは { "success": true } です。

POST
/api/apps/{appId}/records/{recordId}/workflow/assignee
API トークン不可

レコードの現在の作業者を変更または解除します。アプリ管理者だけが画面から行える操作で、API トークンでは実行できません(トークンの発行者がアプリ管理者でも同じです)。

{
  "assigneeUserId": "<userId>"
}

💡 API トークンで呼び出すと 403(errorKey: apiToken.adminOperationForbidden)が返され、作業者は変わりません。画面から操作する場合、assigneeUserId に null を指定すると担当者を解除(unclaim)します。ワークフローが設定されていないレコードや、存在しないユーザーIDを指定した場合は 400 が返されます。

POST
/api/apps/{appId}/records/batch
write

複数レコードを一括で作成します(最大100件)。1件でも失敗した場合は全件ロールバックされ、何も確定しません。

{
  "records": [
    { "data": { "title": "タスクA", "priority": "high" } },
    { "data": { "title": "タスクB", "priority": "medium" } }
  ]
}

💡 成功時は作成されたレコードの id / recordNumber / historyVersion を配列で返します。エラー時は失敗した要素の index と recordId を含むエラー情報が返され、全件ロールバックされます。

PUT
/api/apps/{appId}/records/batch
write

複数レコードをそれぞれ異なる内容で一括更新します(最大100件)。1件でも失敗した場合は全件ロールバックされます。

{
  "records": [
    {
      "id": "<recordId>",
      "data": { "priority": "high" },
      "expectedHistoryVersion": 3
    },
    {
      "updateKey": { "field": "externalCode", "value": "ABC-001" },
      "data": { "status": "completed" }
    }
  ]
}

💡 id の代わりに updateKey(unique 制約付きフィールドのコードと値)でレコードを指定できます。updateKey はキーに一致するレコードを更新するのみで、一致するレコードが存在しない場合はエラーになります(新規作成は行いません)。expectedHistoryVersion を指定すると楽観的排他制御が有効になります。

DELETE
/api/apps/{appId}/records/batch
delete

複数レコードを一括削除します(最大100件)。1件でも失敗した場合は全件ロールバックされます。

{
  "records": [
    { "id": "<recordId>" },
    { "id": "<recordId>" }
  ]
}

複数操作の原子実行 (bulkRequest)

POST /api/bulk-request を使うと、 複数の操作を1リクエストにまとめて単一トランザクションで原子実行できます。 1つでも操作が失敗した場合は全操作がロールバックされ、何も確定しません。 レコードの CRUD・ワークフロー遷移・コメント操作を、複数のアプリをまたいで混在させることができます。

リクエストボディは { "operations": [ ... ] } 形式で、 最大 20 操作まで指定できます。各操作は op(操作種別)とappId を必ず含みます。

サポートする操作 (op)

op
record.create
フィールド
op, appId, data
説明
レコードを作成します。write 権限が必要です。
op
record.update
フィールド
op, appId, id | updateKey, data, expectedHistoryVersion?
説明
レコードを更新します。id または updateKey のいずれか一方を指定します。write 権限が必要です。
op
record.delete
フィールド
op, appId, id, expectedHistoryVersion?
説明
レコードを削除します。delete 権限が必要です。
op
record.status
フィールド
op, appId, id, transitionId, comment?, assignee?
説明
ワークフローを遷移させます。write 権限が必要です。
op
record.assignee
フィールド
op, appId, id, assigneeUserId | null
説明
レコードの作業者を変更または解除します。アプリ管理者だけが画面から行える操作で、API トークンでは実行できません(トークンの発行者がアプリ管理者でも 403 apiToken.adminOperationForbidden になり、一括全体が実行されません)。assigneeUserIdnull を指定すると解除します。
op
comment.create
フィールド
op, appId, recordId, body, mentions?
説明
コメントを投稿します。mentions[{ "type": "...", "targetId": "..." }] 形式(最大10件)。write 権限が必要です。
op
comment.delete
フィールド
op, appId, recordId, commentId
説明
コメントを削除します。API トークンで削除できるのは、トークンの発行者本人が投稿したコメントだけです(トークンの発行者がアプリ管理者でも、他のユーザーのコメントは削除できません)。write 権限が必要です。

レスポンス

成功時は { "results": [ ... ] } を返します。results は入力の operations と同じ順序で、各 op の結果が入ります。 レコード操作の結果には opidrecordNumberhistoryVersion が含まれます。 コメント操作の結果には opcommentId が含まれます。

いずれかの操作が失敗した場合は、失敗した操作の情報を含む以下のエラーレスポンスが返され、全操作がロールバックされます。

{
  "error": "エラーメッセージ",
  "index": 1,
  "op": "record.update",
  "appId": "<appId>",
  "code": "PERMISSION_DENIED",   // 省略されることがあります
  "details": { ... }             // 省略されることがあります
}

APIトークン認証の制約

セッション認証(ログインユーザー)では複数アプリの操作を1リクエストに混在させることができます。APIトークン認証では、トークンを発行したアプリの操作のみ実行できます(他のアプリを指定した操作は 403 になります)。 また、各 op には対応するトークンスコープが必要です(record.delete には delete 権限、それ以外は write 権限)。

副作用

通知・ルックアップ集計などの副作用(post-commit side effects)は、トランザクションのコミット後にまとめて実行されます。 副作用の失敗はリクエスト全体の結果には影響しません。

curl 例

# 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"
}

ファイル(添付)API

レコードのフィールドにファイルを添付するには、まずファイルをアップロードしてid を取得し、 その id をレコードの data に指定します。

アップロード

POST /api/uploadmultipart/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 と一緒に指定します)

既存レコードの添付フィールドにファイルを追加するときは、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}/fieldssettings.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 になります。 すべてのキーが未知の場合は「この行は空行として保存されます」と明示されるので、 メッセージの対応表どおりにキーを置き換えて再送してください。

なお、明細の値そのものを条件にした絞り込み・集計はできません。filtersfielddetails.amount のような 指定をしてもエラーにはならず、常に 0 件になります(明細は配列なので この形では値に届きません)。明細の値で絞り込む・集計するには、レコード側に計算フィールドまたは 関連レコード集計フィールドを用意して、そのフィールドコードを使ってください。

cursor(シーク)ページング

大量のレコードを順次取得する際は、offset ページング(page)ではなくcursor ページングを使用することを推奨します。 cursor ページングはシーク方式のため、レコードの追加・削除が発生しても重複や取りこぼしが起きません。

レスポンスに nextCursor が含まれる場合、次のリクエストのcursor パラメータにその値を渡すことで次ページを取得できます。nextCursor が含まれない場合は最終ページです。

対応するソートと制約

ソート指定
recordNumber(組み込み)
cursor 利用
可(全件確実に取得可能)
備考
件数上限なし。最も安定
ソート指定
createdAt / updatedAt(組み込み)
cursor 利用
可(全件確実に取得可能)
備考
件数上限なし。タイムスタンプ+recordNumber の複合カーソル
ソート指定
任意の単一フィールド(カスタムフィールド)
cursor 利用
可(5,000件以内のみ)
備考
cursor 利用時は対象件数が5,000件を超えるとシークが安定しないため recordNumber 降順にフォールバック(sortFallback: true がレスポンスに含まれます)。page によるページングでは件数上限なし(2026-09-02〜。ただしカンバン列の絞り込み・「担当者のみ」・「自分の作業」のいずれかを併用した場合は従来どおり 5,000 件上限が残ります)
ソート指定
複数ソート(sorts に2件以上)
cursor 利用
不可
備考
cursor と同時指定すると 400 エラー。offset ページング(page)を使用してください

全件を確実かつ順次取得したい場合は、組み込みフィールド(recordNumber / createdAt / updatedAt)でのソート + cursorを使用してください。件数上限なく取りこぼしなく全件を traverse できます。 任意フィールドでのソート + cursor は、対象件数が 5,000 件以内の場合のみ安定して動作します。

cursor ページングの例

# 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 が含まれなくなったら最終ページ

クエリ文字列によるフィルタ(query パラメータ)

レコード一覧取得(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

条件は 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トークンの発行者)

※ 未対応の関数名を指定した場合は構文エラー(400)になります。関数名も大文字・小文字を区別しません。

※ 範囲を表す関数(THIS_WEEK()LAST_7_DAYS() / LAST_N_DAYS(n) / NEXT_N_DAYS(n)、上表で「〜の範囲」と説明されている行)は演算子 = としか組み合わせられません(!= / > 等と組み合わせると構文エラー(400)になります)。

order by / limit / offset

  • 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バイト)まで
  • 条件の合計数: 50件まで(in (...) の展開後の件数も含む)
  • 括弧・グループのネスト深さ: 最大3階層
  • 1階層あたりの子グループ数: 最大10
  • not in (...) の値: 最大200件(超過は400エラー)
  • offset の値: 最大100000(超過は400エラー)
  • not in (...) の値リストには関数呼び出し(TODAY() 等)を指定できません(動的な値の解決対象外になり、意図せず全件一致してしまうのを防ぐための制限です。動的な除外条件が必要な場合は!= 条件を and で並べてください)
  • not in ()(値0件)と in () は非対称です。not in () は「除外対象なし」=全件一致として扱われますが、in () は値を1件も指定できないため400エラーになります

queryfilters /filterTree /filterMode /filter[フィールドコード] のいずれとも同時に指定できません(同時指定は400)。

filterTree パラメータ(JSON形式)

絞り込み条件をクエリ文字列ではなく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文字列化したもの)です。filterTreefilters /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)

query /filterTree に関するエラーは、ステータス400と共に{ "error": "説明文", "code": "..." } の形式で返されます。

code
QUERY_PARSE_ERROR
意味
query 文字列の構文エラー(エラーメッセージに文字位置を含む)。order by の指定件数が上限(5件)を超えた場合もここに含まれます
code
QUERY_UNKNOWN_FIELD
意味
存在しないフィールドコードを指定した
code
QUERY_FORBIDDEN_FIELD
意味
閲覧権限がないフィールドコードを指定した
code
QUERY_SORT_CONFLICT
意味
order by 句と sorts / sortField を同時に指定した、または order by 句が複数件かつ cursor と同時に指定した
code
QUERY_PAGING_CONFLICT
意味
limit / offset 句と page / perPage を同時に指定した
code
QUERY_OFFSET_MISALIGNED
意味
offset が実効ページサイズの倍数になっていない
code
QUERY_TOO_LONG
意味
query 文字列が上限(4KB)を超えた
code
QUERY_FILTER_CONFLICT
意味
query と filters / filterTree / filterMode を同時に指定した
code
FILTER_TREE_INVALID
意味
filterTree の JSON が不正、またはスキーマ検証に失敗した
code
FILTER_TREE_CONFLICT
意味
filterTree と filters / filterMode / filter[フィールドコード] を同時に指定した

アプリ公開状態の切り替え

アプリの公開状態(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
意味
サーバー内部エラー
対処方法
時間をおいて再試行し、解決しない場合はサポートへ連絡してください

制限事項

  • 1つのアプリにつき、APIトークンは20個まで発行できます
  • 1回のレコード取得は500件までです(perPage の上限)
  • 一括更新・一括削除(/records/bulk)は最大100件まで
  • 一括作成・更新・削除(/records/batch)は最大100件まで。1件でも失敗した場合は全件ロールバックされます
  • 個別指定の一括操作(/records/bulk-individual)は creates + updates + deletes の合計で最大200件まで
  • 複数操作の原子実行(/bulk-request)は1リクエストあたり最大20操作まで。1つでも失敗した場合は全操作ロールバックされます
  • リクエストボディのサイズは50MBまでです
  • アップロードしたファイルは、レコードに添付しない限り3日間で削除されます