デジタルコア · REST APIリファレンス

ひとつのAPI

DWFWコアは /api 配下にJSONのREST APIを公開しています。キュレーターパネル、管理画面、公式サイトが使うのも同じAPIで、「内部」と「外部」の区別はありません。このリファレンスはデプロイ済みの実スキーマから生成され(エンドポイント、フィールド、権限、OpenAPI)、常に実際の姿を記述します。

ベースURL https://dwfw.trabemflex.com/apiOpenAPI 3.0MCPサーバー

01

はじめに

スキーマの各コレクションは、おなじみの5操作(一覧、読み取り、作成、更新、削除)と件数取得を備えたRESTリソースです。APIはPayload CMSがTypeScriptのスキーマから生成するため、モデルとも権限ともずれません。管理画面が許すことが、そのままAPIが許すことです。

規約:UTF-8のJSON、数値id、ISO 8601の日付(UTC)、slugとselectの値はアクセントなしのスペイン語(テキストではなく識別子)、書き込み時は Content-Type: application/json。GraphQLは無効で、すべてRESTです。

  • ベースURL:https://dwfw.trabemflex.com/api(開発環境では http://localhost:3000/api)。
  • バージョン:APIはリポジトリのスキーマのバージョンに従う。破壊的変更はREADMEと本書で告知。
  • 人気指標なし:どのリソースにも、いいね・閲覧数・ランキングはない(原則:アルゴリズム的エポケー)。

02

クイックスタート

3回の呼び出しで仕組みがわかる:ログインなしで公開データ、ログイン、ログイン後の読み取り。

# 1 · ログインなし:公開データ(アーカイブ)、英語で
curl "https://dwfw.trabemflex.com/api/obras?locale=en&depth=1&limit=20"

# 2 · ログイン(payload-token クッキーを設定しJWTを返す)
TOKEN=$(curl -s -H "Content-Type: application/json" \
  -d '{"email":"media@dwfw.test","password":"dwfw-demo-2026"}' \
  "https://dwfw.trabemflex.com/api/usuarios/login" | jq -r .token)

# 3 · ログイン後:権限が許す範囲すべて
curl -H "Authorization: JWT $TOKEN" "https://dwfw.trabemflex.com/api/obras?locale=en&depth=1"

03

認証

セッションはPayloadのものです。POST /api/usuarios/login に email と password を送ると、ユーザー、JWT、その期限(exp)を返し、HttpOnlyの payload-token クッキーを設定します。どちらの経路でも使えます:クッキー(ブラウザ、credentials: include。CSRF保護により自サイトのオリジンからのみ受け付け)または Authorization: JWT <token> ヘッダー(サーバー、スクリプト、アプリ:ブラウザ外では必須)。トークンは2時間で期限切れ。/api/usuarios/refresh-token でパスワードを再入力せずに更新できます。

GET /api/usuarios/me はセッションのユーザーを返します(なければ user: null)。GET /api/access は現在のセッションで各コレクションのどの操作・どのフィールドが許されるかを要約します。ロールに応じたUIを作るための推奨手段です。

# ログイン:ユーザーとJWTを返し、payload-token クッキー(HttpOnly)を設定
curl -H "Content-Type: application/json" \
  -d '{"email":"media@dwfw.test","password":"dwfw-demo-2026"}' \
  "https://dwfw.trabemflex.com/api/usuarios/login"
# → { "user": { … }, "token": "<jwt>", "exp": 1790000000 }   (+ cookie payload-token)

# Authorization: JWT ヘッダーで(スクリプト、サーバー、アプリ)
curl -H "Authorization: JWT <token>" "https://dwfw.trabemflex.com/api/usuarios/me"

# ブラウザではクッキーで十分(同一オリジン。csrf有効時は、正しいOriginヘッダーがないとクッキーは無視される)
fetch('/api/usuarios/me', { credentials: 'include' })

# 期限切れ前にトークンを更新(既定2時間)
curl -H "Authorization: JWT <token>" -X POST "https://dwfw.trabemflex.com/api/usuarios/refresh-token"

# このセッションが各コレクション・各フィールドでできること
curl -H "Authorization: JWT <token>" "https://dwfw.trabemflex.com/api/access"

# ログアウト
curl -H "Authorization: JWT <token>" -X POST "https://dwfw.trabemflex.com/api/usuarios/logout"

