ObjectOS
リファレンス

REST API

ObjectOS が公開する HTTP インターフェース — メタデータから生成され、権限でスコープされ、OpenAPI で記述されます。

REST API

宣言したすべてのオブジェクトに、完全な REST エンドポイントセットが自動的に付与されます。 すべてのアクションは POST になります。すべてのフローは /flows/... への POST になります。記述やデプロイが必要な独立した API レイヤーは存在しません。

ベース URL: https://<your-host>/api/v1。 OpenAPI 仕様は /api/v1/openapi.json で公開されています。

Authentication

ObjectOS は Better Auth を使用します。 /api/v1 配下のすべてのルートは、明示的に public とマークされていない限り、 認証済みセッションを必要とします(Public forms を参照)。認証方式は apps/<app>/auth.config.ts で設定します。通常はセッション Cookie か、 /api/v1/auth/sign-in から取得したベアラートークンです。

権限は ルートごと、レコードごと にチェックされます。以下で権限キー (例: ai:chat)が付記されているルートは requirePermission(...) を呼び出します。レコードレベルのアクセスは、データエンジン内部の RBAC + 行レベルセキュリティ + フィールドレベルセキュリティによって強制されます。

Discovery

PathMethod目的
/api/v1GETサービスディスカバリ — 登録されたすべてのルート、バージョン、スコープモードを一覧表示
/api/v1/discoveryGET上記のディスカバリドキュメントに対する明示的なエイリアス
/api/v1/openapi.jsonGET実行中のランタイムにあるすべてのエンドポイントの OpenAPI 3.0 仕様
/api/v1/searchGETすべてのオブジェクトの検索可能フィールドにまたがる全文検索

API 表面の制限

自動生成されるエンドポイントはオブジェクト単位で制御されるため、ルートコードを一切書かずに、 オブジェクトを API から外したり読み取り専用にしたりできます:

  • apiEnabled(boolean、デフォルト true)— false に設定すると、オブジェクトを REST 表面から完全に除外します。そのルートへのリクエストは 404 になります。
  • apiMethods(任意のホワイトリスト)— 設定すると、リストされた操作のみが到達可能になり、 それ以外の操作は REST レイヤーで拒否されます。許可される値: getlistcreateupdatedeleteupsertbulkaggregatehistorysearchrestorepurgeimportexport
// 読み取り専用の参照オブジェクト。API 経由では書き込み不可:
defineObject({
  name: 'exchange_rate',
  apiMethods: ['get', 'list'],
  // ...fields
})

// API が決して公開しない内部オブジェクト:
defineObject({
  name: 'sync_cursor',
  apiEnabled: false,
  // ...fields
})

どちらも現在は REST レイヤーで強制適用されます(ADR-0049)— 以前のバージョンではこれらの プロパティをパースするだけで、適用していませんでした。

