Shotify.

Разработчикам · REST · v4.2

Shotify API: инвентарь в вашем инструменте

RESTful-эндпоинты для поиска, лицензирования и скачивания исходников. Встраивайте 4,2 млн кадров в свой CMS, маркетплейс или редактор — без посредников и без переписки с поддержкой.

  • REST + Webhooks
  • 99,97% аптайм (SLA)
  • SDK: Python · JS · PHP
  • Бесплатно до 10k запросов/мес
SLA99.97
Терминал с ответом REST-запроса к эндпоинту /v2/assets/search
● LIVE api.shotify.com/v2

01 · Обзор API

Три операции — весь инвентарь

Поиск по метаданным, выдача лицензии на конкретный тайм-код или кадр, и скачивание исходника в том качестве, в котором его загрузил автор. Всё под одним bearer-токеном, с предсказуемыми ответами и стабильными контрактами.

Метод Эндпоинт Что делает Лимит
GET /v2/assets/search Поиск по EXIF, тегам, разрешению, формату и автору. Поддерживает фильтрацию по ISO, фокусному расстоянию и тайм-кодам. 100 / мин
GET /v2/assets/{asset_id} Полная карточка актива: превью, EXIF, список лицензий, история версий и права автора. 300 / мин
POST /v2/licenses Создание лицензии Standard / Extended / Buyout. Возвращает PDF-договор и срок действия. 50 / мин
GET /v2/assets/{asset_id}/download Подписанный URL на скачивание RAW / ProRes / 8K. Ссылка живёт 15 минут. 25 / мин
POST /v2/webhooks Регистрация подписки на события: новые активы, продажи, отмены, истечение лицензий. 10 / мин
GET /v2/auth/usage Текущий счётчик запросов, остаток тарифа и прогноз по концу месяца.

Аутентификация — Authorization: Bearer <api_key>. Ключи генерируются в кабинете и имеют отдельные права: read, license, download, admin. Все ответы — JSON, ошибки — с кодом error.code и человекочитаемым error.message.

02 · Документация

Три языка, один и тот же ответ

Официальные SDK для Python, Node.js и PHP. Ниже — минимальный пример: поиск RAW-кадров с ISO 100 и выдача ссылки на скачивание. Работает из коробки, без сборки и без «примерно».

PYTHON · 3.10+

shotify-python

pip install shotify-sdk · 4,1k звёзд · типизация Pydantic, асинхронный клиент на httpx.

search.py
from shotify import Client

# ключ из .env
api = Client(token="sh_live_...")

hits = api.assets.search(
    format="RAW",
    iso=100,
    author="dmitry-volkov",
    limit=20,
)
for a in hits:
    print(a.id, a.resolution)
NODE.JS · 18+

@shotify/node

npm i @shotify/node · нативный fetch, стриминг больших исходников, retry с backoff.

license.mjs
import { Shotify } from "@shotify/node";

const s = new Shotify({ token: process.env.SHOTIFY_KEY });

const lic = await s.licenses.create({
  assetId: "AS-88231",
  tier:    "Extended",
  term:    "24m",
});

console.log(lic.pdf_url);
PHP · 8.1+

shotify/php

composer require shotify/php · PSR-18, события-объекты, интеграция с Laravel и Symfony.

download.php
<?php
use Shotify\Client;

$client = new Client('sh_live_...');

$url = $client->assets()
    ->download('AS-88231', 'RAW');

// подписанный URL, 15 минут
echo $url;

03 · Webhooks

События приходят сами — не опрашивайте

Shotify отправляет подписанный POST-запрос на ваш endpoint в момент события. Подпись — HMAC-SHA256, таймстемп в заголовке X-Shotify-Timestamp. Повторная доставка — до 24 часов при 5xx.

Событие Когда срабатывает Поле в payload
asset.created Автор загрузил новый RAW / ProRes файл и он прошёл модерацию. data.asset.id, data.asset.format
asset.updated Изменены метаданные, тег или превью уже опубликованного актива. data.asset.id, data.changes[]
sale.completed Покупатель оплатил лицензию. Сумма и уровень лицензии — в payload. data.license.tier, data.amount_cents
license.expiring За 7 дней до истечения срока действия лицензии. data.license.expires_at
download.issued Выдана подписанная ссылка на скачивание исходника. data.download.url, data.download.ttl
author.payout Формирование выплаты автору за расчётный период. data.payout.total_cents, data.period