04

権限:ロールと権限項目

アクセスはビューではなく権限ベースのRBACが決めます。ユーザーは複数のロールを持ち、各ロールは権限の集合へのショートカット。付与は個別の権限を期限付き(任意)で追加し、自動で失効します。下の表はコード(src/access/capabilities.ts)から生成しています。

さらに二つの制限:scopeEdiciones はパートナーの読み取りをそのエディションに限定し、obra:editar_propia は作者が自分の作者レコードに紐づく作品だけを触れるようにします。権限のないリクエストは403。制限された読み取りは許可分だけを返します(Mediaは obra:leer がなくアーカイブのみ)。

権限direccionfounding curatorcuradorinvestigadorcreadorpartnermediaadvisory
obra:leer●●●●●●·●
obra:crear●●●·●···
obra:editar●●●·····
obra:editar_propia●···●···
obra:borrar●·······
autor:leer●●●●●●●●
autor:gestionar●·······
autor:editar_taller●···●···
nodo:leer●●●●●··●
nodo:gestionar●●●·····
conexion:leer●●●●●··●
conexion:proponer●●●●····
conexion:confirmar●●●·····
significado:leer●●●●●··●
significado:asignar●●●·····
movimiento:avanzar●●●·····
index:leer●●●●···●
edicion:leer●●●●●●●●
edicion:gestionar●·······
capitulo:gestionar●·······
pieza:gestionar●·······
usuario:gestionar●·······

05

クエリ:パラメータ、フィルター、ページネーション

すべての一覧は同じパラメータを受け付けます。一覧レスポンスはメタデータ付きでページ分割されます(totalDocs、totalPages、nextPage…)。

パラメータ用途
localeコンテンツの言語:es(既定)、en、zh、ja。読み書き両方に適用。`all` はすべての翻訳を返す。
fallback-locale翻訳がないときのフォールバック言語(既定 es)。`none` でフォールバックなし。
depth解決するリレーションの階層数(0 = idのみ)。既定 2。小さいほど速い。
limit · pageページネーション:ページサイズ(既定10)とページ番号(1から)。`pagination=false` で全件(注意して使用)。
sortソート項目。先頭のハイフンで降順(sort=-createdAt)。複数はカンマ区切り。
where[campo][op]=valorフィルター。where[and][n][項目][op] / where[or][n][項目][op] で入れ子に。リレーションの項目はドット区切り:autor.nombre、origen.value。
select[campo]=true返すフィールドを絞る。populate[コレクション][項目]=true でリレーション側の解決項目を選ぶ。
draft · joinsこのスキーマでは該当なし(下書きもjoinもない)。/api/access のレスポンスで戸惑わないよう記載。

演算子

演算子意味
equals等しい。select、リレーションid、真偽値、ISO日付に使える。
not_equals等しくない。
in · not_inカンマ区切りリストに含まれる / 含まれない。
contains · likeテキスト:含む(大文字小文字を区別しない)/ 全語を含むパターン。
greater_than · greater_than_equalより大きい / 以上:数値と日付。
less_than · less_than_equalより小さい / 以下。
existsexists=true / false:値があるかどうか。
near · within · intersectspoint型のみ(このスキーマにはない)。
# ページ付き・ソート済み一覧、日本語コンテンツ、リレーションを2階層解決
curl "https://dwfw.trabemflex.com/api/obras?locale=ja&depth=2&limit=10&page=1&sort=-updatedAt"

# 単純なフィルター:アーカイブの作品(工程7)
curl -g "https://dwfw.trabemflex.com/api/obras?where[estadoCuratorial][equals]=movimiento_7"

# 複合フィルター:and / in / exists
curl -g "https://dwfw.trabemflex.com/api/obras?where[and][0][tipo][in]=modelo_3d,avatar&where[and][1][edicion][exists]=true"

# ポリモーフィックなリレーション:value と relationTo の両方で絞る(idはコレクション間で重複する)
curl -g "https://dwfw.trabemflex.com/api/conexiones?where[or][0][origen.value][equals]=1&where[or][0][origen.relationTo][equals]=obras"

# 一部のフィールドのみ(軽いレスポンス)
curl -g "https://dwfw.trabemflex.com/api/obras?select[titulo]=true&select[estadoCuratorial]=true&depth=0"

