saveapi.org
Документация

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

Один base URL, bearer-авторизация, JSON в каждом ответе. В продакшене за десять минут.

base urlhttps://api.saveapi.org/v1

Один GET на ссылку. Отправьте любую публичную ссылку на пост в /v1/download и читайте medias[] — каждая запись это прямая ссылка на файл в CDN самого источника, в том же ответе. Ни второго запроса, ни параметра формата: там, где источник отдаёт несколько готовых вариантов, все они приходят вместе в formats[].

STEP 01
Создайте ключ
Зарегистрируйтесь и скопируйте sk_live_… из панели. Бесплатный тариф начинается с 1,000 кредитов.
STEP 02
Отправьте одну ссылку
Вызовите /v1/download с любым поддерживаемым URL. Платформа определяется автоматически.
STEP 03
Прочитайте medias[]
Возьмите первый элемент для лучшего качества или отфильтруйте по ext и size_mb.
Первый запрос
curl -s -G "https://api.saveapi.org/v1/download" \
  -H "Authorization: Bearer sk_live_xxxx" \
  --data-urlencode "url=https://www.tiktok.com/@zachking/video/6768504823336815877"

Официальные SDK

Лёгкие клиенты для Python и JavaScript/TypeScript: те же эндпоинты и форма ответа, с типами; ошибки приходят как SaveAPIError со стабильным кодом. Повторяется только то, что может помочь повтор — UPSTREAM_TIMEOUT, UPSTREAM_ERROR и RATE_LIMITED после Retry-After; приватные, удалённые и неподдерживаемые ссылки — никогда.

Python 3.9+pip install saveapiPyPIGitHub
JavaScript / TypeScriptnpm install saveapinpmGitHub
Python
from saveapi import SaveAPI, SaveAPIError

api = SaveAPI("sk_live_...")  # or set SAVEAPI_KEY

try:
    post = api.download("https://www.tiktok.com/@zachking/video/6768504823336815877")
    print(post["medias"][0]["url"])
except SaveAPIError as error:
    print(error.code)  # PRIVATE_CONTENT, MEDIA_NOT_FOUND, ...
JavaScript
import { SaveAPI, SaveAPIError } from "saveapi";

const api = new SaveAPI({ apiKey: "sk_live_..." }); // or SAVEAPI_KEY

try {
  const post = await api.download("https://www.tiktok.com/@zachking/video/6768504823336815877");
  console.log(post.medias[0].url);
} catch (error) {
  if (error instanceof SaveAPIError) console.log(error.code);
}

Лицензия MIT, с примерами Telegram-бота и скачивания файла: github.com/akhroruz/saveapi-sdk

Кредиты за запрос

Каждый endpoint говорит свою цену до вызова. Загрузки тарифицируются за успешный результат; всё остальное бесплатно.

Core API
Пост или reel Instagram1.5 кредита
Истории Instagram5 кредитов
Профиль Instagram3 кредита
TikTok, Facebook, X (Twitter), Pinterest, Likee1.5 кредита
Snapchat, Threads, VK, 9GAG, Twitch1.5 кредита
RuTube3 кредита
Twitch VOD3 кредита
Отказ источника0.1 кредита
YouTube API
Информация о видео2 кредита
Ссылка на скачивание10 кредитов
Ссылка на аудио (mp3, m4a)10 кредитов
Отказ источника0.1 кредита
Аккаунт
Определение ссылкибесплатно
Список платформбесплатно
Баланс / статистикабесплатно

Тысяча кредитов стоит $0.09 на Pro и $0.066 на Mega — доля цента за обычную загрузку.

Точная сумма приходит в каждом ответе в credits.spent, а остаток — в заголовке X-Credits-Remaining. Вести свой учёт не нужно.

Коды ошибок

Каждая ошибка приходит в одном и том же конверте. Ветвитесь по code, а не по message — текст может меняться, коды нет.

