SneakDeak API Справочник методов Получить ключ

API SneakDeak v1

Публикация файлов от имени вашего SDA-аккаунта: приложение загружает файл и сразу получает прямую ссылку. Базовый адрес — https://api.sneakdeak.net.

Ключ

Ключи выдаются на https://creator.sneakdeak.net: вход в SDA-аккаунт, «Создать ключ», подтверждение кода компании, название приложения. Код компании именной и одноразовый — его выдаёт команда SneakDeak под конкретный логин.

Ключ выглядит так и показывается ровно один раз:

sda_3f9a21c7_kQ8s...   (в базе хранится только sha256)
Ключ действует от имени вашего аккаунта: файлы, загруженные по нему, принадлежат вам и видны в Умном загрузчике. Отзыв ключа в портале действует мгновенно.

Авторизация

Authorization: Bearer sda_3f9a21c7_kQ8s...

Без заголовка или с отозванным ключом — 401.

Методы

GET/v1/me Кто вы: логин, компания, статус разработчика.
GET/v1/files Все ваши файлы: слаг, имя, размер, число скачиваний, ссылка.
POST/v1/files Публикация. multipart/form-data, поле file. Предел — 5.0 ГБ.
DELETE/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. Все прочие ключи — служебные данные приложения, они пишутся и читаются без спроса.
GET/v1/data Список ключей с датами изменения.
GET/v1/data/{key} Прочитать запись.
PUT/v1/data/{key} Записать JSON-тело.
DELETE/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 у себя и меняет их на токен одним запросом.

Пользователь отдаёт приложению свой пароль от SDA, поэтому включается тихий вход двумя ключами сразу: команда SneakDeak отмечает приложение проверенным с консоли, после чего разработчик включает галочку «тихий вход» в карточке приложения. Для сторонних приложений режим недоступен.
POST/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.

GET/v1/db Схема: таблицы, колонки, типы.
GET/v1/db/{table} Записи пользователя с фильтрами, сортировкой и постраничностью.
POST/v1/db/{table} Создать запись.
PATCH/v1/db/{table}/{id} Изменить поля записи.
DELETE/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-токена, ограничения частоты вызовов, квот на пользователя и срока жизни файлов.