# ドキュメントを取得せずに件数のみ
curl -g "https://dwfw.trabemflex.com/api/obras/count?where[estadoCuratorial][equals]=movimiento_7"
{
  "docs": [ { "id": 3, "titulo": "Metsä · Micelio v3", "estadoCuratorial": "movimiento_7", "…": "…" } ],
  "totalDocs": 1,
  "limit": 10,
  "totalPages": 1,
  "page": 1,
  "pagingCounter": 1,
  "hasPrevPage": false,
  "hasNextPage": false,
  "prevPage": null,
  "nextPage": null
}

06

言語

コンテンツ(タイトル、説明、メモ、alt…)は言語ごとに保存:スペイン語(既定)、英語、簡体字中国語、日本語。?locale= で要求し、翻訳がなければスペイン語が返るため空にはなりません。?locale=all はすべての翻訳を一度に返します({ es, en, zh, ja })。技術的なidは翻訳しません。データだからです。

別の言語で書くには ?locale=xx 付きのPATCHでローカライズ対象フィールドだけを送ります。リレーションや状態は言語で変わりません。各リソースのリファレンスの「ローカライズ」列がどのフィールドが対象かを示します。

07

書き込み

POSTは作成、PATCHは部分更新(送ったものだけ)、DELETEは削除。リレーションはidで送り、ポリモーフィックなものは { relationTo, value }。ファイルは multipart/form-data でMediaへ。

  • バリデーション:必須項目とselectの値はサーバーで検査。400は項目と理由を返す。
  • 原則のフック:Significadosでは procedencia=humano を強制。estadoCuratorial は movimiento:avanzar でのみ変更。作者は他人の作品を自分のものにできない。
  • 冪等性:PATCHとDELETEは冪等。POSTは違う(呼ぶたびにドキュメントを作る)。
# 作成(obra:crear が必要)。指定したlocaleに保存。リレーションはid
curl -H "Authorization: JWT $TOKEN" -H "Content-Type: application/json" -X POST \
  -d '{"titulo":"Nueva obra","tipo":"modelo_3d","autor":1,"nodoOrigen":"laboratorio_ia"}' \
  "https://dwfw.trabemflex.com/api/obras?locale=es"
# → 201 { "message": "…", "doc": { "id": 4, … } }

# 別のlocaleでの部分更新:ローカライズ対象フィールドのみ。他は変わらない
curl -H "Authorization: JWT $TOKEN" -H "Content-Type: application/json" -X PATCH \
  -d '{"titulo":"New work","descripcionFormal":{"silueta":"…"}}' \
  "https://dwfw.trabemflex.com/api/obras/4?locale=en"

# 書き込み時のポリモーフィックなリレーション:{ relationTo, value }
curl -H "Authorization: JWT $TOKEN" -H "Content-Type: application/json" -X POST \
  -d '{"origen":{"relationTo":"obras","value":4},"destino":{"relationTo":"nodos","value":2},"tipoRelacion":"dialoga_con","procedencia":"humano","estado":"propuesta"}' \
  "https://dwfw.trabemflex.com/api/conexiones"

# 接続を確認(conexion:confirmar が必要。なければ明示的なメッセージ付きの403)
curl -H "Authorization: JWT $TOKEN" -X PATCH -H "Content-Type: application/json" \
  -d '{"estado":"confirmada","procedencia":"humano"}' "https://dwfw.trabemflex.com/api/conexiones/1"

# Mediaにファイルをアップロード:multipart で `file` と `_payload`(他フィールドのJSON)
curl -H "Authorization: JWT $TOKEN" -F "file=@look-03.png" -F '_payload={"alt":"Look 03"}' "https://dwfw.trabemflex.com/api/media"

# 削除(obra:borrar が必要)
curl -H "Authorization: JWT $TOKEN" -X DELETE "https://dwfw.trabemflex.com/api/obras/4"

08

リソースリファレンス

コレクションごとに1ブロック:パス、誰が読み誰が書くか、型とローカライズ付きのフィールド、そしてこのページ描画時に公開APIから取得した実例。