СтатусКодЗначение
400INVALID_URLПараметр url отсутствует, повреждён или не является ссылкой на пост.
400UNSUPPORTED_PLATFORMСсылка не относится ни к одной поддерживаемой платформе. Сначала вызовите /v1/detect.
401MISSING_API_KEYКлюч не передан. Используйте Authorization: Bearer или заголовок X-API-Key.
401INVALID_API_KEYКлюч повреждён или неизвестен.
403KEY_REVOKEDЭтот ключ отозван в кабинете. Создайте новый.
403KEY_EXPIREDУ ключа был срок действия, и он истёк.
403ACCOUNT_SUSPENDEDАккаунт владельца ключа приостановлен. Напишите в поддержку.
403IP_NOT_ALLOWEDУ ключа есть белый список IP, а запрос пришёл с другого адреса.
403PLATFORM_NOT_ALLOWEDВаш тариф не включает эту платформу.
403PRIVATE_CONTENTПост закрытый. Стоит 0.1 кредита.
400INVALID_FORMATЗапрошенное качество неизвестно или у этого видео его нет. Смотрите formats[] в /v1/youtube/info.
404MEDIA_NOT_FOUNDПост удалён, ограничен или не содержит медиа. Стоит 0.1 кредита.
410LINK_EXPIREDСрок ссылки из /v1/youtube/create истёк. Запросите новую тем же вызовом.
429RATE_LIMITEDСлишком много запросов в эту минуту. Смотрите заголовок Retry-After.
429QUOTA_EXCEEDEDБаланс кредитов пуст. Кредиты покупаются пакетами и не обновляются ежемесячно — баланс приходит в X-Credits-Remaining в каждом ответе.
502UPSTREAM_ERRORПлатформа-источник не ответила. Не тарифицируется. Можно повторить.
504UPSTREAM_TIMEOUTИсточник отвечал слишком долго. Не тарифицируется. Можно повторить.
500INTERNAL_ERRORЧто-то сломалось на нашей стороне. Не тарифицируется.
JSON
{
  "success": false,
  "error": {
    "code": "INVALID_URL",
    "message": "The url must be a public http(s) link to a post"
  }
}

Эндпоинты

Выберите эндпоинт слева. Каждый — обычный GET с ключом в заголовке: без опроса статуса и без job id.

GET

/v1/download

от 1.5 кредита
описание

Возвращает прямые медиа-URL, а также метаданные автора и подписи.

Параметры запроса
urlобязательныйstring
Публичная ссылка. Должна быть URL-кодированной.
limit_mbнеобязательныйnumber
Ограничение размера возвращаемого медиа. Работает только на платформах с вариантами.
full_metaнеобязательныйboolean
Instagram: дополнительно вернуть лайки, комментарии, место, оригинальный звук и галочку верификации (+~0.3 с). Остальные платформы и так отдают полную мету — там игнорируется.
примеры кода
cURL
curl -s -G "https://api.saveapi.org/v1/download" \
  -H "Authorization: Bearer sk_live_xxxx" \
  --data-urlencode "url=https://www.tiktok.com/@zachking/video/6768504823336815877"
