API SneakDeak v1
Публикация файлов от имени вашего SDA-аккаунта: приложение загружает файл и сразу
получает прямую ссылку. Базовый адрес — https://api.sneakdeak.net.
Ключ
Ключи выдаются на https://creator.sneakdeak.net: вход в SDA-аккаунт, «Создать ключ», подтверждение кода компании, название приложения. Код компании именной и одноразовый — его выдаёт команда SneakDeak под конкретный логин.
Ключ выглядит так и показывается ровно один раз:
sda_3f9a21c7_kQ8s... (в базе хранится только sha256)
Авторизация
Authorization: Bearer sda_3f9a21c7_kQ8s...
Без заголовка или с отозванным ключом — 401.
Методы
/v1/me
Кто вы: логин, компания, статус разработчика.
/v1/files
Все ваши файлы: слаг, имя, размер, число скачиваний, ссылка.
/v1/files
Публикация. multipart/form-data, поле file. Предел — 5.0 ГБ.
/v1/files/{slug}
Удаление файла и ссылки. Чужой слаг — 404.
GET /v1/me
curl -H "Authorization: Bearer $KEY" https://api.sneakdeak.net/v1/me
{
"username": "heyword",
"company": "SneakDeak Technologies",
"is_dev": true
}
POST /v1/files
curl -H "Authorization: Bearer $KEY" \
-F "file=@build.apk" \
https://api.sneakdeak.net/v1/files
{
"slug": "build_14092026.apk",
"url": "https://dwnl.sneakdeak.net/build_14092026.apk",
"size": "18.4 МБ",
"bytes": 19293798
}
Слаг собирается из имени файла и даты публикации: имя_ДДММГГГГ.расширение.
При совпадении добавляется -2. Ссылка отдаёт файл сразу, без промежуточной страницы.
GET /v1/files
curl -H "Authorization: Bearer $KEY" https://api.sneakdeak.net/v1/files
{
"files": [
{
"slug": "build_14092026.apk",
"name": "build.apk",
"size": "18.4 МБ",
"bytes": 19293798,
"downloads": 12,
"created_at": "2026-09-14",
"url": "https://dwnl.sneakdeak.net/build_14092026.apk"
}
]
}
DELETE /v1/files/{slug}
curl -X DELETE -H "Authorization: Bearer $KEY" \
https://api.sneakdeak.net/v1/files/build_14092026.apk
{"deleted": "build_14092026.apk"}
Вход пользователей через SDA
Приложение не заводит собственные пароли: человек входит своим SDA-аккаунтом, а сервис получает токен от его имени. Схема — authorization code.
Шаг 1. Приложение и его сервисы
На https://creator.sneakdeak.net → «Приложения» создаёте приложение
и получаете client_id и client_secret (секрет показывается один раз).
Дальше описываете, что приложение спрашивает у пользователя: системные разрешения SDA
(по умолчанию выключены) и собственные поля, которые вы придумываете сами —
контакты, история, статус, что угодно. Галочка «обязателен» ставит рядом с пунктом «!»
в окне согласия.
Там же задаются адреса возврата: redirect_uri должен совпасть точно.
Шаг 2. Отправляете пользователя на согласие
https://account.sneakdeak.net/authorize
?client_id=sdapp_...
&redirect_uri=https://ваш-сервис/callback
&scope=profile,contacts,storage
&state=случайная-строка
Человек видит окно «Вы хотите предоставить сервису … доступ к вашему аккаунту SneakDeak?»
со списком пунктов и галочками. Обязательные помечены «!» — снять их можно,
но рядом написано, что сервис может не работать. Ответ «Нет» вернёт
?error=access_denied.
Если согласие уже дано, окно не показывается: пользователь сразу возвращается с кодом.
Шаг 3. Меняете код на токен
curl -X POST https://api.sneakdeak.net/v1/oauth/token \
-F client_id=sdapp_... \
-F client_secret=sdcs_... \
-F code=... \
-F redirect_uri=https://ваш-сервис/callback
{
"access_token": "sdat_53e1ef09_...",
"token_type": "Bearer",
"scope": "profile,storage",
"user": {"id": 7, "username": "petya"}
}
Код одноразовый и живёт 5 минут. Поле scope — то, что человек реально
оставил включённым: сверяйтесь с ним, а не с тем, что запрашивали.
Разрешения
Системные — то, что даёт сама SDA:
profileЛогин и дата регистрации в SneakDeak |
Профиль |
files.readСписок файлов, опубликованных в Умном загрузчике |
Чтение файлов |
files.writeЗагрузка новых файлов от вашего имени |
Публикация файлов |
Свои поля
Остальные пункты приложение описывает само: ключ, название и пояснение, которые увидит
пользователь. Например contacts — «Контакты», history —
«История переписки». Ключ поля одновременно служит ключом записи в базе.
В scope при переходе на /authorize перечисляются и системные
разрешения, и свои ключи. Параметр можно вообще не передавать — тогда спросим всё,
что объявлено в приложении.
Вызов без нужного разрешения возвращает 403 с текстом
Нет разрешения <ключ>.
Простое хранилище ключ-значение
Она доступна сразу, отдельного разрешения не требует: приложение может перенести свои данные о пользователе в SDA и не держать собственную базу. Записи хранятся парой «приложение + пользователь», значение — любой JSON до 1 МБ.
/v1/data/contacts отдают 403.
Все прочие ключи — служебные данные приложения, они пишутся и читаются без спроса.
/v1/data
Список ключей с датами изменения./v1/data/{key}
Прочитать запись./v1/data/{key}
Записать JSON-тело./v1/data/{key}
Удалить запись.curl -X PUT -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"skype_name":"petya2003","mood":"Hello"}' \
https://api.sneakdeak.net/v1/data/profile
curl -H "Authorization: Bearer $TOKEN" https://api.sneakdeak.net/v1/data/contacts
/v1/data/profile
и /v1/data/contacts и восстанавливает состояние. Вход неудачный или доступ
отозван — 401, показывайте экран входа заново.
Тихий вход
Для своих приложений окно разрешений можно не показывать вовсе: приложение принимает логин и пароль SneakDeak у себя и меняет их на токен одним запросом.
/v1/oauth/password
Логин и пароль SDA сразу на токен. Basic client_id:client_secret.curl -X POST -u "$CLIENT_ID:$CLIENT_SECRET" \
-F username=petya -F password=... \
https://api.sneakdeak.net/v1/oauth/password
{
"ok": true,
"access_token": "sdat_…",
"scope": "contacts,profile",
"user": {"id": 7, "username": "petya"}
}
Выдаются все пункты, объявленные в приложении: отдельного согласия здесь нет.
Неверный пароль и несуществующий логин дают одинаковый ответ 401
с телом {"ok": false}. После пяти промахов подряд по одной паре
приложение+логин включается пауза на 10 минут (429).
В аккаунте такой доступ виден как обычный сервис с пометкой «вход без окна подтверждения» и отзывается там же.
Клиенты, присылающие MD5
Skype 1.x и подобные считают MD5(пароль) прямо в своей форме входа.
Для них тот же метод принимает password_md5 вместо password:
curl -X POST -u "$CLIENT_ID:$CLIENT_SECRET" \ -F username=petya -F password_md5=5f4dcc3b5aa765d61d8327deb882cf99 \ https://api.sneakdeak.net/v1/oauth/password
MD5 остаётся только на проводе: в базе хранится scrypt(MD5(пароль))
со случайной солью. Верификатор заводится при регистрации, смене пароля и первом
входе на сайте. Пользователь может закрыть этот путь в аккаунте — тогда придёт
401, а обычный вход продолжит работать.
Таблицы приложения
В creator → «Конструктор базы» описываете таблицы и колонки: ключ, название, тип, обязательность. Галочка «спрашивать разрешение» добавляет таблицу в окно согласия — без неё таблица доступна любому токену приложения.
Типы колонок: text, number, bool,
datetime (ISO 8601), json. Значения проверяются на входе:
лишние поля и неверный тип возвращают 400.
/v1/db
Схема: таблицы, колонки, типы./v1/db/{table}
Записи пользователя с фильтрами, сортировкой и постраничностью./v1/db/{table}
Создать запись./v1/db/{table}/{id}
Изменить поля записи./v1/db/{table}/{id}
Удалить запись.Запросы
Фильтр — это имя колонки в строке запроса, значение сверяется точным совпадением.
# все контакты curl -H "Authorization: Bearer $TOKEN" https://api.sneakdeak.net/v1/db/contacts # только незаблокированные, по алфавиту, первые 20 curl -H "Authorization: Bearer $TOKEN" \ "https://api.sneakdeak.net/v1/db/contacts?blocked=false&order=skype_name&limit=20" # конкретный контакт curl -H "Authorization: Bearer $TOKEN" \ "https://api.sneakdeak.net/v1/db/contacts?skype_name=masha"
Параметры limit (до 500), offset, order,
desc=1. Ответ: {"total": N, "records": [...]}, у каждой записи
свои id, created_at, updated_at.
Запись
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"skype_name":"kolya","display":"Коля","blocked":false}' \
https://api.sneakdeak.net/v1/db/contacts
curl -X PATCH -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"blocked":true}' \
https://api.sneakdeak.net/v1/db/contacts/1
Повторный показ окна разрешений
Если человек снял нужный пункт, сервис может попросить показать окно ещё раз — не раньше чем через 20 секунд.
curl -X POST https://api.sneakdeak.net/v1/oauth/retry \
-F client_id=sdapp_... -F client_secret=sdcs_... -F username=petya
{"ok": true, "attempts_left": 2, "authorize_url": "https://account.sneakdeak.net/authorize"}
Всего показов 4: первый плюс три повтора. Дальше приходит
429 и работать нужно с тем, что дали. После следующего перехода на
/authorize окно появится снова.
Отзыв доступа
Менять разрешения после согласия можно только в аккаунте:
https://account.sneakdeak.net/services → нужный сервис →
«Разрешения». Там же кнопка отзыва: удаляются разрешения, все токены и
вся база сервиса об этом пользователе — записи /v1/data стираются
безвозвратно. Токены после этого отвечают 401.
Коды ответов
200 / 201 | успех; 201 — файл создан |
401 | нет заголовка, ключ или токен неверен, доступ отозван |
403 | нет нужного разрешения |
404 | файл не найден или принадлежит другому аккаунту |
413 | файл больше 5.0 ГБ |
422 | не передано поле file |
429 | повтор окна разрешений слишком рано или показы исчерпаны |
Ошибки приходят как {"detail": "текст"}.
Примеры
Python
import requests
KEY = "sda_..."
head = {"Authorization": f"Bearer {KEY}"}
with open("build.apk", "rb") as f:
r = requests.post("https://api.sneakdeak.net/v1/files", headers=head, files={"file": f})
r.raise_for_status()
print(r.json()["url"])
JavaScript
const fd = new FormData();
fd.append("file", file);
const r = await fetch("https://api.sneakdeak.net/v1/files", {
method: "POST",
headers: { Authorization: `Bearer ${KEY}` },
body: fd,
});
const { url } = await r.json();
Bash: публикация сборки из CI
URL=$(curl -sf -H "Authorization: Bearer $SDA_KEY" \
-F "file=@dist/app.zip" \
https://api.sneakdeak.net/v1/files | jq -r .url)
echo "Сборка доступна: $URL"
Два вида предъявителя
sda_...личный ключ разработчика |
все права владельца ключа |
sdat_...токен приложения |
права по разрешениям пользователя |
Чего пока нет
Регистрации аккаунтов через API: люди заводятся только на https://account.sneakdeak.net, приложение не может создать аккаунт за человека. Нет обновляемых refresh-токенов и срока жизни у access-токена, ограничения частоты вызовов, квот на пользователя и срока жизни файлов.