Yoto Files API v1
Публичный API для интеграции заданий Yoto Files в ваше приложение, бота или сайт: получайте список заданий для пользователя и проверяйте их выполнение.
Скачать документацию (.md) — удобно сохранить или отправить разработчику
Алиасы адресов: GET /api/v1/tasks и
POST /api/v1/tasks/check делают то же, что
/api/v1/get_tasks и /api/v1/check_task.
Авторизация
Все запросы (кроме /api/v1/ping) требуют личный API-ключ.
Ключ создаётся в боте Yoto Files:
главное меню → кнопка API → «Создать ключ».
Можно создать до 5 ключей — каждому задаётся необязательное название, у каждого своя статистика (запросы, выданные и выполненные задания, заработок), доступная в мини-аппе прямо в боте. Ключ всегда можно посмотреть в боте (он показан скрытым — нажмите, чтобы раскрыть) и настроить для него ссылку возврата после капчи (см. ниже).
Передавайте ключ в заголовке X-Api-Key (поддерживается и Authorization: Bearer):
curl -H "X-Api-Key: yf_ВАШ_КЛЮЧ" "https://yotofiles.com/api/v1/get_tasks?user_id=123456789"
\,
следите, чтобы после \ не было пробела — иначе curl вернёт
curl: (3) URL rejected: Malformed input to a URL function.
Капча
Задания выдаются только пользователям, прошедшим проверку «я не робот» в Yoto Files. Это то же самое окно, что видят пользователи бота: мини-апп с галочкой, где Telegram спрашивает разрешение отправлять сообщения. Именно это разрешение и нужно провайдерам заданий, чтобы человека стало видно.
/get_tasks и /check_task вернут
status: "captcha_required", когда:
- пользователь ещё не проходил проверку;
- проверка перестала действовать — провайдер сообщил, что больше не видит
пользователя (заблокировал бота, удалил аккаунт). Тогда
captcha_requiredпридёт и тому, кто раньше получал задания.
Покажите пользователю окно капчи — текст message, кнопку
«Пройти проверку» со ссылкой captcha.link и кнопку «Готово», по
которой вы повторяете запрос заданий. Ссылка открывает мини-апп внутри
Telegram: из бота выходить не нужно, и нажимать «Start» тоже.
captcha.link
(startapp=api<id>) — отдельно ничего передавать не нужно.
{
"ok": true,
"status": "captcha_required",
"message": "Требуется проверка «я не робот».",
"user_id": 123456789,
"captcha": {
"link": "https://t.me/YotoFilesBot/captcha?startapp=api12",
"status": "not_passed"
},
"tasks": []
}
| Поле | Описание |
|---|---|
message | Готовый текст для показа пользователю. |
captcha.link | Ссылка на проверку — мини-апп «я не робот» в Telegram. |
captcha.status | not_passed — проверка ещё не пройдена. После прохождения повторный запрос вернёт status: "ok" и задания. |
GET/api/v1/ping
Проверка доступности API. Авторизация не требуется.
{ "ok": true, "service": "yoto-files-api", "version": "v1" }
GET/api/v1/me
Сам ключ и его счётчики — те же, что видно в боте.
{
"ok": true,
"key_id": 12,
"owner_id": 987654321,
"name": "Мой бот",
"key_prefix": "yf_AbCdEfGh…",
"created_at": "2026-07-16T10:00:00+00:00",
"requests_total": 1024,
"tasks_issued": 380,
"tasks_completed": 205,
"earned_total": "12.40"
}
GET/api/v1/get_tasks
Получение списка заданий для пользователя — тот же набор, что бот
показывает при получении материалов. Задания бывают двух типов:
внешние (external) — задания платформы; и
личные (personal) — ваши личные каналы-задания
(те же, что в боте: Медиахаб → Личные задания). Поле provider
у внешних заданий уточняет источник: op — ваши собственные
задания; YotoFiles — задания платформы Yoto Files.
provider: "YotoFiles") показываются, только
если у вас включена монетизация и настройка «Использовать внешние задания».
Когда пользователь выполняет такое задание и вы подтверждаете его через
/check_task, вознаграждение начисляется вам — так же, как в боте.
Параметры query
| Параметр | Тип | Описание |
|---|---|---|
user_id | int, обязателен | Telegram ID пользователя, которому показываются задания. |
limit | int, 1–10 | Максимум внешних заданий в блоке (личные каналы включаются всегда). По умолчанию 5. |
Что подставить
Key : yf_ВАШ_КЛЮЧ → заголовок X-Api-Key (обязательно)
UserID : 123456789 → параметр user_id (обязательно)
limit : 5 → параметр limit (необязательно, 1–10)
Пример запроса
# curl (одной строкой)
curl -H "X-Api-Key: yf_ВАШ_КЛЮЧ" "https://yotofiles.com/api/v1/get_tasks?user_id=123456789&limit=5"
# HTTP
GET /api/v1/get_tasks?user_id=123456789&limit=5 HTTP/1.1
Host: yotofiles.com
X-Api-Key: yf_ВАШ_КЛЮЧ
# Python (requests)
import requests
resp = requests.get(
"https://yotofiles.com/api/v1/get_tasks",
headers={"X-Api-Key": "yf_ВАШ_КЛЮЧ"},
params={"user_id": 123456789, "limit": 5},
)
print(resp.json())
Ответ
{
"ok": true,
"status": "ok",
"user_id": 123456789,
"tasks": [
{
"id": "ext_42",
"number": 1,
"type": "external",
"provider": "op",
"title": "Подписаться на канал",
"link": "https://t.me/example_channel",
"date": "2026-07-01T12:00:00+00:00",
"status": "not_completed",
"action": "subscribe"
},
{
"id": "fl_AbC123",
"number": 2,
"type": "external",
"provider": "YotoFiles",
"title": "Подписаться на канал",
"link": "https://t.me/+AbCdEfGhIjK",
"date": null,
"status": "not_completed",
"action": "subscribe"
},
{
"id": "pers_7",
"number": 3,
"type": "personal",
"provider": null,
"title": "Мой канал",
"link": "https://t.me/my_channel",
"date": "2026-06-20T18:05:00+00:00",
"status": "completed",
"action": "subscribe"
}
],
"count": 3,
"all_completed": false
}
| Поле задания | Описание |
|---|---|
id | ID задания для /api/v1/check_task. Разные префиксы соответствуют разным внутренним источникам задания. Передавайте id как есть, без разбора префикса. |
number | Номер задания в блоке (с 1) — для показа пользователю («Задание 1», «Задание 2»…). |
type | Тип задания: personal — личное (ваш канал), external — внешнее (задание платформы). |
provider | Источник внешнего задания: op — ваши собственные задания; YotoFiles — задания платформы (для личных каналов — null). |
title | Название задания для показа пользователю. |
link | Ссылка, которую нужно открыть пользователю. |
date | Дата создания задания (ISO 8601). |
status | completed — выполнено, not_completed — не выполнено. Зачёт выполнения происходит в /api/v1/check_task. |
action | Что должен сделать пользователь: subscribe — подписаться; join_request — подать заявку на вступление по ссылке. |
action: "join_request" пользователь должен перейти именно по ссылке из ответа —
заявка, поданная по другой ссылке, не засчитывается. Внешние задания, уже засчитанные пользователю,
в блок повторно не попадают.
POST/api/v1/check_task
Проверка выполнения заданий пользователем. Выполненные внешние задания фиксируются
и повторно в /get_tasks не возвращаются. Можно проверить одно задание
(task_id) или несколько сразу (task_ids).
Что подставить
Key : yf_ВАШ_КЛЮЧ → заголовок X-Api-Key (обязательно)
UserID : 123456789 → поле user_id (обязательно)
task_id : ext_42 → одно задание, ИЛИ
task_ids: ["ext_42","pers_7"] → несколько заданий
Тело запроса (application/json)
// несколько заданий
{
"user_id": 123456789,
"task_ids": ["ext_42", "ext_57", "pers_7"]
}
// одно задание
{
"user_id": 123456789,
"task_id": "ext_42"
}
Пример запроса (curl, одной строкой)
curl -X POST "https://yotofiles.com/api/v1/check_task" -H "X-Api-Key: yf_ВАШ_КЛЮЧ" -H "Content-Type: application/json" -d "{\"user_id\": 123456789, \"task_id\": \"ext_42\"}"
Ответ
{
"ok": true,
"status": "ok",
"user_id": 123456789,
"results": [
{ "id": "ext_42", "completed": true, "state": "completed" },
{ "id": "ext_57", "completed": false, "state": "not_completed" },
{ "id": "pers_7", "completed": true, "state": "completed" }
],
"all_completed": false
}
state | Значение |
|---|---|
completed | Задание выполнено и засчитано. |
not_completed | Задание не выполнено (нет подписки/заявки). |
unknown | Не удалось проверить (временная ошибка Telegram) — повторите позже. |
not_found | Задание с таким id не существует или уже недоступно. |
state: "unknown" — это не отказ:
повторите проверку через несколько секунд.
Ошибки и лимиты
Все ошибки возвращаются в едином формате:
{
"ok": false,
"error": { "code": "unauthorized", "message": "Неверный или отозванный API-ключ." }
}
| HTTP | code | Описание |
|---|---|---|
| 400 | bad_request | Некорректные параметры или JSON. |
| 401 | unauthorized | Ключ не передан, неверен или отозван. |
| 429 | rate_limited | Превышен лимит запросов. Повторите через error.retry_after секунд (см. также заголовок Retry-After). |
| 500 | internal_error | Внутренняя ошибка сервиса. |
| 503 | unavailable | Сервис временно недоступен — повторите запрос. |
| 503 | provider_unavailable | Провайдер заданий не отвечает — повторите запрос позже. |
Базовый лимит — 300 запросов в секунду на ключ (кратковременные всплески до 600 допускаются). Лимит считается по каждому ключу отдельно. Если вам нужен ещё больший лимит — напишите в поддержку.
Рекомендуемый сценарий интеграции
- Пользователь запрашивает контент в вашем приложении.
- Вы вызываете
GET /api/v1/get_tasks?user_id=…. - Если
status = "captcha_required"— покажите кнопку «Пройти проверку» (captcha.link) и кнопку «Готово», по которой повторяете шаг 2. Этот же ответ может прийти и позже, у пользователя с историей: значит, проверку надо пройти заново. - Покажите пользователю задания: кнопка с
titleи ссылкойlink+ кнопка «Проверить». - По кнопке «Проверить» вызовите
POST /api/v1/check_taskсо списком показанныхtask_ids. - Когда
all_completed = true— выдайте пользователю контент.
# Пример на Python (aiohttp)
import aiohttp
API = "https://yotofiles.com/api/v1"
HEADERS = {"X-Api-Key": "yf_ВАШ_КЛЮЧ"}
async def get_tasks(session: aiohttp.ClientSession, user_id: int) -> dict:
async with session.get(f"{API}/get_tasks", params={"user_id": user_id},
headers=HEADERS) as resp:
return await resp.json()
async def check_tasks(session: aiohttp.ClientSession, user_id: int,
task_ids: list[str]) -> dict: # ["ext_42", "pers_7"]
async with session.post(f"{API}/check_task", headers=HEADERS,
json={"user_id": user_id, "task_ids": task_ids}) as resp:
return await resp.json()