пример ответа
200 · application/json
{
  "success": true,
  "platform": "tiktok",
  "type": "video",
  "source_url": "https://www.tiktok.com/@zachking/video/6768504823336815877",
  "video_id": "6768504823336815877",

  "medias": [
    {
      "type": "video",
      "url": "https://v16m.tiktokcdn-us.com/...",
      "ext": "mp4",
      "quality": null,
      "width": 0,
      "height": 0,
      "size_mb": 4.19,
      "watermark": false
    }
  ],

  "music": {
    "type": "audio",
    "url": "https://v16-ies-music.tiktokcdn-us.com/...",
    "ext": "mp3",
    "quality": null,
    "width": 0,
    "height": 0,
    "size_mb": null,
    "watermark": null
  },
  "meta": {
    "title": "They rejected my application to Hogwarts but I still found a way to be a wizard. 🧹#illusion #magic #harrypotter",
    "text": "They rejected my application to Hogwarts but I still found a way to be a wizard. 🧹#illusion #magic #harrypotter",
    "author": "Zach King",
    "author_url": "https://www.tiktok.com/@zachking",
    "thumbnail": "https://p19-common-sign.tiktokcdn-us.com/...",
    "duration": 18,
    "views": 2382320428,
    "published_at": 1575915337,
    "username": "zachking",
    "author_avatar": "https://p16-common-sign.tiktokcdn-us.com/...",
    "author_verified": null,
    "likes": 63400000,
    "comments": 296700,
    "shares": 2400000,
    "saves": 1900000,
    "location": null,
    "region": "US",
    "music": {
      "title": "original sound",
      "author": "Zach King",
      "duration": 18,
      "cover": "https://p16-common-sign.tiktokcdn-us.com/...",
      "original": true
    }
  },
  "formats": [
    { "format": "nowm", "label": "No watermark",     "type": "video", "size_mb": 4.19, "exact": true, "watermark": false, "url": "https://v16m.tiktokcdn-us.com/..." },
    { "format": "hd",   "label": "HD, no watermark", "type": "video", "size_mb": 3.0,  "exact": true, "watermark": false, "url": "https://v16-notes.tiktokcdn-us.com/..." },
    { "format": "wm",   "label": "With watermark",   "type": "video", "size_mb": 4.25, "exact": true, "watermark": true,  "url": "https://v16m.tiktokcdn-us.com/..." },
    { "format": "mp3",  "label": "Audio (mp3)",      "type": "audio", "size_mb": null, "exact": false, "url": "https://v16-ies-music.tiktokcdn-us.com/..." }
  ],
  "recommended_format": "nowm",
  "credits": { "spent": 1.5, "remaining": 99988.5 }
}
API playground
Проверьте API прямо из браузера — настоящие запросы, настоящие кредиты.
GET https://api.saveapi.org/v1/download?url=https%3A%2F%2Fwww.tiktok.com%2F%40zachking%2Fvideo%2F6768504823336815877
Чтобы отправить запрос, вставьте API-ключ в панель сверхустоимость от 1.5 кредита
сгенерированный код
cURL
curl -s -G "https://api.saveapi.org/v1/download" \
  -H "Authorization: Bearer sk_live_xxxx" \
  --data-urlencode "url=https://www.tiktok.com/@zachking/video/6768504823336815877"
СПРАВОЧНИК

Авторизация

Каждый запрос несёт секретный ключ в заголовке Authorization. Ключи не истекают, но их можно отозвать и перевыпустить в любой момент.

HTTP
Authorization: Bearer sk_live_xxxxxxxxxxxx

Для клиентов, которые не могут задать заголовок Authorization, принимается и X-API-Key: sk_live_….

Держите ключ на сервере. Любой, у кого он есть, может тратить ваши кредиты. Если ключ утёк — отзовите его в кабинете и создайте новый, отзыв срабатывает мгновенно.
СПРАВОЧНИК

Ответ

Каждый успешный запрос возвращает одну и ту же структуру. В medias[] лежат прямые файлы — всегда хотя бы один, несколько для карусели. В meta приходят заголовок, автор, обложка и длительность, если источник их публикует, а credits показывает стоимость запроса и остаток.

JSON
{
  "success": true,
  "platform": "tiktok",
  "type": "video",
  "source_url": "https://www.tiktok.com/@zachking/video/6768504823336815877",
  "video_id": "6768504823336815877",

  "medias": [
    {
      "type": "video",
      "url": "https://v16m.tiktokcdn-us.com/...",
      "ext": "mp4",
      "quality": null,
      "width": 0,
      "height": 0,
      "size_mb": 4.19,
      "watermark": false
    }
  ],

  "music": {
    "type": "audio",
    "url": "https://v16-ies-music.tiktokcdn-us.com/...",
    "ext": "mp3",
    "quality": null,
    "width": 0,
    "height": 0,
    "size_mb": null,
    "watermark": null
  },
  "meta": {
    "title": "They rejected my application to Hogwarts but I still found a way to be a wizard. 🧹#illusion #magic #harrypotter",
    "text": "They rejected my application to Hogwarts but I still found a way to be a wizard. 🧹#illusion #magic #harrypotter",
    "author": "Zach King",
    "author_url": "https://www.tiktok.com/@zachking",
    "thumbnail": "https://p19-common-sign.tiktokcdn-us.com/...",
    "duration": 18,
    "views": 2382320428,
    "published_at": 1575915337,
    "username": "zachking",
    "author_avatar": "https://p16-common-sign.tiktokcdn-us.com/...",
    "author_verified": null,
    "likes": 63400000,
    "comments": 296700,
    "shares": 2400000,
    "saves": 1900000,
    "location": null,
    "region": "US",
    "music": {
      "title": "original sound",
      "author": "Zach King",
      "duration": 18,
      "cover": "https://p16-common-sign.tiktokcdn-us.com/...",
      "original": true
    }
  },
  "formats": [
    { "format": "nowm", "label": "No watermark",     "type": "video", "size_mb": 4.19, "exact": true, "watermark": false, "url": "https://v16m.tiktokcdn-us.com/..." },
    { "format": "hd",   "label": "HD, no watermark", "type": "video", "size_mb": 3.0,  "exact": true, "watermark": false, "url": "https://v16-notes.tiktokcdn-us.com/..." },
    { "format": "wm",   "label": "With watermark",   "type": "video", "size_mb": 4.25, "exact": true, "watermark": true,  "url": "https://v16m.tiktokcdn-us.com/..." },
    { "format": "mp3",  "label": "Audio (mp3)",      "type": "audio", "size_mb": null, "exact": false, "url": "https://v16-ies-music.tiktokcdn-us.com/..." }
  ],
  "recommended_format": "nowm",
  "credits": { "spent": 1.5, "remaining": 99988.5 }
}