リソースパス読み取り書き込み(権限)
作品/api/obrasアーカイブ(工程7)のみ公開。それ以外は権限によるobra:crear · obra:editar / obra:editar_propia · obra:borrar · movimiento:avanzar (estadoCuratorial)
作者/api/autores公開autor:gestionar
ノード/api/nodos公開nodo:gestionar
接続/api/conexiones公開conexion:proponer · conexion:confirmar
意味/api/significados公開significado:asignar
キュレーション工程/api/movimientos公開movimiento:avanzar
エディション/api/ediciones公開edicion:gestionar
ブランドチャプター/api/capitulos公開capitulo:gestionar
映像作品/api/piezas公開pieza:gestionar
技術アセット/api/mediaアーカイブ(工程7)のみ公開。それ以外は権限によるobra:crear (subir) · propio: editar / borrar si no publicado · obra:editar: todo y publicar
ユーザー/api/usuariosログイン必須(各ユーザーは自分のみ。usuario:gestionar は全員を閲覧可)usuario:gestionar

リソース

作品

/api/obras

第1層。文化資料としての作品:種別、作者、起源ノード、キュレーション状態(7工程)、形式的記述、技術アセット。

読み取り
アーカイブ(工程7)のみ公開。それ以外は権限による
書き込み(権限)
obra:crear · obra:editar / obra:editar_propia · obra:borrar · movimiento:avanzar (estadoCuratorial)
操作
GET /api/obras GET /api/obras/count GET /api/obras/:id POST /api/obras PATCH /api/obras/:id DELETE /api/obras/:id

フィールド

フィールド型必須ローカライズ値 / 参照先
titulo タイトルtextはいはい—
tipo 種別selectはい—modelo_3davatarcoleccion_digitalprenda_fisicaexperiencia_inmersivacodigo_generativo
autor 作者relationshipはい—参照先 autores
nodoOrigen 起源ノード(出所)selectはい—academico_investigadorcomunidad_digital_emergentelaboratorio_iainstitucion_archivo
estadoCuratorial キュレーション状態selectはい—movimiento_1movimiento_2movimiento_3movimiento_4movimiento_5movimiento_6movimiento_7
descripcionFormal.silueta シルエットtextarea—はい—
descripcionFormal.material 素材textarea—はい—
descripcionFormal.sintaxisVisual 視覚的シンタックスtextarea—はい—
activosTecnicos 技術アセット(頂点、テクスチャ、映像)join———
edicion エディションrelationship——参照先 ediciones

実例(GET、depth=0、公開ビュー)

GET https://dwfw.trabemflex.com/api/obras?depth=0&locale=ja&limit=1

{
  "id": 3,
  "titulo": "Metsä · 菌糸体 v3",
  "tipo": "codigo_generativo",
  "autor": 3,
  "nodoOrigen": "laboratorio_ia",
  "estadoCuratorial": "movimiento_7",
  "descripcionFormal": {
    "silueta": null,
    "material": "シミュレートされた菌糸の成長をパターン生成器として。",
    "sintaxisVisual": "形は描かれるのではなく、育てられる。"
  },
  "activosTecnicos": {
    "docs": [],
    "hasNextPage": false
  },
  "edicion": null,
  "updatedAt": "2026-08-22T18:29:49.582Z",
  "createdAt": "2026-08-21T07:12:39.411Z"
}

リソース

作者

/api/autores

第2層。デザイナー、コレクティブ、ラボ、機関。文化的出自は記述であり、順位の基準にはならない。

読み取り
公開
書き込み(権限)
autor:gestionar
操作
GET /api/autores GET /api/autores/count GET /api/autores/:id POST /api/autores PATCH /api/autores/:id DELETE /api/autores/:id

フィールド

フィールド型必須ローカライズ値 / 参照先
nombre 名前textはい——
tipo 種別selectはい—diseñadorinvestigadorartistacolectivolaboratorioinstitucion
origenCultural 文化的出自text—はい—
bio 略歴textarea—はい—
trayectoria 経歴textarea—はい—
nodos ノードrelationship[]——参照先 nodos
taller.capacidad アトリエの規模textarea—はい—
taller.materiales 扱う素材select[]——algodonlanalinosedacueropuntodenimfibras_sinteticasmateriales_biobasadostextil_tecnicosin_material_fisico
taller.tecnologias 技術select[]——patronaje_digitalmodelado_3dsimulacion_textildiseno_generativoimpresion_3dcorte_laserbordado_digitalestampacion_digitaltejido_punto_industrialconfeccion_artesanaltenido_natural
taller.usaFibrasRecicladas 再生繊維を使う?checkbox———
taller.fibrasRecicladasDetalle 再生繊維・詳細textarea—はい—
taller.notasSostenibilidad サステナビリティ・メモtextarea—はい—

