Аутентификация
Все запросы к /v1/ требуют заголовок:
Authorization: Bearer planner_xxxxxxxx…
Ключи создаются в разделе Аккаунт → API-ключи. Ключ отображается единожды при создании — сохраните его сразу.
Задачи
Опциональный параметр ?status=new|in_progress|done — фильтр по статусу.
curl https://planner40.ru/v1/tasks \ -H "Authorization: Bearer $KEY"
curl -X POST https://planner40.ru/v1/tasks \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Купить молоко","description":"2 литра"}'
Ответ: {"id":"…"}, статус 201.
curl https://planner40.ru/v1/tasks/<id> \ -H "Authorization: Bearer $KEY"
Ответ: {"task":{…},"subtasks":[…]}.
Передайте только изменяемые поля: title, description, status.
curl -X PATCH https://planner40.ru/v1/tasks/<id> \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"status":"done"}'
Ответ: 204 No Content. Допустимые статусы: new, in_progress, done.
curl -X DELETE https://planner40.ru/v1/tasks/<id> \ -H "Authorization: Bearer $KEY"
Ответ: 204 No Content.
Заметки
curl https://planner40.ru/v1/notes \ -H "Authorization: Bearer $KEY"
curl -X POST https://planner40.ru/v1/notes \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Рецепт","content":"Смешать муку и яйца…"}'
Ответ: {"id":"…"}, статус 201.
curl https://planner40.ru/v1/notes/<id> \ -H "Authorization: Bearer $KEY"
Передайте только изменяемые поля: title, content.
curl -X PATCH https://planner40.ru/v1/notes/<id> \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"content":"Обновлённый текст"}'
curl -X DELETE https://planner40.ru/v1/notes/<id> \ -H "Authorization: Bearer $KEY"
Вебхук Яндекс Алисы
Принимает голосовые команды от навыка и выполняет действия с задачами и заметками. Аутентификация — Яндекс OAuth 2.0 (Authorization Code Flow). Пользователь подтверждает доступ один раз на странице /oauth.html; Яндекс хранит выданный токен и передаёт его в каждом запросе в поле session.user.access_token.
Вызывается JS страницы /oauth.html после подтверждения пользователем. Требует браузерную сессию и CSRF-токен. Тело: {"client_id":"alice","redirect_uri":"…","state":"…"}. Возвращает {"redirect_to":"…?code=…&state=…"}.
Вызывается сервером Яндекса. Тело: application/x-www-form-urlencoded с полями grant_type=authorization_code, code, redirect_uri, client_id=alice, client_secret. Возвращает {"access_token":"planner_…","token_type":"bearer","expires_in":31536000}. Секрет задаётся переменной окружения ALICE_OAUTH_CLIENT_SECRET.
Токен из session.user.access_token в теле запроса валидируется как Bearer API-ключ. Если токен отсутствует или недействителен — возвращается "start_account_linking": {} для повторной привязки. Сервер определяет намерение по тексту фразы и выбирает команду автоматически.
| Что сказать | Что произойдёт | Пример фразы |
|---|---|---|
| Создать заметку | Сохраняет заметку; заголовок — первые 60 символов текста | «Запиши купить молоко», «Добавь заметку рецепт борща», «Сохрани запись…» |
| Дописать в заметку | Ищет заметку по заголовку и добавляет текст в конец содержимого | «Допиши в заметку рецепт добавить соль», «Добавь к заметке todo сделать отчёт», «Дополни заметку…» |
| Создать задачу | Создаёт задачу со статусом new |
«Добавь задачу позвонить маме», «Создай задачу…», «Запланируй…» |
| Список задач в работе | Озвучивает до 5 задач со статусом in_progress |
«Что в работе», «Задачи в работе», «Что сейчас делаю» |
| Все активные задачи | Озвучивает до 5 задач со статусом new или in_progress |
«Какие задачи», «Список задач», «Что запланировано» |
| Последние заметки | Озвучивает заголовки до 5 последних изменённых заметок | «Какие заметки», «Последние заметки», «Что в заметках» |
Если фраза не распознана ни как команда задачи, ни как запрос списка — текст сохраняется как заметка (поведение по умолчанию).
# Создать заметку (токен передаётся Яндексом в поле session.user.access_token)
curl -X POST https://planner40.ru/alice/webhook \
-H "Content-Type: application/json" \
-d '{"request":{"original_utterance":"Запиши купить молоко"},"session":{"new":false,"user_id":"u1","skill_id":"s1","user":{"access_token":"planner_…"}},"version":"1.0"}'
# Создать задачу
curl -X POST https://planner40.ru/alice/webhook \
-H "Content-Type: application/json" \
-d '{"request":{"original_utterance":"Добавь задачу сделать отчёт"},"session":{"new":false,"user_id":"u1","skill_id":"s1","user":{"access_token":"planner_…"}},"version":"1.0"}'
# Ответ при отсутствии токена — Яндекс инициирует привязку аккаунта
# {"response":{"text":"…","end_session":true},"start_account_linking":{},"version":"1.0"}
Если аккаунт привязан и session.new: true — навык приветствует пользователя и перечисляет доступные команды. Без токена (access_token отсутствует или недействителен) ответ всегда содержит start_account_linking независимо от session.new. Сессия закрывается после каждого ответа (end_session: true), кроме случаев когда текст пустой — тогда навык ждёт повторной попытки.
Коды ответов
| Код | Значение |
|---|---|
| 200 | Успех, тело — JSON |
| 201 | Ресурс создан, тело — {"id":"…"} |
| 204 | Успех, тело пустое |
| 400 | Неверный запрос (отсутствует обязательное поле, недопустимый статус) |
| 401 | Ключ не передан или неверен |
| 404 | Ресурс не найден |
| 500 | Внутренняя ошибка сервера |
| Когда | Метод | Путь | Статус | Мс | Ключ |
|---|
OAuth клиенты
Зарегистрируйте клиента, скопируйте Client ID и Client Secret в настройки навыка в Яндекс Диалогах. Секрет показывается один раз при создании.
| Client ID | Название | Redirect URI | Создан |
|---|
Клиентов нет. Создайте первого выше.
| Когда | Кто | Что | Откуда |
|---|