Дакументацыя API карыстальніка Loomio

/api/user0 — гэта API для інтэграцый з Loomio, арыентаваны на карыстальнікаў. Ён выкарыстоўвае ключ API ўліковага запісу, і ўсе дзеянні выконваюцца ад імя гэтага ўліковага запісу.

Аперацыі з групамі выкарыстоўваюць удзел у групах і правы ўліковага запісу, якому належыць ключ API. Статус адміністратара асобніка не пашырае доступ ключа API да груп або змесціва; для адміністравання асобніка выкарыстоўвайце API сервера.

Выкарыстоўвайце ключ API ўліковага запісу Loomio, ад імя якога будуць выконвацца дзеянні. Асобны ўліковы запіс бота карысны, калі інтэграцыя не павінна атрымліваць запрашэнні да апытанняў або апавяшчэнні.

Карыстальнікі, якія ўвайшлі ў сістэму, могуць знайсці свой ключ API і ідэнтыфікатары груп на старонцы доступу да API.

Перадавайце ключ API ў загалоўку Authorization: Bearer. Ключы API ў радках запыту адхіляюцца, бо URL-адрасы могуць запісвацца проксі-серверамі і ў журналах доступу.

Authorization: Bearer YOUR_API_KEY

У прыкладах выкарыстоўваюцца YOUR_API_KEY, ID групы 123 і https://www.loomio.com/. Замяніце іх сваім ключом API, ID групы і URL-адрасам вашай усталёўкі Loomio.

Адпраўка целаў запытаў

Адпраўляйце JSON з Content-Type: application/json. У прыкладах cURL выкарыстоўваецца --json, які аўтаматычна задае гэты загаловак. Канцавыя пункты стварэння і рэдагавання абмеркаванняў, каментарыяў і апытанняў прымаюць як плоскі аб’ект, так і аб’ект, укладзены пад назвай рэсурсу, напрыклад {"poll": {...}}.

Адпраўляйце масівы як масівы JSON, напрыклад "options": ["foo", "bar"]. Калі замест гэтага вы выкарыстоўваеце кадаванне формы, назвы палёў масіваў павінны мець квадратныя дужкі, напрыклад options[]=foo&options[]=bar; пры паўтарэнні options=foo&options=bar захоўваецца толькі апошняе значэнне.

Правярайце статус HTTP і цела адказу пасля кожнага запыту. Пры памылцы праверкі даных вяртаецца 422 з аб’ектам errors; пры паспяховым стварэнні апытання яно вяртаецца ў 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 Атрымаць спіс інтэграцый з чатам і вэбхукаў групы
POST /api/user0/chatbots Стварыць інтэграцыю з чатам або вэбхук
PATCH /api/user0/chatbots/:id Абнавіць інтэграцыю з чатам або вэбхук
DELETE /api/user0/chatbots/:id Выдаліць інтэграцыю з чатам або вэбхук
POST /api/user0/chatbots/check Адправіць тэст падключэння вэбхука

Падзел на старонкі

Абмеркаванні, групы, запісы ўдзелу ў групах, апытанні, тэмы, элементы тэм і вэбхукі прымаюць limit (па змаўчанні 50) і offset (па змаўчанні 0). Для груп, элементаў тэм і вэбхукаў максімальнае значэнне limit складае 500.

Каб атрымаць наступную старонку, павялічце offset на колькасць вернутых асноўных запісаў. meta.total — гэта поўная колькасць запісаў, якія адпавядаюць запыту; звязаныя запісы не ўлічваюцца ў памеры старонкі.

Справаздачы аб удзеле вяртаюць усе запытаныя даныя, а пошук вяртае да 20 вынікаў. Ні справаздачы, ні пошук не падтрымліваюць падзел на старонкі.

Абмеркаванні, апытанні і запісы ўдзелу ў групах таксама прымаюць састарэлыя псеўданімы per для limit і from для offset. Для новых інтэграцый выкарыстоўвайце limit і offset.

Адказы API карыстальніка маюць складаны фармат: разам з асноўнымі запісамі перадаюцца звязаныя запісы, такія як тэмы, групы, карыстальнікі, апытанні і рэакцыі. Гэта дазваляе кліенту запоўніць лакальнае сховішча запісаў адным запытам, але адказ можа ўтрымліваць больш даных, чым патрабуецца простай інтэграцыі.

Перадайце 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. Канцавыя пункты, такія як пошук, якія наўмысна вяртаюць абмежаваны набор вынікаў, не ўключаюць meta.total замест таго, каб вяртаць null.

Каментарыі

Стварэнне каментарыя

Стварыце каментарый у абмеркаванні ад імя ўліковага запісу, якому належыць ключ 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. Памер старонкі
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'

