> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aigenda.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# Авторизация

> Как получить токен, сколько он живёт и что делать, когда он истёк.

API принимает JWT. Вы получаете пару токенов по почте и паролю аккаунта AiGenda и передаёте `access` в каждом запросе.

## Получить токен

```bash theme={null}
curl -X POST https://api.aigenda.tech/api/token/ \
  -H "Content-Type: application/json" \
  -d '{"username": "you@example.com", "password": "ваш-пароль"}'
```

```json Ответ 200 theme={null}
{
  "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCJ9.signature",
  "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIn0.signature"
}
```

Поле называется `username`, но в него кладётся почта.

## Передать токен

Добавьте заголовок ко всем запросам, кроме получения и обновления токена:

```http theme={null}
Authorization: Bearer <access>
```

## Сколько живут токены

| Токен | Срок | Как обновить |
| - | - | - |
| `access` | 30 дней | новый вход по почте и паролю или `refresh` |
| `refresh` | 1 сутки | только новым входом |

[Обновление](/api-reference/auth/refresh) по `refresh` возвращает новый `access`, но новый `refresh` не выдаёт. Через сутки после входа обновиться уже нельзя, поэтому проще всего так:

1. Храните `access` и время его истечения. Оно лежит в поле `exp` внутри токена (Unix-время в секундах).
2. Когда до `exp` осталось меньше суток или API ответил `401`, получите новую пару по почте и паролю.
3. Повторите исходный запрос один раз с новым токеном.

```python Срок действия токена theme={null}
import base64, json

def token_expires_at(access: str) -> int:
    payload = access.split(".")[1]
    payload += "=" * (-len(payload) % 4)
    return json.loads(base64.urlsafe_b64decode(payload))["exp"]
```

## Ошибки

| Ответ | Тело | Что делать |
| - | - | - |
| `401` при входе | `{"detail": "No active account found with the given credentials"}` | Проверьте почту и пароль |
| `401` | `{"detail": "Authentication credentials were not provided."}` | Добавьте заголовок `Authorization` |
| `401` | `{"detail": "Given token not valid for any token type", "code": "token_not_valid", ...}` | Токен истёк или испорчен: войдите заново |

<Warning>
  Не храните пароль в коде и репозитории. Передавайте его через переменные окружения или хранилище секретов вашей платформы.
</Warning>

<Note>
  Входите в кабинет через Google? У такого аккаунта может не быть пароля. Задайте его на странице [восстановления пароля](https://personal.aigenda.tech/ru/recovery-password), и вход через API заработает.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.