Справочник API
Справочник собран из OpenAPI того же коммита, что и сайт. Файл целиком: openapi.json. В нём servers указывает на боевой API, а кнопка «Попробовать запрос» отправляет запросы на https://api.staging.donatty.com.
Ключ вставляется только в поле справочника и остаётся в памяти страницы: после перезагрузки его нужно ввести снова. В адрес запроса он не попадает. Секретный ключ даёт доступ к вашим данным: вставляйте его только на странице справочника той среды, куда хотите отправить запрос.
Для публичного ключа сервер проверяет адрес сайта (Origin). Из справочника запрос уходит с адреса https://developers.staging.donatty.com: чтобы ключ сработал, добавьте его в адреса ключа или проверяйте ключ со своего сайта, как описано в быстром старте для сайта.
Текстовая версия справочника
GET /v1/streamer
Заголовок раздела «GET /v1/streamer»Профиль стримера. Публичный профиль стримера, выпустившего ключ.
Доступ: секретный ключ (personalToken), право profile:read; публичный ключ (publishableKey), право profile:read
Ответы:
200— Успешно400— Недопустимый параметр запроса или токен в адресе запроса.:invalid_parameter,token_in_query401— Токена нет, он неизвестен, удалён или просрочен.:missing_token,invalid_token,token_expired403— Не тот вид токена, у токена нет праваprofile:read, или публичный ключ использован с адреса Origin, не разрешённого стримером.:wrong_token_type,insufficient_scope,origin_not_allowed429— Исчерпан один из уровней лимита запросов.:rate_limited500— Ошибка сервера.:internal_error503— Временно недоступно.:service_unavailable
Пример ответа 200:
{ "id": "str_5b0c2f4e-8d61-4f43-9a7e-2f1d3c6b9a10", "slug": "teststreamer", "displayName": "Test Streamer", "avatarUrl": "https://storage.donatty.com/avatars/teststreamer.png", "donatePageUrl": "https://donatty.com/teststreamer"}GET /v1/donations
Заголовок раздела «GET /v1/donations»Донаты. Все донаты стримера от новых к старым: Донатти и Donation Alerts (если подключён), включая отклонённые модерацией и ожидающие её решения, с полным текстом и текущим статусом модерации. Без контактов донатеров, платёжных данных и комиссий. Только секретные ключи.
Доступ: секретный ключ (personalToken), право donations:read
Параметры:
| Имя | Где | Тип | Описание |
|---|---|---|---|
limit |
в адресе | integer, 1–100, по умолчанию 20 |
|
cursor |
в адресе | string |
nextCursor предыдущей страницы. |
since |
в адресе | string:date-time |
Только донаты, созданные в этот момент или позже (RFC 3339). |
source |
в адресе | список string, значения: DONATTY, DONATION_ALERTS |
Источники через запятую. |
moderation |
в адресе | список string, значения: PENDING, PASSED, BLOCKED, NONE |
Статусы модерации через запятую, например PASSED,NONE. |
Ответы:
200— Успешно400— Недопустимый параметр запроса или токен в адресе запроса.:invalid_parameter,token_in_query401— Токена нет, он неизвестен, удалён или просрочен.:missing_token,invalid_token,token_expired403— Не тот вид токена или у токена нет праваdonations:read(у публичного ключа его не бывает).:wrong_token_type,insufficient_scope429— Исчерпан один из уровней лимита запросов.:rate_limited500— Ошибка сервера.:internal_error503— Временно недоступно.:service_unavailable
Пример ответа 200:
{ "items": [ { "id": "don_0f6e2a4c-91b3-4d7a-8c5e-3b2a1f0e9d84", "createdAt": "2026-11-09T10:15:30.123456Z", "source": "DONATTY", "donorName": "Alex", "message": "Thanks for the stream!", "amount": { "value": "500.00", "currency": "RUB" }, "goal": { "id": "goal_7e3a9c10-4b2d-4f8e-a1c6-0d9b8e7f6a52", "title": "New microphone" }, "moderation": { "status": "PENDING", "deadline": "2026-11-09T10:16:30Z" }, "media": { "title": "Song of the day", "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "provider": "YOUTUBE", "durationSeconds": 212, "moderation": { "status": "PENDING", "deadline": "2026-11-09T10:16:30Z" } } }, { "id": "don_3c9d7b21-5e84-4a6f-b0d2-8e1f4a7c6b35", "createdAt": "2026-11-09T10:02:11Z", "source": "DONATTY", "donorName": "Anonymous", "message": "This text was rejected by moderation but is returned in full.", "amount": { "value": "150.50", "currency": "RUB" }, "goal": null, "moderation": { "status": "BLOCKED", "deadline": null }, "media": null }, { "id": "don_9a1b2c3d-4e5f-4a6b-8c7d-0e1f2a3b4c5d", "createdAt": "2026-11-09T09:58:00Z", "source": "DONATION_ALERTS", "donorName": "Maria", "message": "Hi from Donation Alerts", "amount": { "value": "5.00", "currency": "USD" }, "goal": null, "moderation": { "status": "NONE", "deadline": null }, "media": null } ], "nextCursor": "MTc5NDIxODI4MDAwMDAwMC45YTFiMmMzZC00ZTVmLTRhNmItOGM3ZC0wZTFmMmEzYjRjNWQ"}GET /v1/goals
Заголовок раздела «GET /v1/goals»Цели сбора. Цели сбора Донатти от новых к старым. raised — сумма, собранная целью по всем донатам Донатти (включая отклонённые модерацией), плюс её ручной старт; цели Donation Alerts и настройки виджета не учитываются, поэтому прогресс на стриме может отличаться.
Доступ: секретный ключ (personalToken), право goals:read; публичный ключ (publishableKey), право goals:read
Параметры:
| Имя | Где | Тип | Описание |
|---|---|---|---|
status |
в адресе | string, значения: ACTIVE, CLOSED |
|
limit |
в адресе | integer, 1–100, по умолчанию 20 |
|
cursor |
в адресе | string |
nextCursor предыдущей страницы. |
Ответы:
200— Успешно400— Недопустимый параметр запроса или токен в адресе запроса.:invalid_parameter,token_in_query401— Токена нет, он неизвестен, удалён или просрочен.:missing_token,invalid_token,token_expired403— Не тот вид токена, у токена нет праваgoals:read, или публичный ключ использован с адреса Origin, не разрешённого стримером.:wrong_token_type,insufficient_scope,origin_not_allowed429— Исчерпан один из уровней лимита запросов.:rate_limited500— Ошибка сервера.:internal_error503— Временно недоступно.:service_unavailable
Пример ответа 200:
{ "items": [ { "id": "goal_7e3a9c10-4b2d-4f8e-a1c6-0d9b8e7f6a52", "title": "New microphone", "target": { "value": "15000.00", "currency": "RUB" }, "raised": { "value": "6420.50", "currency": "RUB" }, "status": "ACTIVE", "endsAt": "2026-12-31T21:00:00Z", "createdAt": "2026-10-01T12:00:00Z" } ], "nextCursor": "MTc5MDg1NjAwMDAwMDAwMC43ZTNhOWMxMC00YjJkLTRmOGUtYTFjNi0wZDliOGU3ZjZhNTI"}GET /v1/stats/top
Заголовок раздела «GET /v1/stats/top»Топ донатеров. Топ донатеров за календарный период [from, to) в зоне timeZone: все подключённые источники в рублях, донатеры с одним именем объединены по источникам, сортировка по сумме по убыванию.
Доступ: секретный ключ (personalToken), право stats:read; публичный ключ (publishableKey), право stats:read
Параметры:
| Имя | Где | Тип | Описание |
|---|---|---|---|
period |
в адресе | string, значения: DAY, WEEK, MONTH, YEAR, ALL_TIME, по умолчанию ALL_TIME |
|
limit |
в адресе | integer, 1–100, по умолчанию 10 |
|
timeZone |
в адресе | string, по умолчанию Europe/Moscow |
Часовой пояс календарного периода (IANA). |
Ответы:
200— Успешно400— Недопустимый параметр запроса или токен в адресе запроса.:invalid_parameter,token_in_query401— Токена нет, он неизвестен, удалён или просрочен.:missing_token,invalid_token,token_expired403— Не тот вид токена, у токена нет праваstats:read, или публичный ключ использован с адреса Origin, не разрешённого стримером.:wrong_token_type,insufficient_scope,origin_not_allowed429— Исчерпан один из уровней лимита запросов.:rate_limited500— Ошибка сервера.:internal_error503— Временно недоступно.:service_unavailable
Пример ответа 200:
{ "period": "WEEK", "from": "2026-11-08T21:00:00Z", "to": "2026-11-15T21:00:00Z", "items": [ { "rank": 1, "name": "Alex", "total": { "value": "12500.00", "currency": "RUB" } }, { "rank": 2, "name": "Maria", "total": { "value": "4300.75", "currency": "RUB" } }, { "rank": 3, "name": "Ivan", "total": { "value": "1000.00", "currency": "RUB" } } ]}GET /v1/stats/total
Заголовок раздела «GET /v1/stats/total»Сумма донатов. Сумма донатов за календарный период [from, to) в зоне timeZone: все подключённые источники в рублях.
Доступ: секретный ключ (personalToken), право stats:read; публичный ключ (publishableKey), право stats:read
Параметры:
| Имя | Где | Тип | Описание |
|---|---|---|---|
period |
в адресе | string, значения: DAY, WEEK, MONTH, YEAR, ALL_TIME, по умолчанию ALL_TIME |
|
timeZone |
в адресе | string, по умолчанию Europe/Moscow |
Часовой пояс календарного периода (IANA). |
Ответы:
200— Успешно400— Недопустимый параметр запроса или токен в адресе запроса.:invalid_parameter,token_in_query401— Токена нет, он неизвестен, удалён или просрочен.:missing_token,invalid_token,token_expired403— Не тот вид токена, у токена нет праваstats:read, или публичный ключ использован с адреса Origin, не разрешённого стримером.:wrong_token_type,insufficient_scope,origin_not_allowed429— Исчерпан один из уровней лимита запросов.:rate_limited500— Ошибка сервера.:internal_error503— Временно недоступно.:service_unavailable
Пример ответа 200:
{ "period": "DAY", "from": "2026-11-09T17:00:00Z", "to": "2026-11-10T17:00:00Z", "total": { "value": "18250.25", "currency": "RUB" }}| Поле | Тип | Описание |
|---|---|---|
value |
string |
Десятичная сумма с двумя знаками после запятой. |
currency |
string |
Код ISO 4217. |
Moderation
Заголовок раздела «Moderation»| Поле | Тип | Описание |
|---|---|---|
status |
string, значения: PENDING, PASSED, BLOCKED, NONE |
PENDING — модерация идёт; PASSED — одобрен (в том числе «Повторить на стриме»); BLOCKED — отклонён; NONE — модерации не было (выключена, никого нет онлайн, Donation Alerts). |
deadline |
string,null:date-time |
Только для PENDING: когда сработает решение по умолчанию. |
Streamer
Заголовок раздела «Streamer»| Поле | Тип | Описание |
|---|---|---|
id |
string |
|
slug |
string |
|
displayName |
string |
|
avatarUrl |
string,null:uri |
|
donatePageUrl |
string:uri |
Donation
Заголовок раздела «Donation»| Поле | Тип | Описание |
|---|---|---|
id |
string |
|
createdAt |
string:date-time |
|
source |
string, значения: DONATTY, DONATION_ALERTS |
|
donorName |
string |
|
message |
string |
|
amount |
Money |
|
goal |
object (или null) |
|
moderation |
Moderation |
|
media |
object (или null) |
DonationPage
Заголовок раздела «DonationPage»| Поле | Тип | Описание |
|---|---|---|
items |
список Donation |
|
nextCursor |
string,null |
Передайте как cursor, чтобы получить следующую страницу; null — страница последняя. |
| Поле | Тип | Описание |
|---|---|---|
id |
string |
|
title |
string |
|
target |
Money |
|
raised |
Money |
|
status |
string, значения: ACTIVE, CLOSED |
|
endsAt |
string,null:date-time |
|
createdAt |
string:date-time |
GoalPage
Заголовок раздела «GoalPage»| Поле | Тип | Описание |
|---|---|---|
items |
список Goal |
|
nextCursor |
string,null |
Передайте как cursor, чтобы получить следующую страницу; null — страница последняя. |
| Поле | Тип | Описание |
|---|---|---|
period |
string, значения: DAY, WEEK, MONTH, YEAR, ALL_TIME |
|
from |
string:date-time |
|
to |
string:date-time |
Не включается: начало следующего периода; для ALL_TIME — момент ответа. |
items |
список object |
| Поле | Тип | Описание |
|---|---|---|
period |
string, значения: DAY, WEEK, MONTH, YEAR, ALL_TIME |
|
from |
string:date-time |
|
to |
string:date-time |
Не включается. |
total |
Money |
Problem
Заголовок раздела «Problem»| Поле | Тип | Описание |
|---|---|---|
type |
string:uri |
https://developers.donatty.com/errors/<code> |
title |
string |
|
status |
integer |
|
detail |
string |
|
code |
string, значения: missing_token, invalid_token, token_expired, token_in_query, wrong_token_type, insufficient_scope, origin_not_allowed, invalid_parameter, not_found, rate_limited, internal_error, service_unavailable |
|
policy (необязательный) |
string, значения: app-user, app, user, publishable-ip |
Только для rate_limited: исчерпанный уровень. |