Адказ утрымлівае старонку groups, упарадкаваную паводле ўзрастання ідэнтыфікатараў груп, і поўную колькасць адпаведных груп у meta.total. Ён уключае бацькоўскія групы і падгрупы, у тым ліку групы, падпіска якіх цяпер неактыўная. Правярайце поле enabled, калі інтэграцыя павінна працаваць толькі з уключанымі групамі.

Важныя палі групы:

Поле Апісанне
id Лікавы ідэнтыфікатар групы, які выкарыстоўваецца іншымі канцавымі пунктамі API карыстальніка
key Нязменны кароткі ключ, які выкарыстоўваецца ў URL-адрасах Loomio
handle Чытэльны для людзей ідэнтыфікатар групы
name Назва групы
full_name Назва групы з кантэкстам яе бацькоўскай групы
parent_id Лікавы ідэнтыфікатар бацькоўскай групы для падгрупы, у іншых выпадках — null
enabled Ці актыўныя група і яе падпіска
memberships_count Колькасць актыўных запісаў удзелу і запісаў, якія чакаюць пацвярджэння
accepted_memberships_count Колькасць пацверджаных запісаў удзелу
pending_memberships_count Колькасць запрашэнняў, якія чакаюць прыняцця
admin_memberships_count Колькасць адміністратараў групы
discussions_count Колькасць абмеркаванняў непасрэдна ў групе
polls_count Колькасць апытанняў непасрэдна ў групе
subgroups_count Колькасць падгруп

Адказ можа ўключаць дадатковыя налады групы, звязаныя запісы бацькоўскіх груп і запісы ўдзелу ўліковага запісу API ў групах. Кліенты павінны ігнараваць палі, якія яны не выкарыстоўваюць.

Атрыманне групы

Вяртае адну групу, даступную ўліковаму запісу, якому належыць ключ API.

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. Удзельнікі групы могуць бачыць імёны, ідэнтыфікатары, пасады і ролі іншых удзельнікаў. Адрасы электроннай пошты ўключаюцца толькі для ўласнага ўліковага запісу, якому належыць ключ API, або калі ўладальнікі ключа API маюць правы адміністратараў групы.

GET /api/user0/memberships

Параметры

Назва Апісанне
group_id Цэлы лік, абавязковы. Ідэнтыфікатар групы, спіс удзельнікаў якой трэба атрымаць
limit Цэлы лік, неабавязковы, па змаўчанні 50. Памер старонкі
offset Цэлы лік, неабавязковы, па змаўчанні 0. Зрушэнне для падзелу на старонкі

Сумяшчальнасць са старымі інтэграцыямі: per і from прымаюцца як псеўданімы для limit і offset і будуць працаваць надалей.

Адказ утрымлівае старонку запісаў memberships і звязаныя запісы 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 Цэлы лік, абавязковы. Ідэнтыфікатар групы, удзельнікамі якой трэба кіраваць
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. Састарэлае значэнне all трактуецца як my, бо ключы API карыстальніка ніколі не даюць доступу да ўсяго асобніка Loomio
group_ids Ідэнтыфікатары груп, падзеленыя коскамі, калі group_scope=custom. Ідэнтыфікатары груп, да якіх уліковы запіс API не належыць, ігнаруюцца
start_month Першы месяц для ўключэння ў фармаце YYYY-MM; па змаўчанні — месяц 12 месяцаў таму
end_month Апошні месяц для ўключэння ў фармаце YYYY-MM; па змаўчанні — бягучы месяц
interval Інтэрвал для раздзела base: day, week, month або year
member_type Задайце delegate разам з section=users, каб вярнуць толькі дзейных дэлегатаў

Да дэлегатаў адносяцца людзі, якія маюць актыўны статус дэлегавання ў любой выбранай групе. Іх паказчыкі сумуюцца па ўсіх выбраных групах. Радкі дэлегатаў вяртаюцца, нават калі ўсе паказчыкі актыўнасці роўныя нулю. Паказчыкі ахопліваюць тэмы, каментарыі, апытанні, галасы, высновы і рэакцыі; гэта не паказчыкі долі ўдзелу ў галасаванні. Радкі карыстальнікаў таксама ўключаюць выдадзеныя, пададзеныя і прапушчаныя бюлетэні ў галасаваннях з ідэнтыфікацыяй. Ананімныя апытанні выключаюцца з усіх персанальных паказчыкаў галасавання. all_votes_cast мае значэнне true толькі тады, калі выдадзены хаця б адзін бюлетэнь і пададзены ўсе выдадзеныя бюлетэні.

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. Апошнія два прымяняюцца да значкоў 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 Лагічнае значэнне, неабавязковае. Задайце true разам з id існуючага варыянта, каб выдаліць яго

Стварыце прапанову з уласнымі назвамі варыянтаў і пытаннямі пра прычыны:

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, каб атрымаць спіс закрытых апытанняў і прачытаць іх высновы, калі яны зададзеныя.