実例(GET、depth=0、公開ビュー)

GET https://dwfw.trabemflex.com/api/autores?depth=0&locale=ja&limit=1

{
  "id": 3,
  "nombre": "Lab Metsä",
  "tipo": "laboratorio",
  "origenCultural": "フィンランド・ヘルシンキ",
  "bio": "ジェネラティブ素材のラボ。",
  "trayectoria": "シミュレーションによるバイオテキスタイルに特化した学術スピンオフ。",
  "nodos": [],
  "taller": {
    "capacidad": null,
    "materiales": [],
    "tecnologias": [],
    "usaFibrasRecicladas": null,
    "fibrasRecicladasDetalle": null,
    "notasSostenibilidad": null,
    "procedencia": "humano"
  },
  "updatedAt": "2026-08-22T18:29:48.843Z",
  "createdAt": "2026-08-21T07:12:36.066Z"
}

リソース

ノード

/api/nodos

第3層。カートグラフィの頂点:哲学的潮流、技術的発展、コミュニティ、機関、文化的緊張。

読み取り
公開
書き込み(権限)
nodo:gestionar
操作
GET /api/nodos GET /api/nodos/count GET /api/nodos/:id POST /api/nodos PATCH /api/nodos/:id DELETE /api/nodos/:id

フィールド

フィールド型必須ローカライズ値 / 参照先
nombre 名称textはいはい—
tipo 種別selectはい—corriente_filosoficadesarrollo_tecnologico_previocomunidad_subculturainstituciontension_cultural
descripcion 説明textarea—はい—

実例(GET、depth=0、公開ビュー)

GET https://dwfw.trabemflex.com/api/nodos?depth=0&locale=ja&limit=1

{
  "id": 4,
  "nombre": "生成モデル時代の作者性",
  "tipo": "tension_cultural",
  "descripcion": null,
  "updatedAt": "2026-08-22T18:29:49.224Z",
  "createdAt": "2026-08-21T07:12:36.120Z"
}

リソース

接続

/api/conexiones

第3層。グラフの型付きエッジ。機械由来のものは提案として生まれ、人間だけが確認する。

読み取り
公開
書き込み(権限)
conexion:proponer · conexion:confirmar
操作
GET /api/conexiones GET /api/conexiones/count GET /api/conexiones/:id POST /api/conexiones PATCH /api/conexiones/:id DELETE /api/conexiones/:id

フィールド

フィールド型必須ローカライズ値 / 参照先
origen 起点relationshipはい—参照先 obrasnodos
destino 終点relationshipはい—参照先 obrasnodos
tipoRelacion 関係の種別selectはい—dialoga_conposibilitada_porconversacion_paralela_con
procedencia 出所selectはい—maquinahumano
estado 状態selectはい—propuestaconfirmadadescartada
confirmadaPor 確認者relationship——参照先 usuarios
confirmadaEn 確認日時date———
nota メモtextarea—はい—

実例(GET、depth=0、公開ビュー)

GET https://dwfw.trabemflex.com/api/conexiones?depth=0&locale=ja&limit=1

{
  "id": 6,
  "origen": {
    "relationTo": "obras",
    "value": 2
  },
  "destino": {
    "relationTo": "obras",
    "value": 1
  },
  "tipoRelacion": "conversacion_paralela_con",
  "procedencia": "maquina",
  "estado": "propuesta",
  "confirmadaPor": null,
  "confirmadaEn": null,
  "nota": "Coincidencia en el campo silueta: ambas describen la silueta por lo que le falta de sostén estructural. Aguacero 01: \"Volumen inflado, sin punto de apoyo.\" Kata: \"Hombro desestructurado: la autoridad se retira del cuerpo.\" Vocabulario compartido: \"sin punto de apoyo\" / \"desestructurado\" / \"se retira\" — en las dos la forma se define por la ausencia de estructura que la sostenga, no por lo que añade. Divergen en tipo (coleccion_digital vs modelo_3d), nodo de origen (comunidad_digital_emergente vs academico_investigador) y material (plástico de baja poligonización vs lana simulada), y no tienen conexión entre sí en la cartografía. Solo se usa la descripción formal; no se usa el significado asignado a Kata ni el origen cultural de los autores. Evidencia sintáctica, pendiente de lectura curatorial.",
  "updatedAt": "2026-09-03T07:10:25.005Z",
  "createdAt": "2026-09-03T07:10:25.005Z"
}

