EmDash は、サポート対象のアプリケーション プログラミング インターフェース(API)を /_emdash/api/ 配下で公開しています。リクエスト パラメーター、ボディ、レスポンス スキーマ、ステータス コード、クライアント生成には、生成された OpenAPI 3.1 ドキュメントを使用してください。
GET /_emdash/api/openapi.json
このドキュメントは API が使用する Zod スキーマと同じものから生成されます。設定されたメディア アップロードの最大サイズも反映されます。
公開契約の境界
OpenAPI ドキュメントが、サポート対象 REST API の境界です。EmDash には管理画面やプロトコル ワークフロー用のルートもあります。ソースツリーに存在するが OpenAPI にないルートは、外部クライアント向けのサポート対象 REST 操作ではありません。
この区別は、バックアップ、バイライン管理、リレーション走査、プラグイン管理、セットアップ、インポート、認証の各ルートに当てはまります。バックアップは バックアップ ガイド を、サポート対象のバイライン管理は MCP バイライン ツール を使用してください。OAuth エンドポイントはプロトコル エンドポイントです。MCP OAuth セクション で説明するメタデータから発見し、アプリケーション REST エンドポイントとして扱わないでください。
認証と認可
ほとんどの操作は、EmDash セッション Cookie または Bearer トークンのいずれかを受け付けます。パーソナル アクセス トークンまたは OAuth アクセス トークンを Authorization ヘッダーで送信します。
Authorization: Bearer $EMDASH_TOKEN
Bearer トークンはスコープと関連ユーザーのロールによって制限されます。セッション リクエストはユーザーのロールを使用します。認可モデルは ユーザーロール と トークン スコープ を参照してください。
GET および POST /_emdash/api/comments/{collection}/{contentId} は公開です。GET は承認済みコメントを返し、POST はモデレーション用にコメントを送信します。残りのコメント モデレーション操作には認証が必要です。
クロスサイト リクエスト フォージェリ(CSRF)対策
セッション Cookie で認証する状態変更リクエストには、次のヘッダーを含めます。
X-EmDash-Request: 1
Bearer トークン リクエストはブラウザの暗黙的資格情報を使わないため、このヘッダーは不要です。公開の書き込み操作へのブラウザ リクエストは、ヘッダーを送るか、EmDash サイトの公開またはリクエスト オリジンと一致する Origin を持つ必要があります。
レスポンス エンベロープ
成功した JSON レスポンスは success を true にし、操作固有の結果を data に置きます。
{
"success": true,
"data": {
"items": []
}
}
エラーでは success が false になり、安定した機械可読コードとメッセージが含まれます。一部のエラーには構造化された details もあります。
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Content item not found"
}
}
各 OpenAPI 操作のステータス コードとエラー スキーマを使用してください。一般的なステータスは、無効な入力の 400、資格情報の欠如または無効の 401、スコープまたは権限不足の 403、リソース不在の 404、状態競合の 409、サイズ超過アップロードの 413、プラグインによる保存拒否の 422、内部障害の 500 です。
エンドポイント一覧
操作 ID は生成された契約内で安定しており、OpenAPI クライアント生成器ではメソッド名としてよく使われます。次の一覧は生成された OpenAPI ドキュメントと照合されています。
コンテンツ
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/content/{collection} | listContent | コンテンツ項目を一覧 |
POST | /_emdash/api/content/{collection} | createContent | コンテンツ項目を作成 |
GET | /_emdash/api/content/{collection}/{id} | getContent | コンテンツ項目を取得 |
PUT | /_emdash/api/content/{collection}/{id} | updateContent | コンテンツ項目を更新 |
DELETE | /_emdash/api/content/{collection}/{id} | deleteContent | コンテンツ項目を削除(ソフト削除) |
POST | /_emdash/api/content/{collection}/{id}/publish | publishContent | コンテンツ項目を公開 |
POST | /_emdash/api/content/{collection}/{id}/unpublish | unpublishContent | コンテンツ項目の公開を取り消す |
POST | /_emdash/api/content/{collection}/{id}/schedule | scheduleContent | 将来の公開のためにコンテンツをスケジュール |
DELETE | /_emdash/api/content/{collection}/{id}/schedule | unscheduleContent | スケジュールされた公開をキャンセル |
POST | /_emdash/api/content/{collection}/{id}/duplicate | duplicateContent | コンテンツ項目を複製 |
POST | /_emdash/api/content/{collection}/{id}/restore | restoreContent | ゴミ箱からコンテンツ項目を復元 |
DELETE | /_emdash/api/content/{collection}/{id}/permanent | permanentDeleteContent | コンテンツ項目を完全に削除 |
GET | /_emdash/api/content/{collection}/{id}/compare | compareContent | ライブと下書きのリビジョンを比較 |
POST | /_emdash/api/content/{collection}/{id}/discard-draft | discardDraft | 下書きの変更を破棄 |
GET | /_emdash/api/content/{collection}/{id}/lock | getEntryLock | エントリーの編集ロックを読み取る |
POST | /_emdash/api/content/{collection}/{id}/lock | acquireEntryLock | エントリーの編集ロックを取得または更新 |
DELETE | /_emdash/api/content/{collection}/{id}/lock | releaseEntryLock | 呼び出し元の編集ロックを解放 |
GET | /_emdash/api/content/{collection}/{id}/translations | getContentTranslations | コンテンツ項目の翻訳を取得 |
GET | /_emdash/api/content/{collection}/{id}/terms/{taxonomy} | getContentTerms | コンテンツ項目に割り当てられたタクソノミ用語を取得 |
POST | /_emdash/api/content/{collection}/{id}/terms/{taxonomy} | setContentTerms | コンテンツ項目にタクソノミ用語を設定 |
GET | /_emdash/api/content/{collection}/authors | listContentAuthors | コレクションのコンテンツの著者を重複なく一覧 |
GET | /_emdash/api/content/{collection}/trash | listTrashedContent | ゴミ箱のコンテンツ項目を一覧 |
メディア
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/media | listMedia | メディア項目を一覧 |
POST | /_emdash/api/media | uploadMedia | メディア項目をアップロード |
GET | /_emdash/api/media/folders | listMediaFolders | メディア フォルダーを一覧 |
POST | /_emdash/api/media/folders | createMediaFolder | メディア フォルダーを作成 |
GET | /_emdash/api/media/folders/{id} | getMediaFolder | メディア フォルダーを取得 |
PUT | /_emdash/api/media/folders/{id} | updateMediaFolder | メディア フォルダーを更新 |
DELETE | /_emdash/api/media/folders/{id} | deleteMediaFolder | メディア フォルダーを削除 |
GET | /_emdash/api/media/{id} | getMedia | メディア項目を取得 |
PUT | /_emdash/api/media/{id} | updateMedia | メディア メタデータを更新 |
DELETE | /_emdash/api/media/{id} | deleteMedia | メディア項目を削除 |
GET | /_emdash/api/media/{id}/usage | getMediaUsage | メディア使用状況の詳細を取得 |
PUT | /_emdash/api/media/{id}/replace | replaceMediaImage | メディア画像を置き換え |
POST | /_emdash/api/admin/media-usage/repair | repairMediaUsage | メディア使用インデックスを修復 |
GET | /_emdash/api/admin/media-usage/progress | getMediaUsageProgress | メディア使用インデックス作成の進捗を取得 |
POST | /_emdash/api/admin/media-usage/progress | advanceMediaUsageProgress | メディア使用インデックス作成を進める |
GET | /_emdash/api/admin/media-usage/work | listMediaUsageWork | 永続的なメディア使用ワークを一覧 |
GET | /_emdash/api/admin/media-usage/activation | getMediaUsageActivation | メディア使用の有効化状態を取得 |
POST | /_emdash/api/admin/media-usage/activation | advanceMediaUsageActivation | メディア使用の有効化を進める |
POST | /_emdash/api/admin/media-usage/work/retry | retryMediaUsageWork | 永続的なメディア使用ジョブを 1 件再試行 |
GET | /_emdash/api/admin/media-usage/collection-deletions | listMediaUsageCollectionDeletions | 永続的なコレクション削除を一覧 |
POST | /_emdash/api/admin/media-usage/collection-deletions/retry | retryMediaUsageCollectionDeletion | コレクション削除を 1 件再試行 |
POST | /_emdash/api/media/upload-url | getMediaUploadUrl | メディア アップロード先を取得 |
POST | /_emdash/api/media/{id}/confirm | confirmMediaUpload | メディア アップロードを確認 |
PUT | /_emdash/api/media/{id}/upload | uploadPendingMedia | EmDash 経由で保留中のメディア ファイルをアップロード |
スキーマ
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/schema/block-types | listBlockTypes | ブロック型を一覧 |
POST | /_emdash/api/schema/block-types | createBlockType | ブロック型を作成 |
GET | /_emdash/api/schema/block-types/{slug} | getBlockType | ブロック型を取得 |
PUT | /_emdash/api/schema/block-types/{slug} | updateBlockType | ブロック型を更新 |
POST | /_emdash/api/schema/block-types/{slug}/versions/{version}/activate | activateBlockTypeVersion | ブロック型バージョンを有効化 |
GET | /_emdash/api/schema/collections | listCollections | すべてのコレクションを一覧 |
POST | /_emdash/api/schema/collections | createCollection | コレクションを作成 |
GET | /_emdash/api/schema/collections/{slug} | getCollection | コレクションを取得 |
PUT | /_emdash/api/schema/collections/{slug} | updateCollection | コレクションを更新 |
DELETE | /_emdash/api/schema/collections/{slug} | deleteCollection | コレクションを削除 |
GET | /_emdash/api/schema/collections/{slug}/fields | listFields | コレクションのフィールドを一覧 |
POST | /_emdash/api/schema/collections/{slug}/fields | createField | フィールドを作成 |
GET | /_emdash/api/schema/collections/{slug}/fields/{fieldSlug} | getField | フィールドを取得 |
PUT | /_emdash/api/schema/collections/{slug}/fields/{fieldSlug} | updateField | フィールドを更新 |
DELETE | /_emdash/api/schema/collections/{slug}/fields/{fieldSlug} | deleteField | フィールドを削除 |
POST | /_emdash/api/schema/collections/reorder | reorderCollections | 管理サイドバー内のコレクション順を変更 |
POST | /_emdash/api/schema/collections/{slug}/fields/reorder | reorderFields | コレクション内のフィールド順を変更 |
GET | /_emdash/api/schema/orphans | listOrphanedTables | 孤立したコンテンツ テーブルを一覧 |
POST | /_emdash/api/schema/orphans/{slug} | registerOrphanedTable | 孤立したテーブルをコレクションとして登録 |
コメント
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/comments/{collection}/{contentId} | listPublicComments | コンテンツの承認済みコメントを一覧 |
POST | /_emdash/api/comments/{collection}/{contentId} | createComment | 新しいコメントを送信 |
GET | /_emdash/api/admin/comments | listAdminComments | モデレーション用にコメントを一覧 |
GET | /_emdash/api/admin/comments/counts | getCommentCounts | コメント状態の件数を取得 |
POST | /_emdash/api/admin/comments/bulk | bulkCommentAction | コメントを一括承認、スパム、ゴミ箱、削除 |
GET | /_emdash/api/admin/comments/{id} | getComment | 単一のコメントを取得 |
DELETE | /_emdash/api/admin/comments/{id} | deleteComment | コメントを完全に削除 |
PUT | /_emdash/api/admin/comments/{id}/status | updateCommentStatus | コメント状態を変更 |
タクソノミ
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/taxonomies | listTaxonomies | すべてのタクソノミ定義を一覧 |
GET | /_emdash/api/taxonomies/{name} | getTaxonomy | タクソノミ定義を取得 |
PUT | /_emdash/api/taxonomies/{name} | updateTaxonomy | タクソノミ定義を更新 |
DELETE | /_emdash/api/taxonomies/{name} | deleteTaxonomy | タクソノミ、用語、コンテンツ割り当てを削除 |
GET | /_emdash/api/taxonomies/{name}/translations | listTaxonomyTranslations | タクソノミ定義の各ロケール バリアントを一覧 |
POST | /_emdash/api/taxonomies/{name}/reorder | reorderTerms | 1 つの兄弟用語グループの手動順序を設定 |
GET | /_emdash/api/taxonomies/{name}/terms | listTerms | タクソノミの用語を一覧 |
POST | /_emdash/api/taxonomies/{name}/terms | createTerm | 用語を作成 |
GET | /_emdash/api/taxonomies/{name}/terms/{slug} | getTerm | スラッグで用語を取得 |
PUT | /_emdash/api/taxonomies/{name}/terms/{slug} | updateTerm | 用語を更新 |
DELETE | /_emdash/api/taxonomies/{name}/terms/{slug} | deleteTerm | 用語を削除 |
メニュー
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/menus | listMenus | 項目数付きですべてのメニューを一覧 |
POST | /_emdash/api/menus | createMenu | メニューを作成 |
GET | /_emdash/api/menus/{name} | getMenu | すべての項目を含むメニューを取得 |
PUT | /_emdash/api/menus/{name} | updateMenu | メニューを更新 |
DELETE | /_emdash/api/menus/{name} | deleteMenu | メニューとその項目を削除 |
POST | /_emdash/api/menus/{name}/items | createMenuItem | メニューに項目を追加 |
PUT | /_emdash/api/menus/{name}/items/{id} | updateMenuItem | メニュー項目を更新 |
DELETE | /_emdash/api/menus/{name}/items/{id} | deleteMenuItem | メニュー項目を削除 |
POST | /_emdash/api/menus/{name}/reorder | reorderMenuItems | メニュー項目を一括並べ替え |
セクション
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/sections | listSections | セクションを一覧 |
POST | /_emdash/api/sections | createSection | セクションを作成 |
GET | /_emdash/api/sections/{slug} | getSection | スラッグでセクションを取得 |
PUT | /_emdash/api/sections/{slug} | updateSection | セクションを更新 |
DELETE | /_emdash/api/sections/{slug} | deleteSection | セクションを削除 |
ウィジェット
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/widget-areas | listWidgetAreas | すべてのウィジェット エリアを一覧 |
POST | /_emdash/api/widget-areas | createWidgetArea | ウィジェット エリアを作成 |
GET | /_emdash/api/widget-areas/{name} | getWidgetArea | ウィジェット付きのウィジェット エリアを取得 |
DELETE | /_emdash/api/widget-areas/{name} | deleteWidgetArea | ウィジェット エリアとそのウィジェットを削除 |
POST | /_emdash/api/widget-areas/{name}/widgets | createWidget | エリアにウィジェットを追加 |
PUT | /_emdash/api/widget-areas/{name}/widgets/{id} | updateWidget | ウィジェットを更新 |
DELETE | /_emdash/api/widget-areas/{name}/widgets/{id} | deleteWidget | ウィジェットを削除 |
POST | /_emdash/api/widget-areas/{name}/reorder | reorderWidgets | エリア内のウィジェット順を変更 |
設定
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/settings | getSettings | サイト設定を取得 |
PUT | /_emdash/api/settings | updateSettings | サイト設定を更新 |
検索
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/search | search | コレクション横断の全文検索 |
GET | /_emdash/api/search/suggest | searchSuggest | オートコンプリート検索候補 |
POST | /_emdash/api/search/rebuild | rebuildSearchIndex | コレクションの検索インデックスを再構築 |
POST | /_emdash/api/search/enable | enableSearch | コレクションの検索を有効または無効化 |
GET | /_emdash/api/search/stats | getSearchStats | 検索インデックス統計を取得 |
リダイレクト
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/redirects | listRedirects | リダイレクトを一覧 |
POST | /_emdash/api/redirects | createRedirect | リダイレクト規則を作成 |
GET | /_emdash/api/redirects/{id} | getRedirect | リダイレクトを取得 |
PUT | /_emdash/api/redirects/{id} | updateRedirect | リダイレクトを更新 |
DELETE | /_emdash/api/redirects/{id} | deleteRedirect | リダイレクトを削除 |
GET | /_emdash/api/redirects/404s | listNotFoundEntries | 404 ログエントリーを一覧 |
POST | /_emdash/api/redirects/404s | pruneNotFoundLog | 古い 404 ログエントリーを整理 |
DELETE | /_emdash/api/redirects/404s | clearNotFoundLog | 404 ログエントリーをすべて消去 |
GET | /_emdash/api/redirects/404s/summary | getNotFoundSummary | パス別にグループ化した 404 サマリーを取得 |
ユーザー
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/admin/users | listUsers | ユーザーを一覧 |
GET | /_emdash/api/admin/users/{id} | getUser | ユーザー詳細を取得 |
PUT | /_emdash/api/admin/users/{id} | updateUser | ユーザーを更新 |
POST | /_emdash/api/admin/users/{id}/disable | disableUser | ユーザー アカウントを無効化 |
POST | /_emdash/api/admin/users/{id}/enable | enableUser | ユーザー アカウントを有効化 |
GET | /_emdash/api/admin/allowed-domains | listAllowedDomains | 許可されたメール ドメインを一覧 |
POST | /_emdash/api/admin/allowed-domains | createAllowedDomain | 許可されたメール ドメインを追加 |
PUT | /_emdash/api/admin/allowed-domains/{domain} | updateAllowedDomain | 許可されたドメインを更新 |
DELETE | /_emdash/api/admin/allowed-domains/{domain} | deleteAllowedDomain | 許可されたドメインを削除 |
転送
| メソッド | パス | 操作 | 概要 |
|---|---|---|---|
GET | /_emdash/api/admin/transfer/capabilities | getTransferCapabilities | サイト転送機能を取得 |
GET | /_emdash/api/admin/transfer/imports | listTransferImports | サイト インポートを一覧 |
POST | /_emdash/api/admin/transfer/imports | createTransferImport | サイト インポートを作成 |
GET | /_emdash/api/admin/transfer/imports/{id} | getTransferImport | サイト インポートを取得 |
GET | /_emdash/api/admin/transfer/imports/{id}/missing | listTransferImportMissingFiles | 未アップロードのパッケージ ファイルを一覧 |
PUT | /_emdash/api/admin/transfer/imports/{id}/files/{path} | uploadTransferImportFile | パッケージ ファイルを 1 件アップロード |
POST | /_emdash/api/admin/transfer/imports/{id}/analyze | analyzeTransferImport | インポート分析を進める |
GET | /_emdash/api/admin/transfer/imports/{id}/plan | getTransferImportPlan | インポート計画を取得 |
POST | /_emdash/api/admin/transfer/imports/{id}/cancel | cancelTransferImport | サイト インポートをキャンセル |
POST | /_emdash/api/admin/transfer/imports/{id}/abandon | abandonTransferImport | 失敗またはキャンセルしたインポートを放棄 |
POST | /_emdash/api/admin/transfer/imports/{id}/execute | executeTransferImport | 計画済みインポートを開始 |
POST | /_emdash/api/admin/transfer/imports/{id}/advance | advanceTransferImport | 実行中のインポートを進める |
GET | /_emdash/api/admin/transfer/imports/{id}/receipt | getTransferImportReceipt | インポート受領書を取得 |
GET | /_emdash/api/admin/transfer/exports | listTransferExports | サイト エクスポートを一覧 |
POST | /_emdash/api/admin/transfer/exports | createTransferExport | サイト エクスポートを開始 |
GET | /_emdash/api/admin/transfer/exports/{id} | getTransferExport | サイト エクスポートを取得 |
POST | /_emdash/api/admin/transfer/exports/{id}/advance | advanceTransferExport | サイト エクスポートを進める |
GET | /_emdash/api/admin/transfer/exports/{id}/manifest | getTransferExportManifest | エクスポート マニフェストをダウンロード |
GET | /_emdash/api/admin/transfer/exports/{id}/files/{path} | downloadTransferExportFile | エクスポート ファイルを 1 件ダウンロード |
GET | /_emdash/api/admin/transfer/exports/{id}/archive | downloadTransferExportArchive | エクスポート アーカイブをダウンロード |
GET | /_emdash/api/admin/transfer/approvals | listTransferApprovals | 転送承認を一覧 |
POST | /_emdash/api/admin/transfer/approvals/{id}/approve | approveTransferApproval | 転送リクエストを承認 |
POST | /_emdash/api/admin/transfer/approvals/{id}/deny | denyTransferApproval | 転送リクエストを拒否 |
コンテンツ ライフサイクルとバイライン
コンテンツ ライフサイクル リファレンス は、REST、MCP、CLI、管理パネルで共有される状態、リビジョン、権限、競合、フックの動作を定義します。
コンテンツの読み取りでは、利用可能な場合に不透明な _rev トークンが返されます。読み取り以降に行われた変更の上書きを防ぐため、PUT /content/{collection}/{id} に _rev を付けて送信します。古いトークンは競合を起こします。再試行する前に項目を再度読み取ってください。CLI では content update でこのチェックが必須ですが、REST では意図的に無条件書き込みを選ぶクライアント向けにフィールドは任意のままです。
エントリーの読み取りと更新
変更する前にエントリーを読み取ります。
GET /_emdash/api/content/articles/01JARTICLE0000000000000000
Authorization: Bearer $EMDASH_TOKEN
レスポンスにはフィールド、公開状態、リビジョン トークンが含まれます。
{
"success": true,
"data": {
"item": {
"id": "01JARTICLE0000000000000000",
"type": "articles",
"slug": "launch-notes",
"status": "published",
"data": { "title": "Launch notes" }
},
"_rev": "opaque-revision-token"
}
}
変更が必要なフィールドだけを、その読み取りで得たトークンと一緒に送信します。
PUT /_emdash/api/content/articles/01JARTICLE0000000000000000
Authorization: Bearer $EMDASH_TOKEN
Content-Type: application/json
{
"data": { "title": "Updated launch notes" },
"_rev": "opaque-revision-token"
}
公開済みエントリーを変更すると、以前のバージョンがライブのまま下書きが作成されます。compare 操作で両方のバージョンを確認し、下書きを公開するか破棄します。公開取り消しではコンテンツと公開日は保持され、保留中のスケジュールはキャンセルされ、エントリーはライブ サイトから削除されます。
作成および更新ボディはバイライン クレジットを受け付け、コンテンツ レスポンスにはプライマリ バイラインと順序付きクレジットが含まれます。コンテンツ一覧は保存されたバイライン ID でフィルターでき、著者の推論バイラインを任意で含められます。バイライン レコード自体の作成と管理は、公開 REST 契約ではなく MCP バイライン ツール で行います。
ライフサイクル操作はソフト削除と完全削除を区別します。復元はゴミ箱のコンテンツをスケジュールなしの下書きとして返します。完全削除はゴミ箱の項目を削除し、元に戻せません。publish、unpublish、schedule、unschedule、compare、discard-draft、duplicate は別操作なので、クライアントは一度に 1 つの状態遷移を要求できます。
エントリー編集ロック
コレクションでは、編集者がエントリーを開いたときに 7 分間の編集ロックを取得できます。/content/{collection}/{id}/lock の 3 操作で、読み取り、取得または更新、リース解放を行います。
読み取りまたは取得レスポンスは、ロックが有効か、呼び出し元がリースを保持しているか、現在誰が保持しているかを示します。
{
"success": true,
"data": {
"enabled": true,
"heldByCaller": false,
"holder": {
"userId": "01JUSER000000000000000000",
"userName": "Ada",
"acquiredAt": "2026-05-01T09:12:04.117Z",
"expiresAt": "2026-05-01T09:19:04.117Z"
}
}
}
コレクションで編集ロックが無効の場合、enabled は false でリースは取得されません。同じロックを再度取得したりエントリーを保存したりすると、呼び出し元が保持するリースが延長されます。
取得ボディには、1 つの編集セッションを識別する不透明な token と、別の編集者のリースを置き換えるときの takeover: true を含められます。ロック解放時は同じトークンをクエリ パラメーターで渡します。同じアカウントの 2 番目のタブが、誤って 1 番目のタブのリースを解放することはありません。
別ユーザーがリースを保持しているとき、保護されたコンテンツ書き込みは 409 ENTRY_LOCKED を返します。エラー詳細に保持者と有効期限が示されます。ロックを上書きするには、ボディのある書き込みでは JSON ボディに "overrideLock": true を、ボディのない DELETE では ?overrideLock=true を送ります。
参照選択
reference フィールド は、リレーションを通じてエントリーを別コレクションのエントリーにリンクします。値は data の一部ではなく、翻訳グループをキーにするため、エントリーの各翻訳は 1 つの選択を共有します。
作成および更新ボディは references 配下に選択を持ち、フィールド スラッグをキーに、表示順のエントリー ID を最大 1000 件の配列とします。EmDash はエントリーと同じトランザクションで選択を書き込みます。次の更新はエントリーの著者を置き換えます。
PUT /_emdash/api/content/articles/01JARTICLE0000000000000000
Authorization: Bearer $EMDASH_TOKEN
Content-Type: application/json
{
"data": { "title": "Updated launch notes" },
"references": { "author": ["01JAUTHOR00000000000000000"] },
"_rev": "opaque-revision-token"
}
リレーションの子側にバインドされたフィールドは、書き込み対象を指すエントリーを選択し、それ自体の順序は持ちません。リレーション制限は両端で適用されるため、リンク先エントリーに許容より多い親を与える選択は、自身が多すぎるエントリーをリンクする場合と同様に拒否されます。
リビジョンを保持するコレクションでは、公開エントリーで変更した選択は、エントリーの他の保留編集とともに下書きにステージされます。エントリー公開時にライブになり、下書き破棄とともに捨てられます。公開時に選択全体がリレーション制限に対して再チェックされます。
単一エントリー読み取りは、フィールド スラッグをキーにした references を返します。各フィールドはリンク先エントリーの最初のページ(50 件)を保持し、さらに多い場合は nextCursor を返し、各エントリーの ID、スラッグ、コレクション、表示タイトル、解決済みロケール、翻訳グループを報告します。下書きを読める呼び出し元は、下書きにステージされた選択を見られます。コンテンツ一覧操作には references は含まれません。
リレーション定義とリンク走査は管理ルートで、OpenAPI になく公開契約外です。上記のコンテンツ操作で選択を読み書きし、サイトでは getEmDashEntry() と getEmDashReferences() で描画します。
翻訳
公開 REST 契約は、コンテンツ翻訳とタクソノミ定義の翻訳を公開します。コンテンツ作成は translationOf を受け付け、タクソノミ作成も同じフィールドでロケール variant を追加します。コンテンツ用語操作はロケールを意識した割り当てを返します。
GET /taxonomies/{name} は locale 省略時にサイトのデフォルト ロケール定義を返し、デフォルト ロケールに定義がない場合のみ最小ロケール コードにフォールバックします。更新は異なります。locale 省略時は最小ロケール コードの定義を変更します。翻訳タクソノミの更新を意図した定義に届けるには locale を渡してください。そのロケールに定義がなければ、別ロケールにフォールバックせず NOT_FOUND を返します。translations 操作は共有グループ内のすべての定義を返し、translationOf が受け付ける ID を提供します。
label と labelSingular は 1 ロケールの定義に属します。hierarchical と collections はタクソノミに属し、すべてのロケールが同じ値を返し、いずれかを送る更新はすべてのロケールで変更します。別ロケールに既存の名前の定義を作成すると、リクエストが translationOf を送るかどうかに関わらずそのタクソノミに追加されます。新定義はタクソノミの hierarchical と collections を引き継ぎ、異なる値を送る create は VALIDATION_ERROR を返します。
タクソノミ削除は、定義の全ロケール、すべての用語、それらのコンテンツ割り当てを削除します。コンテンツ エントリー自体は削除しません。
用語並べ替え操作は 1 つの兄弟グループを変更します。ids 配列はそのグループの一部のみ含められ、列挙した用語は既存位置を交換し、省略した用語はそのままです。例: [A, B, C] を ids: ["C", "A"] で並べ替えると [C, B, A] になります。並べ替えは親子関係を変えず、1 つの用語順序が翻訳グループ内の全ロケールに適用されます。
メニュー、タクソノミ用語、バイラインの翻訳ルートは公開 REST 契約にありません。サポートされる翻訳一覧は MCP サーバー の menu_translations、taxonomy_term_translations、byline_translations で利用できます。
メディア エンドポイント
メディア操作は、一覧、アップロード、メタデータ更新、画像置換、フォルダー、使用情報、使用インデックス保守をカバーします。メディア ライブラリ ガイド がユーザー向けワークフローと使用カバレッジの意味を説明します。
メディアの一覧と確認
GET /media はカーソルまたは番号付きページのページネーション、MIME タイプとファイル名フィルター、フォルダー、任意の使用サマリーに対応します。すべてのフォルダーを含めるには folderId を省略し、メイン ライブラリのみには folderId=unfiled を渡します。一覧または単一項目読み取りで includeUsage=1 を設定すると使用情報を含めます。他の値は無効です。
usage.count は、現在のインデックス済みソースがメディア項目を参照する、重複のないアクティブなコンテンツ行またはロケールに加え、それを選択する各サイト設定(logo、favicon、seo.defaultOgImage)を数えます。1 エントリー内の重複参照は 1 回とし、ゴミ箱のエントリーは数えません。この数値は下書きを読める呼び出し元にのみ表示されます。他の認可済みメディア読者は count: null を受け取ります。カウントが下書きコンテンツを漏らす可能性があるためです。
GET /media/{id}/usage は参照元コンテンツ エントリーをページで返します。各ページには siteSettings(メディア項目を選択するサイト設定、例: [{ "setting": "favicon" }])も含まれます。サイト設定はリクエストごとに保存設定から読み取られ、使用インデックスに依存しません。
各使用結果にはカバレッジ状態が含まれます。
| 状態 | 意味 |
|---|---|
complete | 登録済みコレクションすべてが現在の使用カバレッジを持つ。 |
never | 登録済みコレクションのいずれも初期使用修復を完了していない。 |
running | 修復が進行中。 |
partial | 登録済みコレクション集合の一部のみが現在のカバレッジを持つ。 |
failed | 登録済みコレクション集合全体でカバレッジが失敗。 |
stale | インデックスが説明するコンテンツより古い。 |
unknown | 保存状態がこの EmDash バージョンで認識されない。 |
インデックス対象フィールド型内でゼロ件数を完全とみなせるのは complete のみです。同時書き込み中の件数は参考値であり、メディア項目をロックしたり削除が安全であることを保証しません。使用インデックスは画像・ファイルフィールド、リピーター画像フィールド、Portable Text の画像・ギャラリー ブロック、EmDash コレクションで保持ブロック バージョンが宣言するメディアをカバーします。サイト ロゴ、favicon、デフォルト SNS 画像設定も報告されます。使用にはカスタム Portable Text ブロック、アプリケーション コード、レンダリング HTML、その他設定、メニュー、ウィジェット、プラグイン データ、外部サイト、プロバイダー専用アセットは含まれません。
直接マルチパート アップロード
マルチパート リクエストの file フィールドとしてファイルを POST し、EmDash 経由で送信します。
curl --request POST \
--header "Authorization: Bearer $EMDASH_TOKEN" \
--form "file=@./cover.jpg;type=image/jpeg" \
https://example.com/_emdash/api/media
curl はマルチパート境界を付加します。Content-Type ヘッダーは手動で設定しないでください。OpenAPI の MediaDirectUploadBody スキーマが任意メタデータ フィールドを列挙し、レスポンス スキーマは新規アップロードと重複排除された既存項目を区別します。
マルチパート ボディには画像の width、height、適用すべき MIME タイプ許可リストを持つ fieldId、低品質プレースホルダー用の縮小 thumbnail も含められます。新規ファイルは 201 Created を返し、すぐに利用可能です。同一バイト列は既存メディア項目を 200 OK と deduplicated: true で返します。
アップロード先フロー
クライアントが S3 互換ストレージに直接アップロードできる場合はアップロード先フローを使用します。確認が成功するまでメディア項目は pending のままで、標準ライブラリに表示されません。
-
アップロード先をリクエスト
POST /_emdash/api/media/upload-url Authorization: Bearer $EMDASH_TOKEN Content-Type: application/json { "filename": "cover.jpg", "contentType": "image/jpeg", "size": 102400 }レスポンスは
uploadUrl、method、headers、mediaId、storageKey、有効期限を提供します。contentHashが同じ MIME タイプとサイズの既存ファイルと一致する場合、レスポンスはexisting: trueを設定します。そのメディア項目を使用し、別コピーをアップロードまたは確認しないでください。 -
バイト列をアップロード
返された method と headers を使用します。ルート相対 URL は EmDash サイトに対して解決し、Bearer トークンを含めます。別 origin の絶対 URL には、返されたアップロード ヘッダーのみを送ります。
-
アップロードを確認
POST /_emdash/api/media/01JMEDIA000000000000000000/confirm Authorization: Bearer $EMDASH_TOKEN Content-Type: application/json { "size": 102400, "width": 1920, "height": 1080 }確認は保存オブジェクトを検証し、項目を
pendingからreadyに変更します。指定したサイズと寸法はアップロード ファイルと一致する必要があります。
ローカル ストレージとネイティブ R2 は同一 origin の EmDash アップロード先を返します。S3 互換ストレージは署名付き外部 URL を返す場合があります。pending 項目は確認成功まで標準メディア一覧から除外されます。
アップロード エラー
次のエラーは別の回復操作が必要です。
| ステータス | コード | 操作 |
|---|---|---|
400 | NO_FILE | マルチパート リクエストに file フィールドを追加するか、欠けているアップロード ボディを送る。 |
400 | INVALID_TYPE | pending メディア項目と一致する許可 MIME タイプを使用する。 |
400 | VALIDATION_ERROR | 欠落または無効なメタデータ(設定サイズ上限超の値を含む)を修正する。 |
400 | FILE_NOT_FOUND | 確認前に返された先へオブジェクトをアップロードする。 |
400 | UPLOAD_SIZE_MISMATCH | 正しいサイズでフローを再開する。宣言、アップロード、確認のサイズは一致する必要がある。 |
400 または 409 | INVALID_STATE | 再試行前にメディア項目を読み取る。pending でなくなっているか、確認中に別リクエストが変更した可能性がある。 |
404 | NOT_FOUND | 既存の pending メディア ID を使用する。 |
413 | PAYLOAD_TOO_LARGE | ファイルサイズを減らすか、別アップロード開始前に maxUploadSize を増やす。 |
メディア フォルダー
フォルダー名はトリムされ 200 文字に制限され、Unicode 正規化と小文字化後に比較されます。Photos、photos、PHOTOS などは競合します。フォルダー削除はメディアをメイン ライブラリに戻します。メディア削除、メディア ID や URL の変更、使用レコードの変更は行いません。
メディア使用の修復
メディア使用の有効化、進捗、ワーク キュー、削除クリーンアップ、修復は /_emdash/api/admin/media-usage/ 配下のオペレーター操作です。セッション ユーザーには schema:manage が必要です。Bearer トークンには admin スコープも必要です。
追跡がオフの場合、有効化前に直接 DB 書き込みを一時停止してください。セットアップ中 EmDash は API 経由のコンテンツとスキーマ書き込みを一時ブロックしますが、DB に直接書き込む別プロセスは止められません。
- 直接 DB 書き込みを停止し、進行中の書き込み完了を待つ。
- 有効化状態を読み取る。
expandedは追跡オフ、activatingは EmDash がコレクション準備中、activeは新しいメディア参照変更が追跡されることを意味する。 { "writersDrained": true }で有効化リクエストを 1 回送る。- 有効化が
activeになるまで、返されたnextRequestInMsごとに進捗リクエストを 1 件ずつ送る。 - 直接 DB 書き込みを再開する。
- 履歴インデックスが
readyでnextRequestInMsがnullになるまで進捗リクエストを続ける。
書き込みリクエストがタイムアウトまたは 409 / 500 を返した場合、再試行前に有効化と進捗状態を読み取ってください。完了バッチは記録されたままです。lastErrorCode が設定されている場合、直接書き込みを止めたまま報告された問題を解決し、確認済み再試行を 1 回送ります。有効化開始後はキャンセルまたはリセットできないため、ステージング副本で手順を試し、最新の DB バックアップを保持してください。
ワーク一覧操作は、コンテンツ、メディア参照、リース トークン、生 DB エラー、正確なバックログ件数を返さずに、失敗または遅延したエントリー インデックス作成を公開します。1 項目の再試行は冪等です。409 WORK_LEASE_ACTIVE はワーカーがまだ項目を処理中であることを意味します。レスポンスに details.leaseExpiresAt が含まれるため、その時刻まで待って項目を再読み取りしてから再試行してください。409 WORK_CHANGED は別リクエストがワーク項目を変更したことを意味します。新しいワークを上書きせず現在状態を読み取ってください。
修復操作は { "scope": "collection", "collection": "articles" } または { "scope": "all" } を受け付けます。全コレクション修復は同期的かつ順次実行されるため、大規模サイトでは時間がかかります。200 レスポンスでも partial、failed、stale を報告する場合があります。修復完了とみなす前に data.status、コレクション別状態、ソース件数を確認してください。
サイト転送
/_emdash/api/admin/transfer/ 配下の転送操作は、サイトをサイト パッケージとしてエクスポートし、空のサイトへインポートします。サイト転送ガイド がエクスポート、アップロード、分析、実行、受領のワークフローを説明します。
セッション ユーザーには管理者のみが持つ transfer:export または transfer:import 権限が必要です。Bearer トークンには各操作で指定される admin または transfer:export、transfer:analyze、transfer:execute スコープが必要です。承認操作はサインイン済みセッションのみ受け付けます。MCP の site_export_start と site_import_start ツールが行ったリクエストを決定します。REST の export と execute 操作は承認を要しません。
インポート実行中、および失敗またはキャンセル後に abandon されるまで、ほとんどの他の書き込み操作は 503 TRANSFER_IMPORT_IN_PROGRESS を返します。ガイドに インポート中も利用可能な操作 が一覧されています。
ページネーション
一覧操作は OpenAPI でページネーション パラメーターを説明します。ほとんどのカーソル ページネーション操作は不透明な cursor と 1〜100(既定 50)の limit を受け付けます。前回レスポンスの nextCursor をそのまま返してください。解析または構築しないでください。一部メディア操作は番号付きページにも対応し、一部の専用一覧は異なる上限を使うため、生成クライアントは各操作のスキーマに従うべきです。
検索トークナイザー
検索有効化操作はコレクションごとにトークナイザーを保存します。有効なコレクションで変更すると、そのコレクションのインデックスが再構築されます。
| 値 | 用途 |
|---|---|
porter unicode61 | Porter ステミングが有効な英語コンテンツの既定。 |
unicode61 | 単語区切りを使うが英語ステミングを使わない言語。 |
trigram | 日本語、中国語、タイ語、クメール語、ラオ語、ビルマ語など空白のないテキスト、または部分文字列一致が必要なコレクション。3 Unicode 文字未満のクエリは一致なし。 |
検索無効化は次回有効化のために保存トークナイザーを保持します。再構築操作はコレクションの保存トークナイザーとフィールド重みを使用します。
コメントとリダイレクト
公開コメント送信はモデレーション キューに入ります。管理コメント操作はすべての状態を一覧し、件数を返し、1 件の状態を更新し、一括モデレーションを行い、コメントを完全削除します。429 レスポンスは送信レート制限に達したことを意味します。
リダイレクト操作はリダイレクト規則と記録 404 ログを別々に管理します。整理(prune)はリクエスト ボディで選択したエントリーを削除し、DELETE /redirects/404s はログ全体を消去します。いずれもリダイレクト規則は削除しません。