Loomio API /api/b2
/api/b2 is the user-oriented API for integrations with Loomio. It uses the API key of a user account, and every action is performed as that user.
Group operations use the permissions of the API-key user. If the user can access or administer a group in Loomio, the same access applies through this API.
Your API key is: ``
This user account is not marked as "bot". This means it will be issued votes and expected to participate in decision. You may want to set up a bot account for API requests. Bot accounts are not issued votes or considered when calculating poll results.
Select a group for example commands:
No adminable groups found
Create Discussion
Example
curl -X POST -H 'Content-Type: application/json' -d '{"group_id": 123, "title":"example thread", "recipient_emails":[""], "api_key": ""}' https://www.loomio.com/api/b2/discussions
Params
| Name | Description |
|---|---|
group_id |
Group where thread will exist |
title |
Title of the thread, required |
description |
Context for the thread, optional |
description_format |
Either md or html, optional, default md |
recipient_audience |
group or null. If group, the whole group will be notified about the new thread |
recipient_user_ids |
Array of user IDs to notify or invite to the thread |
recipient_emails |
Array of email addresses of people to invite to the thread |
recipient_message |
Message to include in the email invitation |
Show Discussion
Fetch a discussion using the discussion ID, an integer, or key, a string.
Example
curl https://www.loomio.com/api/b2/discussions/abc123?api_key=
List Discussions
List discussions in a group. The caller must be a member of the group or a global admin.
Example
https://www.loomio.com/api/b2/discussions?api_key=&group_id=123
curl 'https://www.loomio.com/api/b2/discussions?api_key=&group_id=123'
Params
| Name | Description |
|---|---|
group_id |
Integer, required. ID of the group to list discussions from |
status |
String, optional, default open. Values: open, closed, all |
limit |
Integer, optional, default 50. Page size |
offset |
Integer, optional, default 0. Offset for pagination |
Legacy: per and from are accepted as aliases for limit and offset and will continue to work.
Edit Discussion
Edit a discussion as the API-key user. The same permissions apply as in Loomio: the user must be allowed to edit that discussion.
Example
curl -X PATCH -H 'Content-Type: application/json' -d '{"title":"updated thread title", "description":"updated context", "description_format":"md", "api_key": ""}' https://www.loomio.com/api/b2/discussions/123
Params
| Name | Description |
|---|---|
title |
Updated title |
description |
Updated context |
description_format |
Either md or html, optional, default md |
recipient_audience |
group or null. If group, the whole group will be notified about the edit |
recipient_user_ids |
Array of user IDs to notify or invite to the thread |
recipient_emails |
Array of email addresses of people to invite to the thread |
recipient_message |
Message to include in the email invitation |
Soft Delete Discussion
Soft delete a discussion as the API-key user. This discards the discussion and keeps the discussion record in place.
Example
curl -X DELETE -H 'Content-Type: application/json' -d '{"api_key": ""}' https://www.loomio.com/api/b2/discussions/123
Create Comment
Create a comment in a discussion as the API-key user.
Example
curl -X POST -H 'Content-Type: application/json' -d '{"discussion_id": 123, "body":"example comment", "body_format":"md", "api_key": ""}' https://www.loomio.com/api/b2/comments
Params
| Name | Description |
|---|---|
discussion_id |
Integer, required. ID of the discussion to comment on |
body |
Comment body, required unless an attachment is provided |
body_format |
Either md or html, optional, default md |
Edit Comment
Edit a comment as the API-key user. The same permissions apply as in Loomio: the user must be allowed to edit that comment.
Example
curl -X PATCH -H 'Content-Type: application/json' -d '{"body":"updated comment", "body_format":"md", "api_key": ""}' https://www.loomio.com/api/b2/comments/123
Params
| Name | Description |
|---|---|
body |
Updated comment body |
body_format |
Either md or html, optional, default md |
Soft Delete Comment
Soft delete a comment as the API-key user. This discards the comment, hides its body, and keeps the comment record in place.
Example
curl -X DELETE -H 'Content-Type: application/json' -d '{"api_key": ""}' https://www.loomio.com/api/b2/comments/123
Create Poll
Example
curl -X POST -H 'Content-Type: application/json' -d '{"group_id": 123, "title":"example poll", "poll_type": "proposal", "options": ["agree", "disagree"], "closing_at": "2026-07-08T16:00:00Z", "recipient_emails":[""], "api_key": ""}' https://www.loomio.com/api/b2/polls
Params
| Name | Description |
|---|---|
group_id |
Integer, optional, default null. ID of group for poll. If discussion_id is passed, group_id is ignored |
discussion_id |
Integer, optional, default null. ID of discussion thread to add this poll to |
title |
String, required. Title of the poll |
poll_type |
String, required. Values: proposal, poll, count, score, ranked_choice, meeting, dot_vote |
details |
String, optional. The body text of the poll |
details_format |
String, optional, default md. Values: md or html |
options |
Array of strings. If poll_type is proposal, valid values are agree, disagree, abstain, block. If poll_type is meeting, provide ISO 8601 date or datetime strings. For all other poll types, any string is valid |
closing_at |
ISO 8601 string or null, default null. Example: 2026-07-08T16:00:00Z. If null, voting is disabled and poll is considered work in progress |
specified_voters_only |
Boolean, optional, default false. If true, only specified people can vote. If false, everyone in the group will be invited to vote |
hide_results |
String, optional, default off. Values: off, until_vote, until_closed |
shuffle_options |
Boolean, default false. Display options to voters in random order |
anonymous |
Boolean, optional, default false. Hide identities of voters |
recipient_audience |
group or null, optional, default null. If group, the whole group will be notified |
notify_on_closing_soon |
String, optional, default nobody. Values: nobody, author, undecided_voters, voters |
recipient_user_ids |
Array of user IDs to notify or invite |
recipient_emails |
Array of email addresses of people to invite to vote |
recipient_message |
Message to include in the email invitation |
notify_recipients |
Boolean, default false. If false, add people without sending notifications. If true, everyone invited in this request will get a notification email |
Show Poll
Fetch a poll using the poll ID, an integer, or key, a string.
Example
curl https://www.loomio.com/api/b2/polls/abc123?api_key=
List Polls
List polls in a group. The caller must be a member of the group or a global admin. The response includes each poll's current outcome, so you can use status=closed to list decided proposals.
Example
https://www.loomio.com/api/b2/polls?api_key=&group_id=123
curl 'https://www.loomio.com/api/b2/polls?api_key=&group_id=123'
Params
| Name | Description |
|---|---|
group_id |
Integer, required. ID of the group to list polls from |
status |
String, optional, default active. Values: active, closed, all |
limit |
Integer, optional, default 50. Page size |
offset |
Integer, optional, default 0. Offset for pagination |
Legacy: per and from are accepted as aliases for limit and offset and will continue to work.
Edit Poll
Edit a poll as the API-key user. The same permissions apply as in Loomio: the user must be allowed to edit that poll.
Example
curl -X PATCH -H 'Content-Type: application/json' -d '{"title":"updated poll title", "details":"updated details", "details_format":"md", "api_key": ""}' https://www.loomio.com/api/b2/polls/123
Params
| Name | Description |
|---|---|
title |
Updated title |
details |
Updated poll details |
details_format |
Either md or html, optional, default md |
options |
Updated option names. Changing options may affect existing votes depending on poll state |
closing_at |
ISO 8601 string or null |
recipient_audience |
group or null. If group, the whole group will be notified |
recipient_user_ids |
Array of user IDs to notify or invite |
recipient_emails |
Array of email addresses of people to invite to vote |
recipient_message |
Message to include in the email invitation |
Soft Delete Poll
Soft delete a poll as the API-key user. This discards the poll and keeps the poll record in place.
Example
curl -X DELETE -H 'Content-Type: application/json' -d '{"api_key": ""}' https://www.loomio.com/api/b2/polls/123
List Memberships
https://www.loomio.com/api/b2/memberships?api_key=&group_id=123
curl https://www.loomio.com/api/b2/memberships?api_key=&group_id=123
Manage Memberships
Send a list of emails. It will invite all the new email addresses to the group.
curl -X POST -H 'Content-Type: application/json' -d '{"group_id": 123, "emails":["person@example.com"], "api_key": ""}' https://www.loomio.com/api/b2/memberships
If you pass remove_absent=1, any members of the group who were not included in the list will be removed from the group. Be careful, you could remove everyone in your group.
curl -X POST -H 'Content-Type: application/json' -d '{"group_id": 123, "emails":["person@example.com"], "remove_absent": 1, "api_key": ""}' https://www.loomio.com/api/b2/memberships
Params
| Name | Description |
|---|---|
emails |
Array of strings, required. Email addresses of people to invite into the group |
remove_absent |
Boolean. If true, remove anyone from the group whose email is not present in the list |
This returns an object with {added_emails: ["person@added.com"], removed_emails: ["person@removed.com"]}.