Каб паказваць стан рашэння побач з абмеркаваннямі, атрымайце абмеркаванні і апытанні адной і той жа групы, выкарыстоўваючы status=all для апытанняў, і супастаўце іх значэнні topic_id. Атрымайце ўсе старонкі з дапамогай limit і offset. У абмеркаванні можа быць некалькі апытанняў, таму выберыце, якое апытанне вызначае стан, што вы паказваеце, напрыклад апошняе створанае апытанне. Значэнне closed_at, адрознае ад null, пазначае закрытае апытанне; значэнне null у closing_at пазначае чарнавік. Калі апытанне мае выснову, яго current_outcome_id вызначае запіс у масіве outcomes у адказе; супастаўце poll_id гэтага запісу з id апытання.

Для асобнага абмеркавання вы таксама можаце прачытаць элементы яго тэмы з дапамогай GET /api/user0/threads/:topic_id/items. Адказ змяшчае апытанні і высновы тэмы разам з іншымі яе элементамі. Атрымайце ўсе старонкі, каб уключыць тэму цалкам.

GET /api/user0/polls

Параметры

Назва Апісанне
group_id Цэлы лік, абавязковы. ID групы, з якой трэба атрымаць спіс апытанняў
status Радок, неабавязковы, па змаўчанні active. Значэнні: active, closed, all
limit Цэлы лік, неабавязковы, па змаўчанні 50. Памер старонкі
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"
  }'

Рэдагаванне падрабязных варыянтаў

Атрымайце ID варыянтаў з масіву poll_options у адказе на запыт стварэння або атрымання апытання. Перадайце толькі палі, якія трэба змяніць, разам з 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 Абмежаваць вынікі адной даступнай групай
org_id Абмежаваць вынікі даступнай бацькоўскай групай і яе даступнымі падгрупамі. Выкарыстоўвайце 0 для прамых абмеркаванняў
type Абмежаваць вынікі адным тыпам: Discussion, Comment, Poll, Stance або Outcome
types Спіс тыпаў вынікаў, падзеленых коскамі
tag Абмежаваць вынікі тэмамі з гэтым тэгам
author_id Абмежаваць вынікі змесцівам, створаным адным уліковым запісам. Без 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. Памер старонкі
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. Памер старонкі
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 вяртае старонку патоку падзей у парадку ўзрастання іх паслядоўных нумароў, у тым ліку даступныя каментарыі, апытанні, галасы і высновы. meta.total — агульная колькасць элементаў у тэме. Атрымайце наступныя старонкі, каб прачытаць увесь паток. Канцавы пункт markdown вяртае ўсё даступнае змесціва тэмы ў адным дакуменце Markdown. Прычыны галасоў уключаюцца толькі тады, калі яны даступныя ўліковаму запісу, якому належыць ключ API.

Усе канцавыя пункты для тэм прымяняюць тыя ж правы доступу, што і інтэрфейс Loomio. Ключ API не дае доступу да тэмы, якую нельга адкрыць праз адпаведны ўліковы запіс звычайным спосабам.

Вэбхукі

API карыстальніка працуе на аснове запытаў: інтэграцыя звяртаецца да Loomio, калі ёй трэба прачытаць або змяніць даныя. Вэбхук групы забяспечвае адпраўку даных у зваротным кірунку. Loomio адпраўляе выбраныя падзеі групы на ваш канчатковы пункт адразу, калі яны адбываюцца, таму інтэграцыі не трэба перыядычна звяртацца да REST API, каб правяраць змены.

Вэбхукі наладжваюцца асобна для кожнай групы і патрабуюць правоў адміністрацыі групы. Імі можна кіраваць праз інтэрфейс Loomio:

  1. Адкрыйце групу.
  2. Адкрыйце меню групы і выберыце Інтэграцыі з чатам.
  3. Дадайце інтэграцыю, якая адпавядае фармату даных, што прымае ваш канчатковы пункт. Для канчатковага пункта агульнага прызначэння выкарыстоўвайце фармат Mattermost/Markdown.
  4. Увядзіце назву і URL прызначэння.
  5. Выберыце падзеі, якія Loomio мае адпраўляць аўтаматычна.
  6. Захавайце інтэграцыю і націсніце Тэставае падключэнне, каб адправіць тэставае паведамленне.

Выкарыстоўвайце HTTPS-адрас прызначэння з URL, які немагчыма адгадаць. Loomio патрабуе, каб адрас прызначэння вызначаўся як публічны адрас, і блакуе запыты да лакальных або прыватных сеткавых адрасоў.

Агенты і іншыя інтэграцыі могуць замест гэтага кіраваць вэбхукамі праз апісаныя ніжэй канчатковыя пункты чат-ботаў з аўтэнтыфікацыяй Bearer. Рэсурс называецца chatbots для сумяшчальнасці з інтэграцыямі Loomio з чатам, але ён таксама прадстаўляе выходныя вэбхукі агульнага прызначэння.