リソース

意味

/api/significados

第4層。固定された解釈学的問いと読解。常に人間由来(サーバーが強制)。

読み取り
公開
書き込み(権限)
significado:asignar
操作
GET /api/significados GET /api/significados/count GET /api/significados/:id POST /api/significados PATCH /api/significados/:id DELETE /api/significados/:id

フィールド

フィールド型必須ローカライズ値 / 参照先
obra 作品relationshipはい—参照先 obras
tensionSubyacente この創作は現代社会のどのような緊張に応答しているか?textareaはいはい—
lectura 読解array———
lectura[].tipo 種別select——antropologicaeticapoetica
lectura[].texto テキストtextarea—はい—
textosTeoricos 関連する批評装置textarea—はい—
curador キュレーターrelationship——参照先 usuarios
procedencia 出所 · 読み取り専用text———

実例(GET、depth=0、公開ビュー)

GET https://dwfw.trabemflex.com/api/significados?depth=0&locale=ja&limit=1

{
  "id": 2,
  "obra": 3,
  "tensionSubyacente": "jhksjhdkae",
  "lectura": [],
  "curador": 1,
  "procedencia": "humano",
  "updatedAt": "2026-09-04T12:02:19.341Z",
  "createdAt": "2026-09-04T12:02:19.340Z"
}

リソース

キュレーション工程

/api/movimientos

キュレーションのワークフロー:作品ごとの七つの工程、担当者と出所つき。

読み取り
公開
書き込み(権限)
movimiento:avanzar
操作
GET /api/movimientos GET /api/movimientos/count GET /api/movimientos/:id POST /api/movimientos PATCH /api/movimientos/:id DELETE /api/movimientos/:id

フィールド

フィールド型必須ローカライズ値 / 参照先
obra 作品relationshipはい—参照先 obras
movimiento 工程selectはい—movimiento_1movimiento_2movimiento_3movimiento_4movimiento_5movimiento_6movimiento_7
estado 状態selectはい—pendienteen_cursocompletado
responsable 担当者relationship——参照先 usuarios
procedencia 出所selectはい—maquinahumano
notas メモtextarea—はい—

実例(GET、depth=0、公開ビュー)

GET https://dwfw.trabemflex.com/api/movimientos?depth=0&locale=ja&limit=1

{
  "id": 21,
  "obra": 3,
  "movimiento": "movimiento_7",
  "estado": "en_curso",
  "responsable": 2,
  "procedencia": "humano",
  "updatedAt": "2026-08-21T07:12:40.179Z",
  "createdAt": "2026-08-21T07:12:40.179Z"
}

リソース

エディション

/api/ediciones

Event Stack。各エディション(日程、開催都市、フォーカス国)。

読み取り
公開
書き込み(権限)
edicion:gestionar
操作
GET /api/ediciones GET /api/ediciones/count GET /api/ediciones/:id POST /api/ediciones PATCH /api/ediciones/:id DELETE /api/ediciones/:id

フィールド

フィールド型必須ローカライズ値 / 参照先
nombre 名称textはいはい—
fechaInicio 開始日dateはい——
fechaFin 終了日date———
ciudadAnfitriona 開催都市(Country in Focus)text—はい—
paisEnFoco フォーカス国text—はい—

実例(GET、depth=0、公開ビュー)

GET https://dwfw.trabemflex.com/api/ediciones?depth=0&locale=ja&limit=1

{
  "id": 1,
  "nombre": "DWFW · 第1回",
  "fechaInicio": "2027-03-12T00:00:00.000Z",
  "fechaFin": "2027-03-15T00:00:00.000Z",
  "ciudadAnfitriona": "マドリード",
  "paisEnFoco": "スペイン",
  "updatedAt": "2026-08-22T18:29:48.495Z",
  "createdAt": "2026-08-21T07:12:35.921Z",
  "fase": "antes",
  "cuentaAtras": 14562620
}

リソース

ブランドチャプター

/api/capitulos

Event Stack。エディションのブランドチャプター:セクション、大陸、上映時間、作品。

