LoomioユーザーAPIドキュメント
/api/user0は、Loomioとの連携に使用するユーザー向けAPIです。ユーザーアカウントのAPIキーを使用し、すべての操作はそのユーザーとして実行されます。
グループに対する操作には、APIキーのユーザーのメンバー登録とグループ権限が適用されます。インスタンス管理者であっても、APIキーでアクセスできるグループやコンテンツの範囲は広がりません。インスタンス全体の管理にはサーバーAPIを使用してください。
操作を実行するLoomioユーザーアカウントのAPIキーを使用してください。連携用のアカウントをアンケートに招待したり、通知を送信したりする必要がない場合は、専用のボットアカウントが役立ちます。
ログインしているユーザーは、APIアクセスページでAPIキーとグループIDを確認できます。
APIキーはAuthorization: Bearerヘッダーで送信してください。URLはプロキシやアクセスログに記録される可能性があるため、クエリ文字列に含まれるAPIキーは拒否されます。
Authorization: Bearer YOUR_API_KEY
例では、YOUR_API_KEY、グループID123、https://www.loomio.com/を使用しています。使用するAPIキー、グループID、Loomioのインストール先URLに置き換えてください。
リクエスト本文の送信
Content-Type: application/jsonを指定してJSONを送信します。cURLの例では、このヘッダーを自動的に設定する--jsonを使用しています。ディスカッション、コメント、アンケートの作成・編集エンドポイントは、フラットなオブジェクトと、{"poll": {...}}のようにリソース名の下にネストされたオブジェクトのどちらも受け付けます。
配列は、"options": ["foo", "bar"]のようにJSON配列として送信します。代わりにフォームエンコーディングを使用する場合は、options[]=foo&options[]=barのようにフィールド名に角括弧を付ける必要があります。options=foo&options=barのように繰り返すと、最後の値だけが保持されます。
各リクエストの後に、HTTPステータスとレスポンス本文を確認してください。検証に失敗すると、errorsオブジェクトとともに422が返されます。アンケートの作成に成功すると、pollsにアンケートが、poll_optionsにその選択肢が返されます。
エンドポイント一覧
| メソッド | エンドポイント | 用途 |
|---|---|---|
POST |
/api/user0/comments |
コメントまたは返信を作成します |
PATCH |
/api/user0/comments/:id |
コメントを編集します |
DELETE |
/api/user0/comments/:id |
コメントを論理削除します |
POST |
/api/user0/discussions |
ディスカッションを作成します |
GET |
/api/user0/discussions/:id |
ディスカッションを取得します |
GET |
/api/user0/discussions |
グループ内のディスカッションを一覧表示します |
PATCH |
/api/user0/discussions/:id |
ディスカッションを編集します |
DELETE |
/api/user0/discussions/:id |
ディスカッションを論理削除します |
GET |
/api/user0/groups |
APIキーのユーザーのグループを一覧表示します |
GET |
/api/user0/groups/:id_or_key_or_handle |
閲覧できるグループを取得します |
GET |
/api/user0/memberships |
グループのメンバー登録を一覧表示します |
POST |
/api/user0/memberships |
メンバーを追加し、必要に応じてリストに含まれないメンバーを削除します |
GET |
/api/user0/reports |
参加状況レポートを生成します |
POST |
/api/user0/polls |
アンケートを作成します |
GET |
/api/user0/polls/:id |
アンケートを取得します |
GET |
/api/user0/polls |
グループ内のアンケートを一覧表示します |
PATCH |
/api/user0/polls/:id |
アンケートを編集します |
DELETE |
/api/user0/polls/:id |
アンケートを論理削除します |
GET |
/api/user0/search |
閲覧できるディスカッション、コメント、アンケート、投票、結論を検索します |
GET |
/api/user0/threads |
閲覧できるディスカッションのスレッドと単独のアンケートのスレッドを一覧表示します |
GET |
/api/user0/threads/:topic_id |
スレッドを取得します |
GET |
/api/user0/threads/:topic_id/items |
スレッド内の項目を順序付きで取得します |
GET |
/api/user0/threads/:topic_id/markdown |
スレッド全体をMarkdownで取得します |
GET |
/api/user0/chatbots |
グループのチャット連携とWebhookを一覧表示します |
POST |
/api/user0/chatbots |
チャット連携またはWebhookを作成します |
PATCH |
/api/user0/chatbots/:id |
チャット連携またはWebhookを更新します |
DELETE |
/api/user0/chatbots/:id |
チャット連携またはWebhookを削除します |
POST |
/api/user0/chatbots/check |
Webhookの接続テストを送信します |
ページ分割
ディスカッション、グループ、メンバー登録、アンケート、スレッド、スレッド内の項目、Webhookでは、limit(既定値50)とoffset(既定値0)を指定できます。グループ、スレッド内の項目、Webhookでは、limitの上限は500です。
次のページを取得するには、返された主要レコードの件数だけoffsetを増やしてください。meta.totalは条件に一致する全件数です。関連レコードはページの件数に含まれません。
参加状況レポートは要求されたデータ全体を返し、検索は最大20件の結果を返します。どちらもページ分割には対応していません。
ディスカッション、アンケート、メンバー登録では、従来の別名であるper(limitに対応)とfrom(offsetに対応)も指定できます。新しい連携にはlimitとoffsetを使用してください。
関連レコード
ユーザーAPIのレスポンスは複合形式を使用します。主要レコードに加えて、トピック、グループ、ユーザー、アンケート、リアクションなどの関連レコードが含まれます。これにより、クライアントは1回のリクエストでローカルのレコードストアにデータを格納できますが、単純な連携に必要な量を超えるデータが含まれる場合があります。
compact=1を指定すると、データ量の多い関連トピック、グループ、親グループ、メンバー登録、リアクション、タグ、翻訳を省略できます。主要レコードと、その内容を解釈するために必要な関連レコードは引き続き含まれます。
curl 'https://www.loomio.com/api/user0/threads/123/items?compact=1' \
-H 'Authorization: Bearer YOUR_API_KEY'
省略する種類を直接指定するには、単数形のレコード種別をスペースで区切ってexclude_typesに指定します。例えば、exclude_types=group reactionは関連するグループとリアクションを省略します。よく使われる値は、topic、group、parent、membership、reaction、tag、translation、user、discussion、poll、poll_option、stance、stance_choice、outcome(結論)、topic_itemです。除外は関連レコードに適用され、エンドポイントで要求した主要リソースには適用されません。
コレクションのレスポンスには、正確な件数が定義されている場合にmeta.totalが含まれます。合計件数は、limitとoffsetを適用する前に計算されます。検索など、意図的に返す件数を制限しているエンドポイントでは、nullを返す代わりにmeta.totalを省略します。
コメント
コメントの作成
APIキーのユーザーとしてディスカッションにコメントを作成します。
POST /api/user0/comments
パラメーター
| 名前 | 説明 |
|---|---|
discussion_id |
整数、必須。コメントを投稿するディスカッションのIDです |
body |
コメントの本文です。添付ファイルがない場合は必須です |
body_format |
md または html、任意。既定値は md です |
例
curl https://www.loomio.com/api/user0/comments \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"discussion_id": 123,
"body": "example comment",
"body_format": "md"
}'
コメントの編集
APIキーのユーザーとしてコメントを編集します。Loomioと同じ権限が適用されるため、そのユーザーには対象のコメントを編集する権限が必要です。
PATCH /api/user0/comments/:id
パラメーター
| 名前 | 説明 |
|---|---|
body |
更新後のコメント本文です |
body_format |
md または html、任意。既定値は md です |
例
curl https://www.loomio.com/api/user0/comments/123 \
-X PATCH \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"body": "updated comment",
"body_format": "md"
}'
コメントの論理削除
APIキーのユーザーとしてコメントを論理削除します。コメントは削除済みになり、本文は非表示になりますが、レコードは保持されます。
DELETE /api/user0/comments/:id
例
curl https://www.loomio.com/api/user0/comments/123 \
-X DELETE \
-H 'Authorization: Bearer YOUR_API_KEY'
ディスカッション
ディスカッションの作成
APIキーのユーザーとしてディスカッションを作成します。
POST /api/user0/discussions
パラメーター
| 名前 | 説明 |
|---|---|
group_id |
スレッドを作成するグループです |
title |
スレッドのタイトルです。必須です |
description |
スレッドの背景説明です。任意です |
description_format |
mdまたはhtmlです。任意で、既定値はmdです |
recipient_audience |
groupまたはnullです。groupの場合は、新しいスレッドについてグループ全体に通知します |
recipient_user_ids |
通知するユーザー、またはスレッドに招待するユーザーのIDの配列です |
recipient_emails |
スレッドに招待する人のメールアドレスの配列です |
recipient_message |
招待メールに含めるメッセージです |
例
curl https://www.loomio.com/api/user0/discussions \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"group_id": 123,
"title": "example thread",
"recipient_emails": [
"person@example.com"
]
}'
ディスカッションの取得
整数のディスカッションID、または文字列のキーを使ってディスカッションを取得します。
GET /api/user0/discussions/:id
例
curl https://www.loomio.com/api/user0/discussions/abc123 \
-H 'Authorization: Bearer YOUR_API_KEY'
ディスカッションの一覧取得
グループ内でAPIキーのユーザーが閲覧できるディスカッションの一覧を取得します。公開グループでは、メンバーでなくても公開ディスカッションの一覧を取得できます。非公開ディスカッションは、Loomioでその内容を閲覧できるユーザーのみが取得できます。
GET /api/user0/discussions
パラメーター
| 名前 | 説明 |
|---|---|
group_id |
整数です。必須です。ディスカッションの一覧を取得するグループのIDです |
status |
文字列です。任意で、既定値はopenです。値はopen、closed、allです |
limit |
整数です。任意で、既定値は50です。1ページあたりの件数です |
offset |
整数です。任意で、既定値は0です。ページ分割のオフセットです |
従来のパラメーター:perとfromは、それぞれlimitとoffsetの別名として受け付けられ、引き続き使用できます。
例
curl 'https://www.loomio.com/api/user0/discussions?group_id=123' \
-H 'Authorization: Bearer YOUR_API_KEY'
ディスカッションの編集
APIキーのユーザーとしてディスカッションを編集します。Loomioと同じ権限が適用されるため、そのディスカッションを編集する権限が必要です。
PATCH /api/user0/discussions/:id
パラメーター
| 名前 | 説明 |
|---|---|
title |
更新後のタイトルです |
description |
更新後の背景説明です |
description_format |
mdまたはhtmlです。任意で、既定値はmdです |
recipient_audience |
groupまたはnullです。groupの場合は、編集についてグループ全体に通知します |
recipient_user_ids |
通知するユーザー、またはスレッドに招待するユーザーのIDの配列です |
recipient_emails |
スレッドに招待する人のメールアドレスの配列です |
recipient_message |
招待メールに含めるメッセージです |
例
curl https://www.loomio.com/api/user0/discussions/123 \
-X PATCH \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"title": "updated thread title",
"description": "updated context",
"description_format": "md"
}'
ディスカッションの論理削除
APIキーのユーザーとしてディスカッションを論理削除します。ディスカッションは削除済みになりますが、レコードは保持されます。
DELETE /api/user0/discussions/:id
例
curl https://www.loomio.com/api/user0/discussions/123 \
-X DELETE \
-H 'Authorization: Bearer YOUR_API_KEY'
グループ
グループの一覧取得
APIキーのユーザーが有効なメンバー登録を持つグループを返します。
GET /api/user0/groups
| 名前 | 説明 |
|---|---|
limit |
整数、任意、既定値50、最大500。ページサイズ |
offset |
整数、任意、既定値0。ページ分割のオフセット |
curl 'https://www.loomio.com/api/user0/groups?limit=50&offset=0' \
-H 'Authorization: Bearer YOUR_API_KEY'
レスポンスには、グループIDの昇順に並んだgroupsの1ページ分が含まれ、meta.totalには条件に一致するグループの総数が含まれます。親グループとサブグループが含まれ、現在サブスクリプションが有効でないグループも含まれます。有効なグループだけを連携の対象にする場合は、enabledフィールドを確認してください。
主なグループフィールドは次のとおりです。
| フィールド | 説明 |
|---|---|
id |
他のユーザーAPIエンドポイントで使用する数値のグループIDです |
key |
LoomioのURLで使用する、変わらない短いキーです |
handle |
人が読みやすいグループのハンドル名です |
name |
グループ名です |
full_name |
親グループの情報を含むグループ名です |
parent_id |
サブグループの場合は数値の親グループID、それ以外はnullです |
enabled |
グループとそのサブスクリプションが有効かどうかを示します |
memberships_count |
有効なメンバー登録と承認待ちのメンバー登録の合計件数です |
accepted_memberships_count |
承認済みのメンバー登録の件数です |
pending_memberships_count |
承認待ちの招待の件数です |
admin_memberships_count |
グループ管理者の人数です |
discussions_count |
グループ直下のディスカッションの件数です |
polls_count |
グループ直下のアンケートの件数です |
subgroups_count |
サブグループの件数です |
レスポンスには、追加のグループ設定、関連する親グループのレコード、APIユーザーのメンバー登録が含まれる場合があります。クライアントでは、使用しないフィールドを無視してください。
グループの取得
APIキーのユーザーが閲覧できるグループを1件返します。
GET /api/user0/groups/:id_or_key_or_handle
識別子には、グループの数値ID、キー、ハンドル名を使用できます。
curl https://www.loomio.com/api/user0/groups/123 \
-H 'Authorization: Bearer YOUR_API_KEY'
curl https://www.loomio.com/api/user0/groups/example-group \
-H 'Authorization: Bearer YOUR_API_KEY'
レスポンスには、一覧取得エンドポイントと同じフィールドを持つグループがgroups配列に含まれます。APIキーのユーザーがアクセスできないグループを要求すると、権限エラーが返されます。
メンバー登録
メンバー登録の一覧取得
APIキーのユーザーが閲覧できるメンバー登録を一覧で取得します。グループのメンバーは、メンバーの名前、ID、肩書き、役割を閲覧できます。メールアドレスは、APIキーのユーザー自身のアカウントの場合、またはAPIキーのユーザーがグループ管理者の場合にのみ含まれます。
GET /api/user0/memberships
パラメーター
| 名前 | 説明 |
|---|---|
group_id |
整数、必須。メンバー登録を一覧で取得するグループのID |
limit |
整数、任意、既定値50。ページサイズ |
offset |
整数、任意、既定値0。ページ分割のオフセット |
従来のパラメーターであるperとfromも、それぞれlimitとoffsetの別名として引き続き使用できます。
レスポンスには、membershipsの1ページ分と関連するusersが含まれます。meta.totalは、ページ分割前の、グループ内で閲覧できるメンバー登録の総数です。
例
curl 'https://www.loomio.com/api/user0/memberships?group_id=123&limit=50&offset=0' \
-H 'Authorization: Bearer YOUR_API_KEY'
メンバー登録の管理
メールアドレスのリストを送信します。新しいメールアドレスすべてにグループへの招待を送ります。メンバー登録の一覧取得とは異なり、この操作にはグループ管理者の権限が必要です。
POST /api/user0/memberships
パラメーター
| 名前 | 説明 |
|---|---|
group_id |
整数、必須。メンバー登録を管理するグループのID |
emails |
文字列の配列、必須。グループに招待する人のメールアドレス |
remove_absent |
真偽値。trueの場合、メールアドレスがリストに含まれていない人をグループから削除します |
例
curl https://www.loomio.com/api/user0/memberships \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"group_id": 123,
"emails": [
"person@example.com"
]
}'
remove_absent=1を指定すると、リストに含まれていないグループのメンバーはすべてグループから削除されます。グループの全メンバーを削除する可能性があるため、注意してください。
curl https://www.loomio.com/api/user0/memberships \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"group_id": 123,
"emails": [
"person@example.com"
],
"remove_absent": 1
}'
この操作は、{added_emails: ["person@added.com"], removed_emails: ["person@removed.com"]}を含むオブジェクトを返します。
参加状況レポート
Loomioの参加状況レポートで使用されるものと同じ、集計済みの参加データを返します。
GET /api/user0/reports
パラメーター
| 名前 | 説明 |
|---|---|
section |
レポートのセクションです。base、users、countriesのいずれかを指定します。個人別の活動にはusersを使用します |
group_scope |
customまたはmyです。ユーザーAPIキーにはインスタンス全体へのアクセス権が付与されないため、旧形式の値allはmyとして扱われます |
group_ids |
group_scope=customの場合に、グループIDをカンマ区切りで指定します。APIユーザーがメンバーとして所属していないグループのIDは無視されます |
start_month |
集計対象の最初の月をYYYY-MM形式で指定します。既定値は12か月前です |
end_month |
集計対象の最後の月をYYYY-MM形式で指定します。既定値は今月です |
interval |
baseセクションの集計間隔です。day、week、month、yearのいずれかを指定します |
member_type |
section=usersとともにdelegateを指定すると、現在の代表者のみを返します |
選択したグループのいずれかで、有効な代表者のメンバー資格を持つ人を代表者として扱います。件数は、選択したすべてのグループを通じて集計されます。すべての活動件数がゼロでも、代表者の行は返されます。集計対象はスレッド、コメント、アンケート、投票、結論、リアクションの件数であり、投票参加率ではありません。ユーザーの行には、記名式の投票について、投票権が付与された件数、投票済みの件数、未投票の件数も含まれます。匿名アンケートは、個人別のすべての投票件数から除外されます。all_votes_castがtrueになるのは、少なくとも1件の投票権が付与され、付与されたすべての投票権について投票済みの場合のみです。
APIには、アプリ内のレポートと同じグループの閲覧権限が適用されます。ユーザーAPIキーでは、そのユーザーがアクセスできないグループのレポートデータを取得できません。
例
curl 'https://www.loomio.com/api/user0/reports?section=users&group_scope=custom&group_ids=123&member_type=delegate&start_month=2026-01&end_month=2026-09' \
-H 'Authorization: Bearer YOUR_API_KEY'
users配列には、活動データの全項目を含む行が格納されます。
{
"users": [
{
"id": 456,
"name": "Ada Lovelace",
"country": "NZ",
"delegate": true,
"threads": 2,
"comments": 8,
"polls": 1,
"votes": 5,
"votes_cast": 5,
"votes_issued": 6,
"votes_missed": 1,
"all_votes_cast": false,
"outcomes": 1,
"reactions": 4
}
]
}
アンケート
アンケートの作成
APIキーのユーザーとしてアンケートを作成します。
POST /api/user0/polls
パラメーター
| 名前 | 説明 |
|---|---|
group_id |
整数、省略可能、既定値は null。アンケートが属するグループのIDです。discussion_id を指定した場合、group_id は無視されます |
discussion_id |
整数、省略可能、既定値は null。このアンケートを追加するディスカッションのスレッドのIDです |
title |
文字列、必須。アンケートのタイトルです |
poll_type |
文字列、必須。値:proposal、poll、count、score、ranked_choice、meeting、dot_vote |
details |
文字列、省略可能。アンケートの本文です |
details_format |
文字列、省略可能、既定値は md。値:md または html |
options |
選択肢の名前を文字列の配列で指定します。proposal では、agree、disagree、abstain、block を使うと、標準のラベル、アイコン、意味、入力を促す文が設定されます。meeting では、ISO 8601形式の日付または日時の文字列を指定します。その他のアンケートの種類では、選択肢の名前を指定します。選択肢の詳細を設定する場合は、代わりに poll_options_attributes を使います |
poll_options_attributes |
options の代わりに使います。名前、意味、入力を促す文、アイコン、表示順を持つ選択肢オブジェクトの配列です。選択肢の詳細を設定してアンケートを作成するを参照してください |
reason_prompt |
文字列、省略可能。投票の理由の入力を促す共通の文です。poll、score、ranked_choice など、選択肢ごとの入力を促す文がない種類のアンケートで使います |
stance_reason_required |
文字列、既定値は optional。値:disabled、optional、required、required_for_disagree_or_block、required_for_block。最後の2つは disagree と block のアイコンに適用されます。匿名アンケートでは投票の理由が無効になります |
closing_at |
ISO 8601形式の文字列または null、既定値は null。例:2026-09-01T12:00:00Z。null の場合、投票は無効になり、アンケートは作成中として扱われます |
specified_voters_only |
真偽値、省略可能、既定値は false。true の場合、指定された人だけが投票できます。false の場合、グループの全員が投票に招待されます |
hide_results |
文字列、省略可能、既定値は off。値:off、until_vote、until_closed |
shuffle_options |
真偽値、既定値は false。投票者に選択肢をランダムな順序で表示します |
anonymous |
真偽値、省略可能、既定値は false。投票者が誰であるかを非表示にします |
recipient_audience |
group または null、省略可能、既定値は null。group の場合、グループ全体に通知されます |
notify_on_closing_soon |
文字列、省略可能、既定値は nobody。値:nobody、author、voters_uncast、voters |
recipient_user_ids |
通知または招待するユーザーのIDの配列です |
recipient_emails |
投票に招待する人のメールアドレスの配列です |
recipient_message |
招待メールに含めるメッセージです |
notify_recipients |
真偽値、既定値は false。false の場合、通知を送信せずに人を追加します。true の場合、このリクエストで招待された全員に通知メールが送信されます |
例
curl https://www.loomio.com/api/user0/polls \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"group_id": 123,
"title": "example poll",
"poll_type": "proposal",
"options": [
"agree",
"disagree"
],
"closing_at": "2026-09-01T12:00:00Z",
"recipient_emails": [
"person@example.com"
]
}'
多くの選択肢を持つアンケートの下書きを作成する
すべての選択肢の名前を options 配列で送信します。closing_at を省略すると、投票が無効になった作成中のアンケートが作成されます。そのスレッドを閲覧できる人に対してアンケートが非表示になるわけではありません。投票を開始する準備ができたら、未来の日時を指定した closing_at を追加します。
すべての選択肢の名前を配列に追加します。
curl https://www.loomio.com/api/user0/polls \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"group_id": 123,
"title": "Meeting venue",
"poll_type": "poll",
"options": [
"Town hall",
"Library",
"Community centre"
]
}'
選択肢の詳細を設定してアンケートを作成する
名前の一覧を指定する場合は options を使い、各選択肢に意味、理由の入力を促す文、アイコンが必要な場合は poll_options_attributes を使います。リクエストごとにどちらか一方の形式を選択します。どちらの形式も、フラットなJSON本文、または poll オブジェクト内で使えます。
poll_options_attributes の各オブジェクトでは、次のフィールドを指定できます。
| フィールド | 説明 |
|---|---|
name |
文字列、新しい選択肢では必須。投票者に表示されるラベルです |
meaning |
文字列、省略可能。この選択肢を選ぶことの意味を説明します |
prompt |
文字列、省略可能。proposal、count、check でこの選択肢を選んだときに表示される、理由の入力を促す文です。その他のアンケートの種類では、アンケートに reason_prompt を設定します |
icon |
文字列、省略可能。proposal、count、check では、agree、disagree、abstain、block を使います |
priority |
整数。0 から始まる選択肢の表示順です。選択肢ごとに異なる値を指定します。ただし、日程調整の選択肢は日付順に並びます |
test_operator |
文字列または null、省略可能。得票率の条件です。gte は以上、lte は以下を意味します。null に設定すると条件が無効になります |
test_percent |
整数、省略可能。得票率の条件に使う割合を 0 から 100 で指定します |
test_against |
文字列、省略可能。score_percent は、投じられたスコアまたはポイントの合計に対する、その選択肢の割合を比較します。voter_percent は、投票資格のあるすべての投票者に対する、その選択肢に投票した人の割合を比較します |
id |
整数。既存の選択肢を編集する場合に指定し、新しい選択肢では省略します |
_destroy |
真偽値、省略可能。既存の選択肢の id とともに true を指定すると、その選択肢を削除します |
独自の選択肢ラベルと入力を促す文を使って提案を作成します。
curl https://www.loomio.com/api/user0/polls \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"group_id": 123,
"title": "Should we adopt this proposal?",
"poll_type": "proposal",
"stance_reason_required": "optional",
"poll_options_attributes": [
{
"name": "Support",
"meaning": "I support adopting this proposal",
"prompt": "What do you support about it?",
"icon": "agree",
"priority": 0
},
{
"name": "Oppose",
"meaning": "I would prefer another approach",
"prompt": "What would you change?",
"icon": "disagree",
"priority": 1
}
]
}'
通常のアンケートでは、同じ選択肢の詳細形式を使い、アンケートに共通の reason_prompt を設定します。
curl https://www.loomio.com/api/user0/polls \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"group_id": 123,
"title": "Choose a venue",
"poll_type": "poll",
"reason_prompt": "Why do you prefer this venue?",
"stance_reason_required": "optional",
"poll_options_attributes": [
{
"name": "Town hall",
"meaning": "Central, accessible venue",
"priority": 0
},
{
"name": "Library",
"meaning": "Smaller room with no hire fee",
"priority": 1
}
]
}'
これらの例では closing_at を省略しているため、未来の締め切り日時を設定するまで投票は無効のままです。
アンケートの取得
整数のアンケートID、または文字列のキーを使用してアンケートを取得します。
GET /api/user0/polls/:id
例
curl https://www.loomio.com/api/user0/polls/abc123 \
-H 'Authorization: Bearer YOUR_API_KEY'
アンケートの一覧取得
グループ内でAPIキーのユーザーが閲覧できるアンケートの一覧を取得します。単独のアンケートとディスカッション内のアンケートが含まれます。公開されているグループでは、メンバーでなくても公開アンケートの一覧を取得できます。非公開アンケートは、Loomioで閲覧権限を持つユーザーだけが取得できます。レスポンスには、閲覧可能な各アンケートの現在の結論が含まれるため、status=closed を使用すると、締め切り済みのアンケートの一覧を取得し、結論が設定されている場合はその内容を確認できます。
ディスカッションと併せて決定の状況を表示するには、同じグループのディスカッションとアンケートを取得し、それぞれの topic_id の値を照合します。アンケートの取得には status=all を使用します。limit と offset を使用して、すべてのページを取得します。1つのディスカッションに複数のアンケートがある場合があるため、どのアンケートに基づいて状況を表示するかを選びます。例えば、最後に作成されたアンケートを使用できます。closed_at が null でない場合は締め切り済みのアンケートを示し、closing_at が null の場合は下書きを示します。アンケートに結論がある場合、その current_outcome_id はレスポンスの outcomes 配列内のレコードを識別します。そのレコードの poll_id をアンケートの id と照合します。
1つのディスカッションについては、GET /api/user0/threads/:topic_id/items を使用してスレッド内の項目を取得することもできます。スレッドのアンケートと結論が、その他の項目と併せて返されます。スレッド全体を含めるには、すべてのページを取得します。
GET /api/user0/polls
パラメーター
| 名前 | 説明 |
|---|---|
group_id |
整数、必須。アンケートの一覧を取得するグループのIDです |
status |
文字列、省略可能、既定値は active。値:active、closed、all |
limit |
整数、省略可能、既定値は 50。1ページあたりの件数です |
offset |
整数、省略可能、既定値は 0。ページ分割のためのオフセットです |
従来のパラメーター:per と from はそれぞれ limit と offset の別名として受け付けられ、引き続き使用できます。
例
curl 'https://www.loomio.com/api/user0/polls?group_id=123' \
-H 'Authorization: Bearer YOUR_API_KEY'
アンケートの編集
APIキーのユーザーとしてアンケートを編集します。Loomioと同じ権限が適用されるため、そのユーザーには対象のアンケートを編集する権限が必要です。
PATCH /api/user0/polls/:id
パラメーター
| 名前 | 説明 |
|---|---|
title |
更新後のタイトルです |
details |
更新後のアンケートの詳細です |
details_format |
md または html、省略可能、既定値は md |
options |
更新後の選択肢の名前です。選択肢を変更すると、アンケートの状態によっては既存の投票に影響する場合があります |
poll_options_attributes |
options の代わりに使います。id を指定して選択肢の詳細オブジェクトを更新し、id のないオブジェクトを追加し、または id と _destroy: true を指定して選択肢を削除します。省略した選択肢は変更されません |
reason_prompt |
選択肢ごとの入力を促す文がない種類のアンケートで使う、理由の入力を促す共通の文の更新内容です |
stance_reason_required |
更新後の理由の入力条件です。アンケートの作成時と同じ値を使います |
closing_at |
ISO 8601形式の文字列または null |
recipient_audience |
group または null。group の場合、グループ全体に通知されます |
recipient_user_ids |
通知または招待するユーザーのIDの配列です |
recipient_emails |
投票に招待する人のメールアドレスの配列です |
recipient_message |
招待メールに含めるメッセージです |
例
curl https://www.loomio.com/api/user0/polls/123 \
-X PATCH \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"title": "updated poll title",
"details": "updated details",
"details_format": "md"
}'
選択肢の詳細を編集する
作成または取得時のレスポンスに含まれる poll_options 配列から、選択肢のIDを取得します。各既存の選択肢の id とともに、変更するフィールドだけを送信します。
curl https://www.loomio.com/api/user0/polls/123 \
-X PATCH \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"poll_options_attributes": [
{
"id": 456,
"meaning": "Updated explanation",
"prompt": "What would improve this proposal?"
},
{
"name": "Abstain",
"meaning": "I leave the decision to others",
"icon": "abstain",
"priority": 2
}
]
}'
選択肢のIDは、編集中のアンケートに属している必要があります。編集にはアンケートを編集する権限が必要で、締め切り済みのアンケートは編集できません。匿名アンケートでは、最初の投票が送信されると、選択肢の設定も変更できなくなります。
アンケートの論理削除
APIキーのユーザーとしてアンケートを論理削除します。アンケートを削除済みとして扱い、アンケートのレコードは保持します。
DELETE /api/user0/polls/:id
例
curl https://www.loomio.com/api/user0/polls/123 \
-X DELETE \
-H 'Authorization: Bearer YOUR_API_KEY'
検索
APIキーのユーザーが閲覧できるディスカッション、コメント、アンケート、投票、結論を検索します。グループのメンバーでなくても、そのグループの公開コンテンツは結果に含まれます。非公開コンテンツには、通常のトピックの閲覧権限が適用されます。
GET /api/user0/search
パラメーター
| 名前 | 説明 |
|---|---|
query |
検索するテキストです。完全一致とあいまい一致に対応しています |
group_id |
結果を閲覧可能な1つのグループに限定します |
org_id |
結果を閲覧可能な親グループと、その閲覧可能なサブグループに限定します。ダイレクトディスカッションには0を使用します |
type |
結果をDiscussion、Comment、Poll、Stance、Outcomeのいずれか1種類に限定します |
types |
結果の種類をカンマ区切りで指定します |
tag |
結果をこのタグが付いたトピックに限定します |
author_id |
結果を1人の作成者によるコンテンツに限定します。queryを指定しない場合は、その作成者の最近の活動のうち閲覧可能なものを返します |
order |
authored_at_descに設定すると、一致するコンテンツを作成日時順に並べます |
curl 'https://www.loomio.com/api/user0/search?query=quarterly+planning&type=Discussion' \
-H 'Authorization: Bearer YOUR_API_KEY'
レスポンスにはsearch_results配列が含まれます。各結果は、searchable_type、searchable_id、highlight、group_id、group_name、discussion_key、poll_key、author_id、author_name、authored_at、tagsなどのフィールドで、一致したレコードと、その閲覧可能な関連情報を示します。その結果に該当しないフィールドはnullになります。
スレッド
スレッドの一覧取得
APIキーのユーザーが閲覧できるディスカッションのスレッドとアンケートのスレッドの一覧を、最新のアクティビティ順に取得します。スレッドのIDは、そのスレッドのtopic_idです。
GET /api/user0/threads
パラメーター
| 名前 | 説明 |
|---|---|
limit |
整数、省略可能、既定値は50。1ページあたりの件数 |
offset |
整数、省略可能、既定値は0。ページ分割のオフセット |
例
curl 'https://www.loomio.com/api/user0/threads?limit=50&offset=0' \
-H 'Authorization: Bearer YOUR_API_KEY'
スレッドの取得
スレッド、順序付けられたイベントストリーム、または閲覧可能な内容全体を含むMarkdown文書を取得します。
GET /api/user0/threads/:topic_id
GET /api/user0/threads/:topic_id/items
GET /api/user0/threads/:topic_id/markdown
itemsエンドポイントでは、次のページ分割パラメーターを指定できます。
| 名前 | 説明 |
|---|---|
limit |
整数、省略可能、既定値は50、最大値は500。1ページあたりの件数です |
offset |
整数、省略可能、既定値は0。ページ分割のオフセットです |
例
GET https://www.loomio.com/api/user0/threads/<topic_id>
GET https://www.loomio.com/api/user0/threads/<topic_id>/items?limit=50&offset=0
GET https://www.loomio.com/api/user0/threads/<topic_id>/markdown
itemsエンドポイントは、閲覧可能なコメント、アンケート、投票、結論を含むイベントストリームを、シーケンス番号の昇順で1ページ分返します。meta.totalは、スレッド内の項目の総数です。ストリーム全体を読むには、後続のページを取得します。markdownエンドポイントは、スレッドの閲覧可能な内容全体を1つのMarkdown文書として返します。投票の理由は、APIキーのユーザーが閲覧できる場合にのみ含まれます。
すべてのスレッドエンドポイントには、Loomioの画面と同じ権限が適用されます。APIキーを使っても、そのユーザーが通常開けないスレッドにはアクセスできません。
Webhook
ユーザーAPIはリクエストに基づいて動作します。連携システムは、データを読み取ったり変更したりするときにLoomioを呼び出します。グループのWebhookでは、Loomioから連携システムへデータを送信できます。選択したグループのイベントが発生すると、Loomioが指定のエンドポイントに送信するため、連携システムが変更を確認するためにREST APIを繰り返し呼び出す必要はありません。
Webhookはグループごとに設定し、設定にはグループ管理者の権限が必要です。Loomioの画面から次の手順で管理できます。
- グループを開きます。
- グループメニューを開き、チャット連携を選択します。
- エンドポイントが受け付けるペイロード形式に合う連携を追加します。汎用のエンドポイントには、Mattermost/Markdown形式を使用してください。
- 名前と送信先URLを入力します。
- Loomioが自動送信するイベントを選択します。
- 連携を保存し、テスト接続でテストメッセージを送信します。
推測できないURLを持つHTTPSの送信先を使用してください。Loomioでは、送信先が公開アドレスに名前解決される必要があり、ローカルまたはプライベートネットワークのアドレスへのリクエストはブロックされます。
エージェントやその他の連携システムでは、代わりに、以下で説明するBearer認証のチャットボットエンドポイントを通じてWebhookを管理できます。このリソースは、Loomioのチャット連携との互換性のためにchatbotsという名前になっていますが、一般的な送信用Webhookも表します。
Webhookの一覧取得
グループに設定されているチャット連携を返します。APIキーのユーザーは、そのグループの管理者である必要があります。レスポンスには送信先URLが含まれるため、一般のグループメンバーに公開してはいけません。
GET /api/user0/chatbots?group_id=123
| 名前 | 説明 |
|---|---|
group_id |
整数、必須。Webhookの一覧を取得するグループのIDです |
limit |
整数、省略可能、既定値は50、最大値は500。1ページあたりの件数です |
offset |
整数、省略可能、既定値は0。ページ分割のオフセットです |
curl 'https://www.loomio.com/api/user0/chatbots?group_id=123&limit=50&offset=0' \
-H 'Authorization: Bearer YOUR_API_KEY'
レスポンスには、連携IDの昇順で並べられたchatbotsの1ページ分が含まれ、meta.totalにはグループ内の連携の総数が入ります。各連携には次のフィールドがあります。
| フィールド | 説明 |
|---|---|
id |
更新と削除に使用する連携IDです |
group_id |
イベントの対象となるグループです |
name |
連携の管理用の名前です |
kind |
送信用Webhookの場合はwebhook、Matrix連携の場合はmatrixです |
webhook_kind |
ペイロード形式です。markdown、slack、discord、microsoft、webexのいずれかです |
server |
送信先URLです |
event_kinds |
自動送信するイベントです |
notification_only |
メッセージに通知の見出しだけを含めるかどうかを示します |
Webhookの作成
POST /api/user0/chatbots
curl https://www.loomio.com/api/user0/chatbots \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"group_id": 123,
"name": "Planning system",
"kind": "webhook",
"webhook_kind": "markdown",
"server": "https://hooks.example.org/loomio/unguessable-token",
"event_kinds": [
"new_discussion",
"new_comment",
"poll_created",
"outcome_created"
],
"notification_only": false
}'
APIキーのユーザーは、group_idで指定したグループの管理者である必要があります。送信先は、保存される前に公開URLであることが検証されます。
Webhookの更新
PATCH /api/user0/chatbots/:id
変更するフィールドを送信してください。group_idを変更してWebhookを別のグループに移すことはできません。
curl https://www.loomio.com/api/user0/chatbots/456 \
-X PATCH \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"name": "Planning events",
"event_kinds": [
"new_discussion",
"outcome_created"
]
}'
Webhook送信先のテスト
設定を保存する前または保存した後に、Markdownに対応したテストメッセージを送信先へ送信します。
POST /api/user0/chatbots/check
curl https://www.loomio.com/api/user0/chatbots/check \
-H 'Authorization: Bearer YOUR_API_KEY' \
--json '{
"group_id": 123,
"server": "https://hooks.example.org/loomio/unguessable-token"
}'
Webhookの削除
DELETE /api/user0/chatbots/:id
curl https://www.loomio.com/api/user0/chatbots/456 \
-X DELETE \
-H 'Authorization: Bearer YOUR_API_KEY'
設定を削除すると、以後の配信が停止します。Loomioのグループ内のコンテンツは削除されません。
イベントの種類
Webhookでは、次の種類のイベントを受信するよう設定できます。
| イベント | 送信されるタイミング |
|---|---|
new_discussion |
ディスカッションが開始されたとき |
discussion_edited |
ディスカッションが編集されたとき |
new_comment |
コメントが作成されたとき |
poll_created |
アンケートが開始されたとき |
poll_edited |
アンケートが編集されたとき |
poll_closing_soon |
アンケートの締め切り時刻が近づいたとき |
poll_expired |
アンケートの締め切り時刻になったとき |
poll_closed_by_user |
アンケートが手動で締め切られたとき |
poll_reopened |
アンケートが再開されたとき |
outcome_created |
結論が公開されたとき |
outcome_updated |
結論が更新されたとき |
outcome_review_due |
結論の見直し期限になったとき |
stance_created |
投票が行われたとき |
stance_updated |
投票が変更されたとき |
Webhookは1つのグループに属し、そのグループで受信対象に設定したイベントを受信します。対応する自動送信イベントが選択されていない場合でも、共有や一部の通知の送信時に、連携先を明示的に選択できます。
HTTP配信
Loomioは、次のヘッダーを付けて、設定されたURLに非同期のHTTP POSTを送信します。
Content-Type: application/json; charset=utf-8
リクエストのタイムアウトは5秒です。204 No Contentを含む2xxレスポンスは成功として扱われます。Webhookの受信側は速やかに応答し、時間のかかる処理は非同期で実行してください。また、配信の重複や順序の入れ替わりに対応できるようにしてください。
現在、LoomioはWebhookの署名、共有シークレットのヘッダー、イベントID、配信IDを付加しません。送信先URL全体を認証情報として扱い、公開しないでください。受信側のサービスが対応している場合は、推測できないトークンをURLに含めてください。安定した機械可読のイベントスキーマや署名付き配信が必要な場合は、Webhookを変更通知として使い、認証付きのユーザーAPIから現在のレコードを取得してください。
ペイロードの形式
Webhookのペイロードは、チャットサービスでの表示を目的としたメッセージです。Loomioのレコードを完全にシリアライズしたものではありません。メッセージ内のリンクは、対象のLoomioコンテンツを示します。連携先で構造化された現在の状態が必要な場合は、ユーザーAPIから追加で取得できます。
| 連携形式 | 主なJSONフィールド |
|---|---|
| Mattermost/Markdown | text, icon_url, username |
| Slack | text |
| Discord | content。約1,900文字に制限されます |
| Microsoft Teams | @type, @context, themeColor, text, sections |
| Webex | markdown |
例えば、汎用のMarkdown形式では、次のような構造の本文を送信します。
{
"text": "Ada started a discussion: [Quarterly planning](https://example.loomio.org/d/example)",
"icon_url": "https://example.loomio.org/path/to/group-logo.png",
"username": "Loomio"
}
実際のメッセージの文面は、イベント、グループの言語設定、通知のみの設定、Loomioのバージョンによって異なります。受信側では、文面を解析するのではなく、選択した形式のドキュメントに記載された最上位のフィールドを使用してください。