Каждый webhook подписывается ключом whsec_... из панели. Пример проверки в Node:

webhook.mjs
import crypto from "node:crypto";

export function verifyShotify(body, sig, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(body)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(sig), Buffer.from(expected)
  );
}
99,97%
аптайм за последние 12 мес
42ms
p50 задержка на /search
1 800
команд с активным ключом
3
официальных SDK

04 · Тарифы API

Бесплатно для соло, по-честному для платформ

Никакой «бесплатно только 7 дней». Индивидуальный фотограф получает 10 000 запросов в месяц без карты. Агрегаторам — предсказуемые объёмы и фиксированный SLA.

Расчёт нагрузки →
Тариф Цена Запросы / мес Webhooks SLA Поддержка
Individual 0 ₽ 10 000 1 подписка Форум
Studio 4 900 ₽ 150 000 5 подписок 99,5% Email, 24 ч
Agency 19 900 ₽ 1 000 000 25 подписок 99,9% Приоритет, 4 ч
Platform от 89 000 ₽ по запросу безлимит 99,97% Персональный инженер

Превышение лимита — не блокировка, а плавный 429 с заголовком Retry-After. Доплатить за сверхлимит можно по факту, без перезаключения договора. Все тарифы — без скрытых платежей за скачивания: скачивание исходника не считается отдельным запросом.

05 · Сообщество

Код, который читают до нас

SDK, примеры и песочница — открыты. Если нашли баг в документации или написали свой пример — PR приветствуется. Ответы от команды — в течение суток.

GITHUB

github.com/shotify

Организация с 4,3k звёзд: shotify-python, @shotify/node, shotify/php, openapi-спецификация и sandbox-примеры. MIT-лицензия.

Открыть репозитории
FORUM

forum.shotify.com/dev

Раздел для разработчиков: 12 400 тем, медиана ответа — 3 ч 12 мин. Модерация от команды API, без «напишите в поддержку».

Перейти на форум
CHANGELOG

changelog.shotify.com

Публичный журнал изменений API. Breaking changes — только с предупреждением за 60 дней и отдельным тегом в GitHub.

Последние релизы

Сделайте первый запрос

Ключ в песочнице — за 2 минуты

Зарегистрируйтесь, получите тестовый ключ sh_test_... и 500 запросов в песочнице. Никакой карты, никакого «мы вернёмся с предложением».

Вопросы разработчиков

Что спрашивают чаще всего

Да. Эндпоинт /v2/assets/{id}/download возвращает подписанный URL на S3-совместимый хранилище. Поддерживаются Range-запросы, так что клиент может докачивать прерванную передачу. Максимальный размер файла — 25 ГБ.

Курсорная, через параметр after_id. Размер страницы — до 100 записей. Ответ содержит next_cursor; передайте его в следующий запрос. Никаких offset/skip — курсор стабильный, даже если в каталоге появляются новые кадры между запросами.

Shotify повторит доставку с экспоненциальным backoff: 30 с, 2 мин, 10 мин, 1 ч, 6 ч, 12 ч, 24 ч. После 24 часов событие помечается как failed и попадает в панель, где можно вручную перезапустить. Все события хранятся 30 дней.

Да, 25 подписанных URL в минуту на ключ. Это защита от перебора. Для больших пакетов используйте параметр batch в /v2/licenses — лицензия на 500 кадров создаётся одним вызовом, и ссылки выдаются по отдельности.

Без переключения ключей. В кабинете выберите новый тариф — лимиты и SLA применятся с начала расчётного периода, текущий ключ продолжит работать. Разница доплачивается пропорционально. Откат на предыдущий тариф — в любой момент до конца периода.

Да. В карточке актива поле exif содержит ISO, выдержку, диафрагму, фокусное расстояние и серийный номер камеры. Для видео — тайм-коды по сценам в формате HH:MM:SS:FF, привязанные к кадрам. Формат ответа — JSON, без бинарных Blobs.