読み取り
公開
書き込み(権限)
capitulo:gestionar
操作
GET /api/capitulos GET /api/capitulos/count GET /api/capitulos/:id POST /api/capitulos PATCH /api/capitulos/:id DELETE /api/capitulos/:id

フィールド

フィールド型必須ローカライズ値 / 参照先
titulo タイトルtextはいはい—
edicion エディションrelationshipはい—参照先 ediciones
autor 作者relationship——参照先 autores
duracionMin 上映時間(分)number———
seccion セクションselect——country_in_focusicons_of_designfuture_labconversaciones
continente 大陸select——asiaoceaniaeuropaafricaamerica
obras 作品relationship[]——参照先 obras

実例(GET、depth=0、公開ビュー)

GET https://dwfw.trabemflex.com/api/capitulos?depth=0&locale=ja&limit=1

{
  "id": 3,
  "titulo": "対話 · 作者性と機械",
  "edicion": 1,
  "autor": 2,
  "duracionMin": 60,
  "seccion": "conversaciones",
  "continente": "america",
  "obras": [
    2
  ],
  "updatedAt": "2026-08-22T19:21:09.427Z",
  "createdAt": "2026-08-22T19:21:09.303Z"
}

リソース

映像作品

/api/piezas

Event Stack。映像作品(プレミア、対話、メイキング…)とストリーミング参照。

読み取り
公開
書き込み(権限)
pieza:gestionar
操作
GET /api/piezas GET /api/piezas/count GET /api/piezas/:id POST /api/piezas PATCH /api/piezas/:id DELETE /api/piezas/:id

フィールド

フィールド型必須ローカライズ値 / 参照先
titulo タイトルtextはいはい—
tipo 種別select——premiereconversacionmaking_ofhero_lookreemisionclip
capitulo チャプターrelationship——参照先 capitulos
obra 作品relationship——参照先 obras
urlStreaming ストリーミングURLtext———

実例(GET、depth=0、公開ビュー)

GET https://dwfw.trabemflex.com/api/piezas?depth=0&locale=ja&limit=1

{
  "id": 3,
  "titulo": "Colectivo Aguacero との対話",
  "tipo": "conversacion",
  "capitulo": 3,
  "obra": 2,
  "urlStreaming": null,
  "updatedAt": "2026-08-22T19:21:09.874Z",
  "createdAt": "2026-08-22T19:21:09.764Z"
}

リソース

技術アセット

/api/media

技術アセット:画像(≤50 MB)、映像(≤2 GB)、3Dモデル .glb/.gltf/.usdz/.fbx/.obj(≤500 MB)、PDF(≤20 MB)。既定で非公開(ブラインド審査):アップロード者とキュレーションが閲覧。作品が工程7に達すると公開。Cloudflare R2に保存。映像と3Dはバケットへ直接アップロード。情報:説明、クレジット、素材、AI使用、ライセンス、ソフトウェア。

読み取り
アーカイブ(工程7)のみ公開。それ以外は権限による
書き込み(権限)
obra:crear (subir) · propio: editar / borrar si no publicado · obra:editar: todo y publicar
操作
GET /api/media GET /api/media/count GET /api/media/:id POST /api/media PATCH /api/media/:id DELETE /api/media/:id

フィールド

フィールド型必須ローカライズ値 / 参照先
titulo タイトルtext—はい—
alt 代替テキストtext—はい—
categoria カテゴリ · 読み取り専用select——imagenvideomodelo3ddocumento
obra 作品relationship——参照先 obras
publico 公開checkbox———
subidoPor アップロード者 · 読み取り専用relationship——参照先 usuarios
ficha.descripcion 説明textarea—はい—
ficha.creditos クレジット / 作者text———
ficha.materiales 素材 / 技法text—はい—
ficha.usoIA AIの使用select——ningunoasistidogenerativo
ficha.licencia ライセンスselect——todos_los_derechoscc_bycc_by_nccc_by_nc_nd
ficha.software ソフトウェア / パイプラインtext———

実例(GET、depth=0、公開ビュー)

ログインなしで見えるドキュメントはありません。

リソース

ユーザー

/api/usuarios

ロールと追加権限(期限付きの付与)を持つアカウント。任意で作者に紐づく。

読み取り
ログイン必須(各ユーザーは自分のみ。usuario:gestionar は全員を閲覧可)
書き込み(権限)
usuario:gestionar
操作
GET /api/usuarios GET /api/usuarios/count GET /api/usuarios/:id POST /api/usuarios PATCH /api/usuarios/:id DELETE /api/usuarios/:id POST …/login POST …/logout GET …/me POST …/refresh-token

