Обменять код на ключ
POST/api/v1/device-auth/token
- Доступ
- Без ключа
Без ключа: доказательство — одноразовый код и PKCE-верификатор. Один раз на код, в течение 5 минут после «Подключить» на сайте. Выдаёт ключ с правами приложения (account:read + content:write) на 365 дней с именем «lacuna для Windows · {компьютер}» и отзывает прежний ключ того же приложения на том же компьютере. Повторный обмен кода отклоняется, а с верным верификатором отзывает и выданный им ключ — если ответ потерялся, подключись заново. До 20 обменов с одного адреса за 10 минут.
Пример запроса
curl -X POST "https://lac.pics/api/v1/device-auth/token" \
-H "Content-Type: application/json" \
-d '{
"code": "Qm3xT7kP9wZ2vL5nR8cB1dF4gH6jK0sA3eY7uI2oM5q",
"verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
}'Тело запроса
application/jsonобязательный
codestringобязательныйтолько в запросеОдноразовый код из адреса возврата в приложение.
шаблон
^[A-Za-z0-9_-]{43}$verifierstringобязательныйтолько в запросеPKCE-верификатор, S256-хеш которого был подтверждён.
шаблон
^[A-Za-z0-9_-]{43,128}$
Ответы
200Готово
DeviceAuthTokentokenstringобязательныйтолько в ответеКлюч API, показывается один раз. Храни его как пароль (в Windows — в диспетчере учётных данных), никогда в адресе или логе.
шаблон
^lac_api_[A-Za-z0-9_-]{43}$keyApiCredentialобязательныйМетаданные ключа.
ApiCredential6 полейidstringобязательныйid файла или заметки.
namestringобязательныйНазвание ключа; у ключа приложения — «lacuna для Windows · {компьютер}».
длина 1–100
scopesмассив stringобязательныйПрава.
значения:
"content:read""content:write""content:delete""account:read"1–4 элементов · без повторов
expiresAtstring · date-timeобязательныйПосле этого момента — 401
API_KEY_EXPIRED. Ключ приложения живёт 365 дней и продлевается сам за 30 дней до конца.clientstringобязательныйили nullПриложение ключа подключения; null — ключ из формы.
значения:
"windows"deviceNamestringобязательныйили nullКомпьютер; null — ключ из формы.
длина 1–128
userobjectобязательныйАккаунт.
1 поле
usernamestringобязательныйНикнейм.
- 413Слишком большой файл или нет места
- 500Сбой на сервере
- 503Сервис занят или недоступен
Пример ответа
{
"token": "lac_api_NEW_KEY_SHOWN_ONCE",
"key": {
"id": "cmf8a1x2k0001q7lh5b2n8r6t",
"name": "Upload script",
"scopes": [
"content:write"
],
"expiresAt": "2026-12-26T09:30:00.000Z",
"client": null,
"deviceName": null
},
"user": {
"username": "alex"
}
}Коды ошибок
| Код | Статус | Текст |
|---|---|---|
DEVICE_AUTH_INVALID | 400 | Код подключения недействителен или устарел. Начни подключение в приложении заново. |
INVALID_JSON | 400 | Не удалось прочитать JSON запроса. |
RATE_LIMITED | 429 | Слишком много запросов. Повтори позже. |