Data — /api/v1/data/*

宣言したすべてのオブジェクトに対する CRUD + 高度なクエリ。:object は オブジェクトの name(snake_case)です。

PathMethod目的
/data/:objectGETリスト / クエリ — クエリパラメータとして whereorderBylimitoffsetcursorexpandselect を渡します
/data/:object/queryPOST高度なクエリ — groupBy + aggregations を含む完全な ObjectQL ボディ(ObjectQL を参照)
/data/:object/:idGET1 件のレコードを取得。?select=?expand= をサポート
/data/:objectPOST作成。新しいレコードとともに 201 を返します
/data/:object/:idPATCH更新。楽観的並行性制御のために If-Match: <version> ヘッダー(またはボディ内の expectedVersion)を渡します — 競合時は 409 CONCURRENT_UPDATE
/data/:object/:idDELETE削除。同じ If-Match ルールが適用されます
/data/:object/importPOST一括インポート(CSV または JSON)。ボディ: { format, csv? | rows?, mapping?, dryRun? }。リクエストあたり最大 5,000 行
/data/:object/exportPOSTレコードを csv / xlsx / pdf / json としてエクスポート
/data/:object/:id/sharesGET / POSTレコードごとの共有 — 付与の一覧表示、アクセスの付与
/data/:object/:id/shares/:shareIdDELETE共有を取り消し
/data/lead/:id/convertPOSTSalesforce 風のリード変換(CRM テンプレート)。ボディ: { accountId?, contactId?, createOpportunity? }

Quick example

GET /api/v1/data/support_ticket?where={"status":{"$eq":"open"}}&orderBy=-created_at&limit=20
Authorization: Bearer <token>
{
  "items": [ { "id": "...", "subject": "...", "status": "open" } ],
  "total": 137,
  "nextCursor": "eyJpZCI6IjAxSDA..."
}

AI — /api/v1/ai/*

AI Builderエージェント が動作するためのエンドポイントです。

PathMethodPermission目的
/ai/modelsGETai:chat設定されたプロバイダーから利用可能なモデルを一覧表示
/ai/chatPOSTai:chat単発のチャット補完(同期)
/ai/chat/streamPOSTai:chatストリーミングチャット(SSE)
/ai/completePOSTai:chat生の補完エンドポイント
/ai/conversationsGET / POSTai:chat永続的な会話の一覧表示 / 作成
/ai/conversations/:idGET / DELETEai:chat会話の読み取り / 削除
/ai/conversations/:id/messagesPOSTai:chatユーザーメッセージを追加してエージェントを実行
/ai/pending-actionsGETai:readHITL 承認キュー — AI が提案したミューテーション
/ai/pending-actions/:idGETai:readキューに入ったミューテーションを確認
/ai/pending-actions/:id/approvePOSTai:approveミューテーションを適用
/ai/pending-actions/:id/rejectPOSTai:approve破棄

ai:readai:approve の分離は、AI Builder をエンドユーザーにとって安全なものにする セキュリティプリミティブです。

Actions — /api/v1/actions/*

宣言したすべての *.action.ts がエンドポイントになります。

PathMethod目的
/actions/:actionPOSTアクションを呼び出します。ボディはアクションの入力スキーマです。権限と入力検証はアクション宣言から得られます

各アクションは action_<name> ツールとして AI にも公開されます — Actions を参照してください。

Flows — /api/v1/flows/*

PathMethod目的
/flows/:flow/startPOSTフローを開始します。ボディはフローの入力です
/flows/:flow/runs/:runIdGET実行中 / 完了したフローのステータス + ステップ出力
/flows/:flow/runs/:runId/cancelPOST進行中の実行をキャンセル

Metadata — /api/v1/meta/*

実行中のランタイムのメタデータへの読み取り専用のイントロスペクション。 ツールや Console に役立ちます。

PathMethod目的
/metaGETすべてのメタデータタイプ(objectviewactionflowagent、…)
/meta/:typeGETあるタイプの項目を一覧表示。?package=<id> でフィルタ
/meta/:type/:nameGET1 件の項目を取得。?layers=true で 3 状態の差分ビュー(base / package / overlay)を返します
/meta/:type/:name/referencesGETこの項目を参照しているすべてのメタデータ項目を検索
/meta/:type/:name/historyGETその項目の監査証跡
/meta/:type/:section/:nameGET / POSTセクション化されたメタデータ項目の読み取り / アップサート
/meta/:type/:section/:nameDELETEセクション化された項目を削除

Sharing & approvals

PathMethod目的
/sharing/rulesGET / POST / DELETE共有ルールを管理
/sharing/rules/:idOrName/evaluatePOSTコンテキストに対してルールをドライラン
/approvals/processesGET / POST承認プロセスの定義
/approvals/requestsGET / POST承認リクエストの送信 / 一覧表示
/approvals/requests/:id/approvePOST決定: 承認
/approvals/requests/:id/rejectPOST決定: 却下
PathMethod目的
/reportsGET / POST / PATCHレポートの CRUD
/reports/:id/runPOSTレポートを実行 — 集計された行を返します
/reports/:id/schedulePOST定期配信をスケジュール

Public forms

FormView.sharing.allowAnonymous でオプトインする、唯一の 認証なし のルートです。

PathMethodAuth
/forms/:slugGETpublic — フォームスキーマを返します
/forms/:slug/submitPOSTpublic — 応答を送信します

Utilities

PathMethodPermission目的
/email/sendPOSTemail:send設定されたプロバイダー経由でメールを送信

Error envelope

すべての非 2xx 応答は同じ形式に従います:

{
  "error": {
    "code": "PERMISSION_DENIED",
    "message": "Missing ai:approve on conversation 01H…",
    "details": { "permission": "ai:approve", "subject": "01H…" }
  }
}

一般的なコード: UNAUTHENTICATEDPERMISSION_DENIEDVALIDATION_ERRORNOT_FOUNDCONCURRENT_UPDATERATE_LIMITEDINTERNAL

Versioning

/api/v1安定版 API です。破壊的変更は /api/v2 に入り、 両方が 1 つのマイナーリリースの間並行して提供されます。現在のバージョンと 非推奨化の予定は GET /api/v1 にあります。

See also

  • ObjectQL/data/* で使用されるクエリ言語
  • Field types — データが取り得る形状
  • Build → Actions — カスタムエンドポイントを宣言
  • Security — すべてのルートが実行前にチェックする内容

On this page