Magma APIドキュメント
REST APIで自分のツールからアートスペースを運営し、自動ボットでメンバーに新しい体験を届けられます。アートレベル、コンテスト、ウェルカムメッセージ、毎日のお題などをつくれます。HTTPSとJSONで使えるシンプルなAPIで、https://magma.com/apiから利用できます。
Magma APIでできること
Magmaの2つの開発者向けAPIを紹介します。アートスペースを運営するREST APIと、コミュニティを盛り上げる自動チャットボット用のWebhookです。
Magmaでは、2つの方法でコミュニティに新しい仕組みを加えられます。自分のツールからアートスペースを運営する方法と、自動ボットでメンバーに新しい体験を届ける方法です。アートレベル、コンテスト、ウェルカムメッセージ、毎日のお題などをつくれます。どちらもHTTPSとJSONで使えるシンプルなAPIで、https://magma.com/apiから利用できます。
REST API
個人用のAPIキーを使うと、Magmaアプリで行う操作をコードから実行できます。アートスペースとチャンネルの一覧の取得、作品とフォルダの作成、画像のアップロード(新しい作品として保存)、ファイルの移動、アートスペースのメンバー管理などです。
- 認証:
Authorization: Bearerヘッダーで個人用のAPIキーを送信します。 - キーの取得:アカウント・請求設定 > API > APIキーを生成
- すべてのプランで使えます(無料プランではメールアドレスの認証が必要です)。有料プランは、レート制限の上限が高くなります。
アートスペースのボットとチャットWebhook
自動ボットや外部サービスを、アートスペースのチャットに接続できます。Webhook(ウェブフック)のURLからメッセージ、リアクション、入力中の表示を送れます。チャンネルに投稿があると、Magmaから署名付きのイベントがサーバーに届きます。
- 認証:Webhook URLに含まれるシークレットトークンを使います。Magmaから送るイベントには、HMAC-SHA256で署名します。
- 設定:Artspaceの設定 > ウェブフック > Webhookを作成(「アートスペースを管理」権限が必要です)
目的別の使い分け
| やりたいこと | 使うもの |
|---|---|
| コンテストやイベントごとに、新しいキャンバスやチャンネルを用意する | REST API |
| 資料画像やコンテスト用のテンプレートをMagmaにアップロードする | REST API |
| レベルアップしたメンバーに、まとめて役割を付与する | REST API |
| コンテスト、お題、イベントをチャンネルで告知する | チャットWebhook |
| 新メンバーの歓迎、アートレベルの記録、チャレンジの運営をするボットを動かす | チャットWebhook |
| チャンネルへの投稿に合わせて、応募数、リアクション、投票数を数える | チャットWebhook |
お問い合わせ
ガイドの説明どおりに動かない場合は、Magmaサポート(support@magma.com)までお問い合わせください。
Magma REST APIの使い方とAPIキーの発行
個人用のAPIキーを発行して、Magma REST APIでアートスペース、チャンネル、メンバー、作品、フォルダを取得・管理する方法を説明します。
Magma REST APIを使うと、Magmaアプリで行う操作の多くを自分のツールから実行できます。アートスペースの一覧の取得、チャンネルの作成、作品の作成やアップロード、ファイルの移動、アートスペースのメンバー管理などです。HTTPSとJSONで使えるシンプルなAPIなので、curl、Python、Node.jsなど、どのHTTPクライアントからでも使えます。
対象ユーザー
- アートスペースで新しい体験をつくりたいコミュニティ運営者やテクニカルアーティスト。たとえば、毎週のコンテストごとにキャンバスを用意したり、次のアートレベルに達したメンバーに新しい役割を付与したりできます。
- メンバーやチャンネルをまとめて管理したいアートスペースの管理者。
アートスペースのチャットに投稿する自動ボットをつくる場合や、チャンネルへの投稿をMagmaからサーバーに通知したい場合は、アートスペースのボットとチャットWebhookを参照してください。
用語の対応
APIには、Magmaのコードで使われている古い名前が残っています。アプリでの表示との対応は次のとおりです。
| アプリでの表示 | APIでの名前 | パスの例 |
|---|---|---|
| アートスペース | team | /api/teams/{teamId} |
| チャンネル(アートスペース内) | project | /api/projects/{projectId} |
| 作品/フォルダ | entity | /api/entities/{id} |
作品とフォルダには、それぞれ2つのIDがあります。データベースID(_id、16進数24文字)とshortId(10文字)です。どちらを使えるかは、エンドポイントごとに記載しています。
始める前に
- 登録済みのMagmaアカウントが必要です。ゲストアカウントでは、API設定を開けません。
- 有料プラン以外では、メールアドレスの認証が必要です。認証していないとキーを作成できず、既存のキーも使えません。
- APIは有料プラン限定ではありませんが、有料プランではレート制限の上限が高くなります(下記の「制限」を参照)。
- APIでできることは、アプリでそのアカウントができることと同じです。たとえば、チャンネルを作成するには、そのアートスペースで「新しいチャンネルを作成する」権限が必要です。
ステップ1:APIキーを生成する
- Magmaでユーザーメニューを開き、アカウント・請求設定を選びます。
https://magma.com/my/account/apiから直接開くこともできます。 - APIタブを開きます。パーソナルアクセストークンというセクションです。
- まだキーがない場合は、APIキーを生成をクリックします。
- 表にキーが表示されます。キーをクリックすると、クリップボードにコピーできます。
各キーのスコープはすべての操作が対象で、アカウントでできることは何でも実行できます。パスワードと同じように扱ってください。
あとでキーを管理するには、キーの横にある**⋮**メニューを開きます。
- 更新:キーを新しいものに置き換えます。古いキーはすぐに使えなくなります。
- 削除:キーを削除します。
ステップ2:認証する
すべてのリクエストで、AuthorizationヘッダーにBearerトークンとしてキーを指定します。
Authorization: Bearer YOUR_API_KEYエラーレスポンスもJSONで受け取れるように、Accept: application/jsonも送ることをおすすめします。
ベースURL
すべてのエンドポイントは、次のURLの下にあります。
https://magma.com/apiステップ3:最初のリクエストを送る
自分のプロフィールを取得して、キーが使えるか確認します。
curl https://magma.com/api/profile \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"レスポンスの形式
成功したレスポンスは、共通の形式(エンベロープ)で返ります。リクエストしたデータはdataに入っています。
{
"hash": "a6323ff",
"processingTime": 12,
"statusCode": 200,
"data": {
"_id": "66f1c2a9e4b0a1d2c3f40001",
"userType": "user",
"username": "inkfox",
"name": "Ink Fox",
"email": "inkfox@example.com",
"createdAt": "2025-03-14T09:26:53.000Z"
}
}上のdataは一部を省略した例で、実際のプロフィールにはほかのフィールドもあります。更新や削除のリクエストでは、dataフィールドのないエンベロープだけが返ることがよくあります。hashはサーバーのビルドを表す値、processingTimeはミリ秒単位の処理時間です。どちらも無視してかまいません。
エンドポイント一覧
パスはhttps://magma.comからの相対パスです。「権限」は、アカウントに必要なアートスペースの役割の権限です(名前はArtspaceの設定 > 役割の表示と同じです)。
プロフィール
| メソッド | パス | 内容 | 備考 |
|---|---|---|---|
| GET | /api/profile |
自分のプロフィールを取得 |
アートスペース
| メソッド | パス | 内容 | 備考 |
|---|---|---|---|
| GET | /api/teams |
参加しているアートスペースの一覧を、チャンネルと一緒に取得 | |
| GET | /api/teams/{teamId} |
アートスペース1件とそのチャンネルを取得 | メンバーのみ |
| PUT | /api/teams/{teamId} |
アートスペースの詳細を更新 | 権限:「アートスペースを管理」。ボディのフィールドにはname(1〜32文字)、slug、descriptionなどがあります |
| GET | /api/teams/{teamId}/members |
メンバーと、各メンバーの役割の一覧を取得 | 権限:「メンバーを表示」。?name=で名前/ユーザー名による絞り込みができます(省略可) |
| GET | /api/teams/{teamId}/roles |
アートスペースの役割の一覧を、IDとtype付きで取得 |
メンバーのみ |
| PUT | /api/teams/{teamId}/members/{userId} |
メンバーの役割を設定 | 権限:「役割を管理」。ボディ:{"roles": ["roleId", ...]}(下記を参照) |
| DELETE | /api/teams/{teamId}/members/{userId} |
メンバーをアートスペースから削除 | 権限:「メンバーを管理」。オーナーは削除できません。204を返します |
{userId}は、メンバーのユーザーID(メンバー一覧のuser._id)です。
メンバーの役割を設定すると、現在の役割はすべてこのリストに置き換わります。リストには、typeがeveryoneの役割のID(メンバーがオーナーの場合はownerの役割のID)を必ず含めてください。含まれていない場合、リクエストは400で失敗します。
チャンネル
| メソッド | パス | 内容 | 備考 |
|---|---|---|---|
| POST | /api/projects/{teamId}/create-project |
アートスペースにチャンネルを作成 | 権限:「新しいチャンネルを作成する」。ボディ:name(1〜50文字)、team(パスと同じアートスペースID)、type("project"を指定)、description(省略可) |
| GET | /api/projects/{projectId} |
チャンネルと、その中の作品・フォルダを取得 | ?folder={folderId}でフォルダの中身を取得できます(省略可) |
| PUT | /api/projects/{projectId} |
チャンネルを更新 | 権限:「チャンネルを更新する」。ボディ:name、description、titleのいずれか |
| DELETE | /api/projects/{projectId} |
チャンネルを削除 | 権限:「チャンネルを削除する」 |
作品とフォルダ
| メソッド | パス | 内容 | 備考 |
|---|---|---|---|
| GET | /api/entities |
個人の作品とフォルダの一覧を取得(アートスペース内のものは含みません) | ?folder={folderId}(省略可) |
| POST | /api/entities |
作品/フォルダを作成 | JSONボディ(下記の例を参照) |
| POST | /api/entities/import |
アップロードした画像ファイルから作品を作成 | multipart/form-data(下記の例を参照) |
| PUT | /api/entities |
作品/フォルダを、チャンネルやフォルダに移動 | ボディ:entities(shortIdの配列)と、project/folder |
| GET | /api/entities/{id} |
作品/フォルダ1件を、参加者も含めて取得 | {id}には_idとshortIdのどちらも使えます |
| PUT | /api/entities/{id} |
作品/フォルダの名前を変更 | {id}は_idのみ。ボディ:{"name": "..."}(50文字まで) |
| DELETE | /api/entities/{id} |
作品/フォルダをごみ箱に移動 | {id}は_idのみ。?permanent=trueを付けると完全に削除します(追加の権限が必要です) |
POST /api/entitiesのボディのフィールド:
type(必須):"Drawing"か"Folder"。name(必須):50文字まで。widthとheight:作品のキャンバスサイズ(ピクセル単位)。background:キャンバスの背景色(16進数)。例:"#ffffff"- 保存先:
project(チャンネルID)と、必要に応じてfolder(そのチャンネル内のフォルダID)。省略すると、個人のファイルに保存されます。
その他の例
アートスペースとチャンネルの一覧を取得する
ほかのリクエストで必要なteamIdとprojectIdを調べるときに使います。
curl https://magma.com/api/teams \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"レスポンス(一部省略):
{
"hash": "a6323ff",
"processingTime": 38,
"statusCode": 200,
"data": [
{
"_id": "66f1c2a9e4b0a1d2c3f40010",
"name": "Moonlit Studio",
"slug": "moonlit-studio",
"isPublic": false,
"projects": [
{
"_id": "66f1c2a9e4b0a1d2c3f40020",
"name": "concept-art",
"team": "66f1c2a9e4b0a1d2c3f40010",
"type": "project",
"shareType": 0
}
]
}
]
}チャンネルに作品を作成する
curl -X POST https://magma.com/api/entities \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"type": "Drawing",
"name": "森のムードボード",
"width": 1920,
"height": 1080,
"background": "#ffffff",
"project": "66f1c2a9e4b0a1d2c3f40020"
}'レスポンスのdataが新しい作品で、_idとshortIdも含まれます。
{
"hash": "a6323ff",
"processingTime": 95,
"statusCode": 200,
"data": {
"_id": "66f1c2a9e4b0a1d2c3f40030",
"shortId": "Xk3pQ9vT2m",
"type": "Drawing",
"name": "森のムードボード",
"team": "66f1c2a9e4b0a1d2c3f40010",
"project": "66f1c2a9e4b0a1d2c3f40020"
}
}画像をアップロードして新しい作品にする
POST /api/entities/importは、type(Drawing)、name、fileと、省略可能なproject、folderを含むmultipart/form-dataのボディを受け付けます。Magmaで読み込める画像には、PNG、JPG、PSDなどがあります。
curl -X POST https://magma.com/api/entities/import \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json" \
-F "type=Drawing" \
-F "name=キャラクターシート" \
-F "project=66f1c2a9e4b0a1d2c3f40020" \
-F "file=@character-sheet.psd"アップロードしたファイルは、自分のストレージ容量を使います(チャンネルに読み込んだ場合は、アートスペースのストレージ容量を使います)。
エラー
| ステータス | 意味 | ボディ |
|---|---|---|
| 400 | リクエストの形式が正しくないか、必須フィールドがありません | |
| 403 | APIキーがないか無効、メールアドレスが未認証、またはこの操作の権限がアカウントにありません | {"hash": "...", "statusCode": 403, "error": {"message": "Access denied"}} |
| 404 | アートスペース、チャンネル、作品、フォルダが存在しません(または表示する権限がありません) | "statusCode": 404を含むエンベロープ |
| 422 | リクエストの内容は正しいものの、実行できません。例:存在しないチャンネルへのファイルの移動 | {"message": "Cannot find project", "known": true, "statusCode": 422} |
| 429 | レート制限に達しました | 空 |
| 500 | Magma側でエラーが発生しました |
無効なキーや取り消したキーでは、401ではなく403が返ります。
制限
- レート制限: ユーザーごとに、無料プランは1分あたり60リクエスト、有料プランは1分あたり600リクエストです。制限はキー単位ではなく、ユーザー単位です。超えるとHTTP 429が返るので、少し待ってから間隔を広げながら再試行してください。
- 名前: 作品、フォルダ、チャンネルの名前は50文字まで、アートスペースの名前は32文字までです。
APIキーを安全に管理する
- キーを使うと、参加しているすべてのアートスペースで、アカウントができることをすべて実行できます。キーを他人と共有したり、リポジトリにコミットしたり、ほかの人がダウンロードできるWebページやアプリに含めたりしないでください。
- キーは、環境変数やシークレット管理ツールに保存してください。
- キーが漏えいしたおそれがある場合は、アカウント・請求設定 > APIを開き、更新(新しいキーを取得)または削除(キーを無効化)を選びます。古いキーはすぐに使えなくなります。
よくある質問
APIを無料プランで使う APIは無料プランでも使えます。無料プランではメールアドレスの認証が必要で、1分あたり60リクエストまで使えます。有料プランは1分あたり600リクエストです。
APIキーをアートスペース単位で作成できる? アートスペース単位のAPIキーは作成できません。キーは個人用で、自分のアカウントとして動作します。キーで行った操作は、すべて自分のアカウントの操作として表示されます。
アートスペース/チャンネルのIDを確認する
GET /api/teamsを呼び出すと確認できます。各アートスペースの_idがteamIdで、projectsリストの各項目がチャンネルです。チャンネルにも、それぞれ_idがあります。
403「Access denied」が必ず返る場合は?
ヘッダーが正確にAuthorization: Bearer YOUR_API_KEYになっているか、キーを更新・削除していないか、メールアドレスを認証済みかを確認してください。一部のリクエストだけが失敗する場合は、その操作に必要なアートスペースの権限がアカウントにない可能性があります。
REST APIでチャットに投稿できる? APIキーでは、チャットに投稿できません。アートスペースのチャットに投稿するには、Webhookボットを作成してください。詳しくは、アートスペースのボットとチャットWebhookを参照してください。
アートスペースのボットとチャットWebhook
自動ボットや外部サービスをアートスペースのチャットに接続する方法を説明します。Webhook URLからメッセージを投稿し、チャンネルへの投稿を署名付きのイベントとしてサーバーで受け取れます。
Webhookを使うと、自動ボットをアートスペースのチャットに参加させて、コミュニティに新しい体験を届けられます。ボットは新メンバーを歓迎したり、今週のお題を発表したり、お絵描きコンテストを開いて投票を集計したり、アートレベルを記録してレベルアップを祝ったりできます。各Webhookは、名前とプロフィール画像を持つ独立した送信者としてチャットに表示されます。必要に応じてBOT/APPバッジも付けられます。
対象ユーザー
- ツールをチャンネルに接続したいアートスペースの管理者。
- Magmaのアートスペース向けに、自動ボットや連携機能をつくるコミュニティ運営者や開発者。
チャットではなく作品、チャンネル、メンバーを自動化したい場合は、Magma REST APIを参照してください。
受信と送信の2方向
Webhookは、片方向でも双方向でも使えます。作成時に機能のチェックボックスで選びます。
| 機能 | 方向 | しくみ |
|---|---|---|
| メッセージを投稿することができる | 自分のサービス → Magma(受信) | サービスからWebhook URLにHTTPリクエストを送り、メッセージの投稿、リアクション、入力中の表示、自分のメッセージの編集、最近のメッセージの取得を行います。 |
| チャンネルからメッセージを受信する | Magma → 自分のサービス(送信) | Webhookの対象チャンネルでメッセージの投稿やリアクションがあるたびに、MagmaがコールバックURLにHTTP POSTを送ります。各リクエストには署名が付いているので、Magmaから届いたものか確認できます。 |
双方向のボットでは、両方を使います。コールバックURLでメッセージを受け取り、Webhook URLから返信します。
始める前に
- アートスペースで「アートスペースを管理」権限が必要です。
- アートスペースでWebhookが有効になっている必要があります。Artspaceの設定にウェブフックタブがない場合、そのアートスペースではまだWebhookを使えません。
- メッセージを受信するには、HTTPSでアクセスできるサーバーが必要です。
http://のコールバックURLは使えません。
ステップ1:Webhookを作成する
- 左側のアートスペース一覧で、アートスペースのアイコンを右クリックし、Artspaceの設定を選びます。
- ウェブフックタブを開き、Webhookを作成をクリックします。
- フォームに入力します。
- 表示名:チャットで送信者名として表示されます(100文字まで)。例:「コンテストボット」
- プロフィール画像:画像をアップロードするか、ランダムに選ぶか、削除します。
- バッジ:ボット、アプリ、なしから選びます。チャットで名前の横に表示されます。
- スコープ:Webhookが使えるチャンネルです(下の表を参照)。一つのチャンネルまたは特定のチャンネルの場合は、一覧からチャンネルを選びます。
- 機能:メッセージを投稿することができる、チャンネルからメッセージを受信するのどちらか、または両方にチェックを入れます。
- コールバックURL:チャンネルからメッセージを受信するにチェックを入れると表示されます。MagmaがPOSTを送る、サーバーのHTTPSアドレスです。
- Webhookを作成をクリックします。
- これらの認証情報をすぐに保存というボックスに、トークンと、コールバックURLを設定した場合は署名用のシークレットが表示されます。両方をコピーして、安全な場所に保管してください。表示されるのは一度だけです。
フォームには、設定に合わせたサンプルを確認できる使用ガイドセクションもあります。
Webhook URL
Webhook URLは次のとおりです。
https://magma.com/api/hooks/chat/YOUR_TOKENURL全体は、あとからWebhook一覧で各Webhookの横にあるコピーボタンでコピーできます。
スコープとチャンネル名
APIでは、チャンネルをproject/66f1c2a9e4b0a1d2c3f40020のような名前で指定します。後半の長い部分がチャンネルのIDです。Webhookフォームのチャンネル選択欄には、各チャンネルの下にこの名前が表示されます。Magmaから送るすべてのイベントのchannelフィールドにも含まれます。
| フォームのスコープ | Webhookが使えるチャンネル | 受信リクエストにchannelは必要? |
|---|---|---|
| すべてのチャンネル | アートスペースのすべてのチャンネル | 必要 |
| 一つのチャンネル | 選んだチャンネルのみ | 不要(指定する場合は一致が必要) |
| 特定のチャンネル | 指定したチャンネルのみ(50件まで) | 必要(指定したチャンネルのいずれか) |
ステップ2:メッセージを投稿する(受信)
ヘッダーの設定は不要です。URLに含まれるトークンが認証情報になります。Content-Type: application/jsonでJSONを送ってください。
curl -X POST https://magma.com/api/hooks/chat/YOUR_TOKEN \
-H "Content-Type: application/json" \
-d '{
"channel": "project/66f1c2a9e4b0a1d2c3f40020",
"text": "今週のお題は「海の生き物」です!#contestチャンネルで、日曜日まで作品を受け付けています。"
}'一つのチャンネルスコープのWebhookでは、channelを省略できます。
curl -X POST https://magma.com/api/hooks/chat/YOUR_TOKEN \
-H "Content-Type: application/json" \
-d '{"text": "投票受付中です!好きな作品にスターでリアクションしてください。"}'メッセージのフィールド:
| フィールド | 型 | 説明 |
|---|---|---|
text |
string | メッセージ本文(2,500文字まで)。attachmentsを送らない場合は必須です。 |
content |
string | textの代わりに使えます(Discord形式のペイロード)。 |
channel |
string | 投稿先のチャンネル。例:project/{channelId}。上記の「スコープとチャンネル名」を参照してください。 |
reply_to |
string | 返信先のメッセージID。 |
thread |
boolean | reply_toと一緒にtrueを指定すると、そのメッセージでスレッドを開始します。 |
attachments |
array | 画像を5枚まで添付できます。形式は{"url": "...", "name": "...", "mimeType": "..."}で、必須なのはurlのみです。 |
textとcontentのどちらも使えるので、シンプルなSlack形式({"text": "..."})とDiscord形式({"content": "..."})のペイロードがそのまま使えます。
添付ファイルについて:Magmaは各画像をurlからダウンロードするため、URLは公開されている必要があります。使えるのは画像のみで、1枚あたり10MBまでです。ダウンロードできない添付ファイルはエラーにならずにスキップされ、メッセージは投稿されます。
成功すると、レスポンスのdata.message_idに新しいメッセージのIDが入ります。
{
"hash": "a6323ff",
"processingTime": 41,
"statusCode": 200,
"data": {
"ok": true,
"message_id": "6700a1b2c3d4e5f601234567"
}
}あとでメッセージを編集する場合は、message_idを保存しておいてください。
ボットでできるその他の操作
いずれも同じWebhook URLをベースに使います。チャットを変更する操作(リアクション、入力中の表示、編集)では、メッセージを投稿することができるを有効にしてください。
| メソッド | パス(https://magma.com以降) |
内容 | ボディ/クエリ |
|---|---|---|---|
| POST | /api/hooks/chat/{token} |
メッセージを投稿 | 上記の「メッセージのフィールド」を参照 |
| POST | /api/hooks/chat/{token}/react |
メッセージにリアクションを追加。同じ絵文字をもう一度送ると取り消します。 | {"message_id": "...", "emoji": "👍"} |
| POST | /api/hooks/chat/{token}/typing |
ボットの入力中の表示をオン/オフ | {"active": true, "channel": "project/..."} |
| PATCH | /api/hooks/chat/{token}/messages/{messageId} |
このWebhookが投稿したメッセージを編集 | {"text": "..."} |
| GET | /api/hooks/chat/{token}/messages |
チャンネルの最近のメッセージを取得 | ?channel=project/...(必須)、before、limit |
| GET | /api/hooks/chat/{token}/users/{userId} |
ユーザーの名前、ユーザー名、プロフィール画像を取得 | |
| GET | /api/hooks/chat/{token}/uploads/{fileId} |
投稿されたファイルをダウンロード | 送信イベントに含まれるurlをそのまま使います |
入力中の表示: ボットの処理中は約10秒ごとに{"active": true}を送り、終わったら{"active": false}を送ります。送信をやめると、表示は自動で消えます。
メッセージの編集: コンテストのランキングや投票数など、毎回新しく投稿する代わりに、1つのメッセージを最新の状態に保てます。一度投稿してから、PATCH …/messages/{messageId}で更新します。Webhookが編集できるのは、自分が投稿したメッセージのみです。
履歴の取得: GET …/messagesは、チャンネルの最近のメッセージを新しい順に、1回につき20件まで返します。さらに前のメッセージを取得するには、手元にある最も古いメッセージのtimestamp(ISO 8601形式の日時)をbeforeに指定します。各メッセージにはid、channel、user_id、user(id、name、username、avatar、is_bot)、text、timestamp、editedが含まれ、該当する場合はthreadとreply_toも含まれます。
curl "https://magma.com/api/hooks/chat/YOUR_TOKEN/messages?channel=project/66f1c2a9e4b0a1d2c3f40020&limit=10"ステップ3:メッセージを受け取る(送信)
チャンネルからメッセージを受信するが有効な場合、Webhookの対象チャンネルで新しいメッセージやリアクションがあるたびに、MagmaがJSONボディ付きのPOSTをコールバックURLに送ります。
- ボット自身のメッセージやリアクションは送られません。ほかのボットのメッセージは届きます。
- 削除されたメッセージは送られません。
- 対象はアートスペースのチャンネルのみで、ダイレクトメッセージは含まれません。
イベント:新しいメッセージ
{
"kind": "message",
"text": "@levelbot 今のレベルは?",
"channel": "project/66f1c2a9e4b0a1d2c3f40020",
"user_id": "66f1c2a9e4b0a1d2c3f40001",
"message_id": "6700a1b2c3d4e5f601234568",
"timestamp": "2026-09-23T14:05:12.000Z"
}省略可能なフィールド:
reply_to:返信先のメッセージID。thread:メッセージがスレッド内にある場合に設定されます。例:"thread/6700a1b2c3d4e5f601234599"uploads:メッセージに添付されたファイル。それぞれid、name、mimeType、size、urlを持ちます。urlは1時間有効な署名付きのダウンロードリンクで、そのままGETで取得できます。
送信者の名前とプロフィール画像を取得するには、Webhook URLでGET …/users/{user_id}を呼び出します。
イベント:リアクションの追加/削除
{
"kind": "reaction.add",
"channel": "project/66f1c2a9e4b0a1d2c3f40020",
"message_id": "6700a1b2c3d4e5f601234568",
"user_id": "66f1c2a9e4b0a1d2c3f40001",
"emoji": "👍",
"timestamp": "2026-09-23T14:06:40.000Z"
}リアクションが削除されたときは、kindが"reaction.remove"になります。
配信
- Magmaは、サーバーの応答を最大10秒待ちます。すぐに応答し(例:200を返す)、時間のかかる処理はバックグラウンドで行ってください。
- 配信は1回のみです。失敗した配信は再試行されないため、エンドポイントを常に稼働させておいてください。
署名を検証する
Magmaから送るすべてのリクエストには、X-Webhook-Signatureヘッダーが付きます。値は、リクエストの生のボディからHMAC-SHA256を計算し、小文字の16進数で表したものです。キーには、Webhookの署名用シークレットを使います。JSONをパースする前の生のボディから同じ値を計算して比較し、一致しない場合はリクエストを拒否してください。
Node.js:
const crypto = require('crypto');
function isFromMagma(rawBody, signatureHeader, secret) {
const expected = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const a = Buffer.from(signatureHeader || '', 'hex');
const b = Buffer.from(expected, 'hex');
return a.length === b.length && crypto.timingSafeEqual(a, b);
}Python:
import hmac, hashlib
def is_from_magma(raw_body: bytes, signature_header: str, secret: str) -> bool:
expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature_header or "")コールバックをテストする
Webhook一覧で、Webhookの横にある歯車メニューを開き、コールバックをテストを選びます。Magmaが次の署名付きテストペイロードを送り、サーバーが返したステータスコードを表示します。
{
"text": "Test message from Magma webhook",
"channel": "project/66f1c2a9e4b0a1d2c3f40020",
"user_id": "system",
"message_id": "test",
"timestamp": "2026-09-23T14:00:00.000Z",
"test": true
}テストイベントには"test": trueが含まれ、kindフィールドはありません。ボットの処理では無視してください。
エラー
エラーレスポンスは{"ok": false, "error": "..."}の形式で、再試行の判断に使えるステータスコードが付きます。
| ステータス | 意味 | errorの例 |
再試行 |
|---|---|---|---|
| 400 | リクエストが正しくありません | Message text or attachments required, This webhook requires a "channel" field in the payload (scope=team), Channel "…" is not in this webhook's allow-list, Channel does not belong to this team |
しない(リクエストを修正) |
| 401 | トークンが間違っているか再生成された、またはWebhookが無効か投稿できない設定です | Invalid webhook token |
しない |
| 404 | メッセージ、ユーザー、ファイルが存在しません | Message not found |
しない |
| 429 | リクエストが多すぎます | Rate limit exceeded |
する(少し待ってから) |
| 500 | Magma側でエラーが発生しました | Internal error |
する(間隔を広げながら) |
制限
レート制限は、Webhookごと・操作ごとに適用されます。
| 操作 | 上限 |
|---|---|
| メッセージの投稿 | 1分あたり30回 |
| リアクション | 1分あたり60回 |
| 入力中の表示 | 1分あたり60回 |
| メッセージの編集 | 1分あたり120回 |
| メッセージの取得 | 1分あたり60回 |
| ユーザー情報の取得 | 1分あたり200回 |
| ファイルのダウンロード | 1分あたり30回 |
その他の制限:メッセージは2,500文字まで、添付画像は5枚まで(1枚10MBまで)、特定のチャンネルは50チャンネルまで、1つのアートスペースで作成できるWebhookは1時間あたり20件までです。
セキュリティ
- トークンはパスワードです。 Webhook URLを知っている人は誰でも、ボットとしてチャンネルに投稿したり、対象チャンネルの最近のメッセージを読んだりできます。公開リポジトリ、クライアント側のコード、スクリーンショットに含めないでください。
- トークンを変更するには、歯車メニューのトークンを再生成を使います。古いURLはすぐに使えなくなるので、連携先を新しいURLに更新してください。
- Webhookを一時停止するには、一覧でそのWebhookの有効のチェックを外します。以降、そのURLへのリクエストは401で失敗します。
- コールバックのエンドポイントでは、必ず
X-Webhook-Signatureを検証してください。 第三者が偽のイベントをサーバーに送れないようにするためです。 - 署名用シークレットを変更するには、Webhookを削除して作り直してください。シークレットだけを再生成する機能はありません。
- 不要になったWebhookは、歯車メニューから削除します。そのURLを使っている連携は、すべて動かなくなります。
よくある質問
ボットが投稿できるチャンネル Webhookを所有するアートスペース内の、設定したスコープに含まれるチャンネルです。Webhookからダイレクトメッセージを送ったり、ほかのアートスペースに投稿したりはできません。
チャンネルIDを確認する
Webhookフォームのチャンネル選択欄に、各チャンネルのフルネーム(project/…)が表示されます。Magmaから送るすべてのイベントのchannelにも含まれます。REST API(GET /api/teams)でチャンネルの一覧を取得することもできます。
ボットの表示名や画像はメッセージごとに変更できる? メッセージごとには変更できません。メッセージには、常にWebhookの表示名とプロフィール画像が使われます。変更するには、Artspaceの設定 > ウェブフックでWebhookを編集してください。
トークンを紛失したら Webhook一覧のコピーボタンでWebhook URL全体をコピーするか、トークンを再生成で新しいトークンを取得してください。
署名用シークレットを紛失したら シークレットは一度しか表示されません。Webhookを削除して作り直すと、新しいシークレットを取得できます。
コールバックにイベントが届かない場合は? チャンネルからメッセージを受信するにチェックが入っているか、Webhookが有効になっているか、コールバックURLがHTTPSで公開されているか、スコープ内のチャンネルに投稿されたメッセージかを確認してください。コールバックをテストを使うと、サーバーが返すステータスを確認できます。
REST APIでWebhookを管理する REST APIでもWebhookを管理できます。「アートスペースを管理」権限を持つアカウントの個人用APIキーを使うと、Webhookの一覧の取得、作成、更新、削除、トークンの再生成、テスト用コールバックの送信ができます。下記のリファレンスを参照してください。
リファレンス:REST APIでWebhookを管理する
これらのエンドポイントでは、個人用のAPIキー(Authorization: Bearer YOUR_API_KEY。REST APIの記事を参照)を使います。「アートスペースを管理」権限が必要です。成功したレスポンスは共通のエンベロープで返り、結果はdataに入ります。
| メソッド | パス | 内容 |
|---|---|---|
| GET | /api/teams/{teamId}/webhooks |
アートスペースのWebhookの一覧を取得(各Webhookのtokenを含む) |
| POST | /api/teams/{teamId}/webhooks |
Webhookを作成。レスポンスにはtokenと、コールバックURLを設定した場合はsecretが含まれます |
| PATCH | /api/teams/{teamId}/webhooks/{webhookId} |
Webhookを更新。変更するフィールドのみ送ります(enabledも含む) |
| DELETE | /api/teams/{teamId}/webhooks/{webhookId} |
Webhookを削除 |
| POST | /api/teams/{teamId}/webhooks/{webhookId}/regen |
トークンを再生成。{"token": "..."}を返します |
| POST | /api/teams/{teamId}/webhooks/{webhookId}/test |
コールバックURLにテストイベントを送信。{"ok": true, "status": 200}を返します |
作成・更新時のボディのフィールド:name(作成時は必須、100文字まで)、scope(作成時は必須。すべてのチャンネルは"team"、一つのチャンネルは"channel"、特定のチャンネルは"channels")、channelNames(チャンネル名の配列。"channel"の場合は1つのみ)、canReceive(「メッセージを投稿することができる」)、canSend(「チャンネルからメッセージを受信する」)、callbackUrl(HTTPS。canSendがtrueの場合は必須)、badge("bot"か"app")。
curl -X POST https://magma.com/api/teams/66f1c2a9e4b0a1d2c3f40010/webhooks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"name": "アートボット",
"scope": "channel",
"channelNames": ["project/66f1c2a9e4b0a1d2c3f40020"],
"canReceive": true,
"canSend": true,
"callbackUrl": "https://bots.example.com/magma/callback",
"badge": "bot"
}'