Спіс вэбхукаў

Вяртае інтэграцыі з чатам, наладжаныя для групы. Уліковы запіс, якому належыць ключ API, павінен мець правы адміністратара гэтай групы. Адказ уключае URL-адрасы прызначэння, таму яго нельга раскрываць звычайным удзельнікам групы.

GET /api/user0/chatbots?group_id=123

Назва Апісанне
group_id Цэлы лік, абавязковы. ID групы, спіс вэбхукаў якой трэба атрымаць
limit Цэлы лік, неабавязковы, па змаўчанні 50, максімум 500. Памер старонкі
offset Цэлы лік, неабавязковы, па змаўчанні 0. Зрушэнне для падзелу на старонкі
curl 'https://www.loomio.com/api/user0/chatbots?group_id=123&limit=50&offset=0' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Адказ утрымлівае старонку chatbots, упарадкаваную па ўзрастанні ID інтэграцыі, і агульную колькасць інтэграцый групы ў meta.total. Кожная інтэграцыя мае наступныя палі:

Поле Апісанне
id Ідэнтыфікатар інтэграцыі для абнаўлення і выдалення
group_id Група, якая атрымлівае падзеі
name Назва інтэграцыі для адміністравання
kind webhook для выходнага вэбхука або matrix для інтэграцыі з Matrix
webhook_kind Фармат даных: markdown, slack, discord, microsoft або webex
server URL-адрас прызначэння
event_kinds Падзеі, якія адпраўляюцца аўтаматычна
notification_only Ці ўтрымліваюць паведамленні толькі загаловак апавяшчэння

Стварэнне вэбхука

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-адрасам.

Абнаўленне вэбхука

PATCH /api/user0/chatbots/:id

Перадайце ўсе палі, якія трэба змяніць. Вэбхук нельга перанесці ў іншую групу, змяніўшы group_id.

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"
    ]
  }'

Праверка адраса прызначэння вэбхука

Адпраўце тэставае паведамленне, сумяшчальнае з 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"
  }'

Выдаленне вэбхука

DELETE /api/user0/chatbots/:id

curl https://www.loomio.com/api/user0/chatbots/456 \
  -X DELETE \
  -H 'Authorization: Bearer YOUR_API_KEY'

Выдаленне канфігурацыі спыняе далейшую дастаўку паведамленняў. Яно не выдаляе ніякага змесціва групы Loomio.

Тыпы падзей

Вэбхук можа падпісацца на наступныя тыпы падзей:

Падзея Калі адпраўляецца
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 Змяняецца голас

Вэбхук належыць адной групе і атрымлівае з яе падзеі, на якія падпісаны. Людзі таксама могуць яўна выбраць інтэграцыю, калі дзеляцца змесцівам або адпраўляюць некаторыя апавяшчэнні, нават калі адпаведная аўтаматычная падзея не выбрана.

Дастаўка праз HTTP

Loomio адпраўляе асінхронны HTTP-запыт POST на наладжаны URL з наступным загалоўкам:

Content-Type: application/json; charset=utf-8

Час чакання адказу на запыт складае пяць секунд. Адказ 2xx, у тым ліку 204 No Content, лічыцца паспяховым. Сэрвісы, якія прымаюць вэбхукі, павінны адказваць хутка, выконваць працяглую апрацоўку асінхронна і карэктна апрацоўваць паўторныя паведамленні або паведамленні, якія прыходзяць не па парадку.

Зараз Loomio не дадае подпіс вэбхука, загаловак з агульным сакрэтам, ідэнтыфікатар падзеі або ідэнтыфікатар дастаўкі. Стаўцеся да поўнага URL прызначэння як да ўліковых даных: не раскрывайце яго публічна і дадайце ў URL токен, які немагчыма адгадаць, калі сэрвіс атрымання падтрымлівае гэта. Калі патрэбная стабільная машыначытальная схема падзей або дастаўка з подпісам, выкарыстоўвайце вэбхук як апавяшчэнне пра змены і атрымлівайце актуальныя запісы праз API карыстальніка з аўтэнтыфікацыяй.

Фарматы даных паведамленняў

Даныя вэбхукаў — гэта паведамленні, прызначаныя для паказу ў сэрвісах чата. Яны не з'яўляюцца поўнымі серыялізаванымі запісамі 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. Сэрвісы атрымання павінны абапірацца на задакументаваныя палі верхняга ўзроўню выбранага фармату, а не разбіраць фармулёўкі сказаў.

Гэтая старонка перакладзена аўтаматычна. Калі слова няправільнае або незразумелае, напішыце на contact@loomio.org, і мы выправім яго.