Один ключ есть не всегда. formats[] появляется только там, где источник сам отдаёт несколько готовых вариантов — сегодня это VK, TikTok и Likee — и в каждой записи лежит прямая ссылка и точный размер, так что нужный вариант вы выбираете у себя. Второго запроса и параметра формата нет. На остальных платформах ключа просто нет, и ответом служит medias[]:

JSON
"formats": [
  { "format": "mp4_144",  "label": "144p",  "type": "video", "size_mb": 0.76,  "url": "https://..." },
  { "format": "mp4_480",  "label": "480p",  "type": "video", "size_mb": 7.9,   "url": "https://..." },
  { "format": "mp4_1080", "label": "1080p", "type": "video", "size_mb": 36.37, "url": "https://..." }
],
"recommended_format": "mp4_1080"

Заголовки ответа

В каждом ответе есть ваш тариф, остаток баланса и окно rate limit. Читайте X-Credits-Remaining, чтобы предупредить себя до того, как кредиты кончатся.

HTTP
X-Plan: pro
X-Credits-Remaining: 99988
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
СПРАВОЧНИК

Rate limit

Лимит на ключ, в минуту. У каждого ключа свой лимит — если один сервис горячее другого, разведите трафик по ключам.

ТарифЛимит
Free10 / мин
Pro60 / мин
Ultra250 / мин
Mega900 / мин

При превышении приходит 429 RATE_LIMITED с заголовком Retry-After — подождите столько секунд и отправьте снова. Отклонённые вызовы не списываются.

HTTP
HTTP/1.1 429 Too Many Requests
Retry-After: 23
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
СПРАВОЧНИК

Кредиты и оплата

Успешная загрузка стоит 1.5 кредита — история Instagram 5, Rutube 3, потому что обе обходятся нам дороже. Остальные endpoint'ы бесплатны. Кредиты покупаются пакетами и действуют 30 дней с покупки. Бесплатные 1 000 при регистрации не сгорают.

EndpointСтоимость
GET /v1/downloadот 1.5 кредита
GET /v1/{platform}от 1.5 кредита
GET /v1/youtube/info2 кредита
GET /v1/youtube/create10 кредитов
GET /v1/instagram/profile3 кредита
GET /v1/detectбесплатно
GET /v1/platformsбесплатно
GET /v1/meбесплатно
GET /v1/usageбесплатно

Ссылка, в которой источник отказал — закрытая, удалённая или без медиа, — стоит 0.1 кредита: поиск был сделан и вернулся пустым. Всё остальное бесплатно: битые ссылки, неподдерживаемые сайты, лимиты, таймауты источника и наши собственные ошибки.

Тарифы

Списываем за каждый запрос: загрузка 1.5 кредита, история Instagram 5, Rutube 3. Ссылка, в которой источник отказал — закрытая или удалённая, — 0.1. Платные кредиты действуют 30 дней с момента покупки.

ТарифЦенаКредитыСкоростьСрок
Pro$9100,00060 / мин30 дней
Ultra$39500,000250 / мин30 дней
Mega$991,500,000900 / мин30 дней

Полные цены и покупка →

Застряли или чего-то не хватает?