ACMA (App Content Management API)
最終更新: 2026年6月22日
ACMA(App Content Management API)は、製品にサインアップした会員、すなわち ServiceUser が Content と Media を直接操作するための API です。Weegloo User が CMA でコンテンツを操作するのと同じ作業を、会員の身元で実行するものだと考えてください。会員は ACMA で Content と Media を作成し(Create)、読み取り(Read)、更新し(Update)、削除します(Delete)。各操作の許可範囲は ServiceUserRole が定めます。
ACMA の呼び出しには ServiceLogin が発行した Bearer トークンを使います。このトークンは ACMA と ACDA でのみ有効であり、CMA・CDA には使えません(トークン発行フローは Auth API を参照)。会員が従う枠組みである Content Type は、ACMA では作成も更新もしません。Content Type は Weegloo User が CMA で管理し、ACMA には Content Type の作成・更新エンドポイントはありません。
CMA との違い
ACMA は CMA に対応しますが、身元・所有範囲・公開の動作が異なります。
| 項目 | ACMA (ServiceUser) | CMA (Weegloo User) |
|---|---|---|
| 身元 | ServiceLogin にサインアップした ServiceUser。権限は ServiceUserRole で定まります。 | Weegloo User。権限は SpaceRole で定まります。 |
| アクセス範囲 | 読み取り・更新・削除の範囲を ServiceUserRole が定めます(ACDA の会員ごとの読み取りと同じ仕組み)。ロール規則で createdBy を :self に設定すると、その操作は自分が作成した資料に限定され、通常は更新・削除にこのように適用します。読み取りはロールが許可する範囲で他の会員の資料まで含めることができます。 | SpaceRole が許可する範囲内で Space 全体の資料を操作します。 |
| 作成時の公開 | Content・Media を作成すると ただちに公開 されます。別途の公開呼び出しはありません。 | Content は作成後、別途の公開呼び出しを行ってはじめて配信経路に乗ります。 |
| 削除時の公開 | 削除すると 公開取り消しが自動的に 同時に行われます。先に公開取り消しをする必要はありません。 | 公開状態の資料は通常、先に公開取り消しをしてから削除します。 |
| 本人プロフィール | GET /me で取得します(/spaces/{spaceId}/me ではありません)。 | GET /me(現在の Weegloo User)。 |
| Content Type | 作成・更新エンドポイントはありません。枠組みは CMA の管轄です。 | Content Type を作成・更新・公開します。 |
ServiceUser.isAdmin が true の会員は、他の会員の資料を削除すること だけ を追加で行えます。これはロールが許可する操作の上に加わる権限であり、他の会員の資料に対する更新権限や読み取り権限が増えるわけではありません。それすらも、その会員の ServiceUserRole が許可する操作範囲内でのみ可能です。
上記の動作(所有範囲、作成時の自動公開、削除時の自動公開取り消し、
isAdminの範囲)の詳しい説明は ServiceUser ログイン (概念) を参照してください。
自分の情報 (Me)
GET /me は現在のトークンの ServiceUser 本人の情報を返します。CMA のように Space のパスを経由せず、/me を直接呼び出します。
次は ServiceUser のレスポンス構造です。sys に身元と登録の情報が入っており、本文に nickname・avatarUrl のような表示用プロパティが入っています。
{
"sys": {
"id": "3trmXRM3RqbgSnifyg7PSrUm9k2BaZ",
"type": "ServiceUser",
"space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
"provider": "google",
"email": "minji.kim@example.com",
"createdAt": "2026-06-17T09:12:03.114Z",
"updatedAt": "2026-06-17T09:12:03.114Z"
},
"nickname": "Minji",
"avatarUrl": "https://lh3.googleusercontent.com/a/example-avatar",
"enableLogin": true,
"isAdmin": false
}主なキー:
sys.id: ServiceUser の一意の識別子です。会員が作成した Content・Media のcreatedByがこの値を指します。sys.type: リソースの種類で、ServiceUser は常に"ServiceUser"です。sys.space: この会員が属する Space を指す参照です。sys.provider: ログインに使用したプロバイダーです(例:google)。sys.email: ログインプロバイダーが提供したメールアドレスです。nickname: 会員の表示名です(必須)。avatarUrl: プロフィール画像のアドレスです(任意)。roleOverride: この会員にだけ別の ServiceUserRole を適用する場合に、そのロールを指す参照です(任意)。設定しない場合は ServiceLogin の既定のロールに従います。enableLogin: ログインを許可するかどうかです。isAdmin:trueの場合、他の会員の資料を削除できます(上記 CMA との違い を参照)。
更新できるのは nickname と avatarUrl のみです。provider・email・isAdmin のような値は会員が直接変更しません。
Content
Content は Content Type という枠組みに従う個別の資料です。服屋のショッピングモールなら、「商品」Content Type に従う商品一つひとつが Content です。ACMA では会員は、Space と Content Type に紐づくパス(/spaces/{spaceId}/content-types/{contentTypeId}/contents)で自分の Content を操作します。
次はデモ Space の「商品」Content の一つです。
{
"sys": {
"id": "3trmXRM3RqbgSnifyg7OGhwhlqvAvq",
"type": "Content",
"space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
"contentType": { "sys": { "id": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA", "type": "Refer", "targetType": "ContentType" } },
"publish": {
"version": 3,
"at": "2026-06-16T14:35:11.210Z",
"firstAt": "2026-06-15T15:16:20.180Z",
"counter": 3,
"by": { "sys": { "id": "3trmXRM3RqbgSnifyg7PSrUm9k2BaZ", "type": "Refer", "targetType": "ServiceUser" } }
},
"createdBy": { "sys": { "id": "3trmXRM3RqbgSnifyg7PSrUm9k2BaZ", "type": "Refer", "targetType": "ServiceUser" } },
"createdAt": "2026-06-15T15:16:12.151Z",
"updatedAt": "2026-06-16T14:35:11.210Z",
"updatedBy": { "sys": { "id": "3trmXRM3RqbgSnifyg7PSrUm9k2BaZ", "type": "Refer", "targetType": "ServiceUser" } },
"version": 4,
"status": "Published"
},
"fields": {
"price": { "ko-KR": 18000 },
"description": { "ko-KR": "이중 진공 단열로 보온·보냉이 오래갑니다. 500ml 대용량." },
"photo": {},
"productName": { "ko-KR": "스테인리스 텀블러 500ml" }
},
"metadata": { "tags": [] }
}主なキー:
sys.id: Content の一意の識別子です。単一取得・更新・削除パスの{contentId}に入ります。sys.contentType: この Content が従う Content Type を指す参照です。sys.status: 公開状態です。ACMA で作成した Content はただちに公開され、Publishedで返ります。sys.version: リソースのバージョンで、変更のたびに 1 ずつ上がります。sys.publish: 公開履歴です(version・at・firstAt・counter・by)。fields: 各フィールドの値を{ apiName: { locale: value } }形式で保持します。上の例はprice・description・photo・productNameをko-KRロケールで保持しています。値のないフィールド(photo)は空オブジェクトです。metadata.tags: この Content に付いた Tag の一覧です。
一覧取得は標準のクエリパラメーター(limit・skip・next・prev・order・select・include)を受け取り、レスポンスは items 配列と links(ページカーソル)を併せて返します。
Media
Media はアップロードしたファイル資産です(画像・動画・文書など)。会員が Media を作成するには、まず Upload API でファイルをアップロードして Upload を受け取り、その Upload の sys.id を Media 作成リクエストに含めます。Media も ACMA では作成と同時に自動的に公開されます。
次はデモ Space にアップロードしたタンブラー写真の Media です。
{
"sys": {
"id": "3trmXRM3RqbgSnifyg7OGjUMsPV3uU",
"type": "Media",
"space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
"publish": {
"version": 1,
"at": "2026-06-15T15:17:30.825Z",
"firstAt": "2026-06-15T15:17:30.825Z",
"counter": 1,
"by": { "sys": { "id": "3trmXRM3RqbgSnifyg7PSrUm9k2BaZ", "type": "Refer", "targetType": "ServiceUser" } }
},
"createdBy": { "sys": { "id": "3trmXRM3RqbgSnifyg7PSrUm9k2BaZ", "type": "Refer", "targetType": "ServiceUser" } },
"createdAt": "2026-06-15T15:17:30.589Z",
"updatedAt": "2026-06-15T15:17:30.825Z",
"updatedBy": { "sys": { "id": "3trmXRM3RqbgSnifyg7PSrUm9k2BaZ", "type": "Refer", "targetType": "ServiceUser" } },
"version": 2,
"status": "Published"
},
"fields": {
"title": { "ko-KR": "스테인리스 텀블러 500ml 정면 컷" },
"description": { "ko-KR": "흰 배경에서 찍은 텀블러 정면 제품 사진입니다." },
"file": {
"ko-KR": {
"fileName": "tumbler.png",
"contentType": "image/png",
"mimeGroups": ["Image"],
"url": "https://weegloo-media.com/medias/HnQ32YiH/3uU/3trmXRM3RqbgSnifyg7OGjUMsPV3uU/ko-KR/1/tumbler.png",
"detail": { "size": 50847, "image": { "width": 900, "height": 900 } }
}
}
},
"metadata": { "tags": [] }
}主なキー:
sys.id: Media の一意の識別子です。単一取得・削除パスの{mediaId}に入り、Content が写真を参照するときに指す値です。sys.status: 公開状態です。ACMA で作成した Media はただちに公開され、Publishedで返ります。fields.title・fields.description: 資産のタイトル・説明をロケールマップで保持します(任意)。fields.file: ロケールごとのファイル情報です(必須)。処理が終わるとurl(配信用アドレス)、mimeGroups、detail(サイズ・画像解像度など)が埋まります。
Media 作成リクエストの fields.file には、処理前の状態の Upload 参照を入れます。各ファイル項目は fileName・contentType・mimeGroups・state・upload をすべて含み、state は常に "PENDING" とし、upload には Upload API で受け取った Upload の sys.id を入れます。作成直後にプラットフォームがファイルを処理し、処理が終わると上のレスポンスのように url と detail が埋まります。
関連ドキュメント
- Auth API: ACMA の呼び出しに使うトークンを発行してもらう OAuth フロー。
- ACDA: 会員に公開コンテンツを配信する読み取り API。
- ServiceUser ログイン (概念): ServiceLogin・ServiceUserRole の設定。
- Upload API: Media 作成前のファイルアップロード。