フィールド

フィールド型必須ローカライズ値 / 参照先
nombre 名前textはい——
roles ロールselect[]はい—direccionfounding_curatorcuradorinvestigadorcreadorpartnermediaadvisory
concesiones 追加権限(一時的または恒久的)array———
concesiones[].capacidad 権限selectはい—obra:leerobra:crearobra:editarobra:editar_propiaobra:borrarautor:leerautor:gestionarautor:editar_tallernodo:leernodo:gestionarconexion:leerconexion:proponerconexion:confirmarsignificado:leersignificado:asignarmovimiento:avanzarindex:leeredicion:leeredicion:gestionarcapitulo:gestionarpieza:gestionarusuario:gestionar
concesiones[].caduca 有効期限date———
concesiones[].motivo 理由text———
scopeEdiciones これらのエディションに限定relationship[]——参照先 ediciones
autor 作者relationship——参照先 autores
enableAPIKey checkbox———
apiKey text———
email emailはい——

実例(GET、depth=0、公開ビュー)

ログインなしで見えるドキュメントはありません。

09

エラー

エラーは対応するHTTPコードと errors 配列を持つJSONで返ります。自前のフックは明示的なコード付きのAPIErrorを使い、メッセージはリクエストの言語(Accept-Language)です。

コード発生条件
200 · 201成功。POSTは201と { message, doc }、PATCHとDELETEは200。
400バリデーションまたは不正なリクエスト。`errors[0].data.errors` に項目と理由。
401ログインが必要な操作でセッションなし(またはトークン期限切れ)。
403必要な権限のないセッション。原則の規則も含む(conexion:confirmar なしでの接続確認)。
404ドキュメントが存在しない——またはこのセッションからは見えない(RBACは存在を明かさない)。
413 · 415アップロードが大きすぎる、またはファイル種別が許可されていない(Media)。
500内部エラー。Payloadは "Something went wrong" を返す。自前のフックは明示的なコード付きのAPIErrorを使い、ここに至らないようにしている。
HTTP/1.1 403 Forbidden
{ "errors": [ { "message": "Confirmar una conexión es un acto semántico: requiere la capacidad conexion:confirmar." } ] }

HTTP/1.1 400 Bad Request
{ "errors": [ { "name": "ValidationError", "message": "The following field is invalid: titulo",
                "data": { "errors": [ { "message": "This field is required.", "path": "titulo" } ] } } ] }

10

OpenAPI、型、統合

OpenAPI 3.0仕様は同じconfigから生成されます。Postman、Insomnia、Stoplightに取り込むか、openapi-generatorでクライアントを生成してください。スキーマのTypeScript型は src/payload-types.ts にあります(pnpm generate:types で再生成)。

openapi.json をダウンロードpayload-types.ts · GitHub

// 最小のJavaScriptクライアント(ブラウザまたはNode 18+)
const API = 'https://dwfw.trabemflex.com/api'

const res = await fetch(`${API}/usuarios/login`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ email, password }),
  credentials: 'include', // ブラウザではクッキーで十分。サーバーではヘッダーを使う
})
const { token } = await res.json()

// ヘッダーのJWTで読み取り
const obras = await fetch(`${API}/obras?locale=ja&depth=1&limit=20`, {
  headers: { Authorization: `JWT ${token}` },
}).then((r) => r.json())

// スキーマのTypeScript型(src/payload-types.ts)
import type { Obra, Autor } from './payload-types'

11

ベストプラクティス

  • 必要なものだけ要求する:depth=0 か 1、select[...] でレスポンスは大幅に軽くなる。
  • 公開一覧は必ずページ分割(limit ≤ 100)し、安定した項目でソートする。
  • ポリモーフィックなリレーションは value と relationTo の両方で絞る。
  • ロール対応のUIでは、ロールをハードコードせずセッションごとに /api/access を一度問い合わせる。
  • selectの値と権限は安定した識別子として扱う。クライアント側でラベルで翻訳し、値は決して改名しない。
  • サーバーでは Authorization: JWT ヘッダーを使い refresh-token で更新。ブラウザではクッキーに任せる。
各層に出所を · アルゴリズム的エポケー · 七つの工程