OneSaveAPI

Скачивание и уникализация видео — одним запросом

Download and uniquify videos — with one request

Те же движки, что у бота @One_Savebot: прямые ссылки на файлы, метаданные поста, до 10 уникальных версий ролика и варианты подписей. Оплата — Telegram Stars, без карт и договоров.

The same engines as the @One_Savebot bot: direct file links, post metadata, up to 10 unique versions of a video and caption variants. Pay with Telegram Stars, no cards or contracts.

InstagramTikTokYouTubeVK ОдноклассникиOK.ruPinterestRuTube Mail.ru1TVSoundCloud

Быстрый старт

Quick start

1 Откройте /api в ботеOpen /api in the bot

В @One_Savebot отправьте команду /api — это ваш личный кабинет.

Send /api to @One_Savebot — that is your account page.

2 Создайте токенCreate a token

Кнопка «Создать токен». Токен начинается с sb_. Его можно перевыпустить или отозвать в любой момент.

Tap “Create token”. Tokens start with sb_. You can rotate or revoke it at any time.

3 Пополните балансTop up your balance

Кнопка «Пополнить баланс» — счёт в Telegram Stars прямо в чате. Звёзды списываются по мере запросов.

Tap “Top up balance” — a Telegram Stars invoice right in the chat. Stars are deducted as you make requests.

Первый запрос

Your first request

# скачать пост и получить прямые ссылки на файлыdownload a post and get direct file links
curl -X POST https://api.savebot.pro/download \
  -H "Authorization: Bearer sb_ВАШ_ТОКЕН" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.instagram.com/reel/XXXXXXXX/"}'

Базовый адрес — https://api.savebot.pro. Все ответы в JSON, кодировка UTF-8. Интерактивная схема (Swagger) — на api.savebot.pro/docs.

Base URL — https://api.savebot.pro. All responses are JSON, UTF-8. The interactive schema (Swagger) lives at api.savebot.pro/docs.

Цены

Pricing

Оплата списывается с баланса в Telegram Stars до обработки. Если запрос не удался или сделано меньше версий, чем заказано, разница возвращается на баланс автоматически.

Stars are deducted from your balance before processing. If a request fails or fewer versions are produced than ordered, the difference is refunded automatically.

2 ⭐
за версию в уникализатореper version in the uniquifier

POST /uniq — 10 версий ролика = 20 ⭐

POST /uniq — 10 versions of a video = 20 ⭐

1 ⭐
за скачивание постаper post download

POST /download — карусель из 10 фото = 1 ⭐

POST /download — a 10-photo carousel = 1 ⭐

1 ⭐
за набор подписейper set of captions

POST /captions — до 10 вариантов за запрос

POST /captions — up to 10 variants per request

Метаданные (/info), список платформ, баланс и раздача файлов — бесплатно. Телеграм продаёт звёзды пакетами в своём приложении; 100 ⭐ стоят примерно как чашка кофе.

/info, the platform list, balance and file delivery are free. Telegram sells Stars in packs inside the app; 100 ⭐ cost roughly a cup of coffee.

Авторизация

Authentication

Токен передаётся в заголовке каждого запроса. Без него или с отозванным токеном API отвечает 401.

Pass the token in a header on every request. Without it, or with a revoked token, the API responds 401.

Authorization: Bearer sb_ВАШ_ТОКЕН
Токен — это доступ к вашему балансу. Не вставляйте его в клиентский код сайта или приложения: вызывайте API со своего сервера. Если токен утёк — перевыпустите его в /api, старый сразу перестанет работать.
The token is access to your balance. Never embed it in client-side website or app code: call the API from your own server. If it leaks, rotate it in /api — the old one stops working immediately.

Скачивание

Downloading

POST/download 1 ⭐

Скачивает пост и отдаёт прямые ссылки на файлы. Работает с видео, фото, каруселями и аудио.

Downloads a post and returns direct file links. Works for videos, photos, carousels and audio.

ПолеFieldТипTypeОписаниеDescription
url*string Ссылка на пост. Трекинг-хвосты вроде ?igsh=… допустимы. Post link. Tracking tails like ?igsh=… are fine.
qualitystring best (по умолчанию), 1080p, 720p, 480p, 360p. best (default), 1080p, 720p, 480p, 360p.
audio_onlybool true — только звуковая дорожка (mp3). true — audio track only (mp3).
include_audiobool true — вернуть и саундтрек отдельным файлом вдобавок к видео. true — also return the soundtrack as a separate file alongside the video.
max_size_mbnumber Пережать видео, если оно больше. Нужно, например, для заливки в Telegram по URL (там лимит 20 МБ). Re-encode the video if it is larger. Useful for uploading to Telegram by URL (20 MB limit there).

Ответ

Response

{
  "ok": true,
  "media": [
    { "type": "video", "url": "https://api.savebot.pro/files/8f1c…/media_001.mp4",
      "duration": 14.2, "width": 1080, "height": 1920, "has_audio": true, "size": 3931281 }
  ],
  "caption": "Текст поста целиком",
  "author": "username",
  "source": "instagram"
}
  • media идёт в порядке слайдов оригинала; type — video, image или audio.
  • has_audio проверяется по реальной дорожке файла — защита от «немых» роликов.
  • Ссылки на файлы открыты без авторизации, но неугадываемы. Файлы живут 3 часа, потом удаляются.
  • Добавьте ?dl=1 к ссылке, чтобы браузер сразу скачал файл, и &as_name=my.mp4 — чтобы задать имя.
  • media keeps the original slide order; type is video, image or audio.
  • has_audio is checked against the actual track in the file — a guard against silent videos.
  • File links need no auth but are unguessable. Files live for 3 hours, then get deleted.
  • Append ?dl=1 to a link to force a download in the browser, and &as_name=my.mp4 to set the file name.
GET/info?url=… бесплатноfree

Метаданные без скачивания: название, автор, описание, длительность, превью и доступные качества с размерами. Удобно показать пользователю карточку поста до того, как платить за скачивание.

Metadata without downloading: title, author, description, duration, thumbnail and available qualities with sizes. Handy for showing a post card to the user before paying for the download.

{ "ok": true, "platform": "youtube", "title": "…", "author": "…", "duration": 212,
  "thumbnail": "https://…",
  "qualities": [ { "quality": "1080p", "label": "🎬 1080p — 80.5 MB", "size": 84426490 }, … ] }
GET/platforms бесплатноfree

Список площадок с доменами, вариантами качества и флагом enabled. Выключенная площадка отвечает ошибкой platform_disabled.

The list of platforms with their domains, quality options and an enabled flag. A disabled platform responds with platform_disabled.

Уникализатор

Uniquifier

Когда один ролик заливают на несколько площадок или аккаунтов, алгоритмы видят повтор и режут охваты. Уникализатор делает N версий файла: у каждой свой микрокроп, цвет, скорость, звук и параметры сжатия, метаданные стёрты. Для алгоритмов это разные файлы, для зрителя — тот же ролик.

When the same video is posted to several platforms or accounts, algorithms spot the duplicate and cut reach. The uniquifier produces N versions of a file: each gets its own micro-crop, colour, speed, audio and encoding tweaks, with metadata wiped. Algorithms see different files; viewers see the same video.

POST/uniq 2 ⭐ за версию2 ⭐ per version multipart/form-data
ПолеFieldТипTypeОписаниеDescription
filefile Видеофайл, до 300 МБ. Нужен либо file, либо url. Video file, up to 300 MB. Either file or url is required.
urlstring Ссылка на пост — берётся первое видео, как в /download. Подпись поста станет исходной для вариантов. Post link — the first video is taken, as in /download. The post caption becomes the source for variants.
countint Число версий, 1–10. По умолчанию 1. Number of versions, 1–10. Default 1.
captionstring Исходная подпись. Каждая версия получит свой вариант (см. /captions). Source caption. Every version gets its own variant (see /captions).
qualitystring Качество скачивания при url. По умолчанию best. Download quality when using url. Default best.
curl -X POST https://api.savebot.pro/uniq \
  -H "Authorization: Bearer sb_ВАШ_ТОКЕН" \
  -F file=@video.mp4 -F count=3 -F "caption=Текст поста #tag"

Ответ

Response

{
  "ok": true,
  "media": [
    { "type": "video", "index": 1, "url": "https://api.savebot.pro/files/…/video_1.mp4",
      "width": 1080, "height": 1920, "duration": 14, "has_audio": true, "size": 2931281,
      "caption": "Текст поста ✨\n\n#tag" },
    …
  ],
  "count": 3, "requested": 3, "caption_source": "ai", "balance": 94
}
  • Версии считаются последовательно, примерно 5–30 секунд на версию в зависимости от длины ролика. Держите таймаут запроса с запасом: 10 минут.
  • Если обработка оборвалась на середине, вернутся готовые версии (count меньше requested), а разница вернётся на баланс.
  • caption_source: ai — варианты написала нейросеть, template — перестановка хэштегов и эмодзи.
  • Versions are rendered one after another, roughly 5–30 seconds each depending on video length. Keep a generous request timeout: 10 minutes.
  • If processing stops midway, the finished versions are returned (count below requested) and the difference is refunded.
  • caption_source: ai — variants written by an LLM, template — hashtag and emoji reshuffle.

Варианты подписи

Caption variants

POST/captions 1 ⭐

N вариантов текста поста, чтобы у каждой площадки была своя подпись. Смысл и хэштеги автора сохраняются.

N variants of a post text so every platform gets its own caption. The author’s meaning and hashtags are preserved.

POST /captions
{ "text": "Текст поста #tag1 #tag2", "count": 3, "limit": 900 }

→ { "ok": true, "captions": ["…", "…", "…"], "source": "ai" }

limit — максимальная длина одного варианта в символах (в Telegram подпись к видео — до 1024).

limit — maximum length of one variant in characters (Telegram allows up to 1024 for a video caption).

Баланс

Balance

GET/me бесплатноfree
{ "ok": true, "kind": "personal", "balance": 94, "spent_today": 6,
  "prices": { "uniq": 2, "download": 1, "captions": 1 } }

Проверяйте баланс перед большими пачками: при нехватке звёзд запрос вернёт insufficient_stars, ничего не списав. Пополнение и история операций — в /api бота.

Check the balance before large batches: with too few Stars a request returns insufficient_stars without charging anything. Top-ups and the transaction history live in the bot’s /api.

Ошибки

Errors

«Пост нельзя обработать» — это HTTP 200 с ok: false. Только неверный токен отдаётся с HTTP 401.

“The post cannot be processed” is HTTP 200 with ok: false. Only an invalid token returns HTTP 401.

{ "ok": false, "error": "insufficient_stars", "message": "Недостаточно звёзд: нужно 6, на балансе 4…", "required": 6, "balance": 4 }
КодCodeКогдаWhenЧто делатьWhat to do
insufficient_starsНе хватает звёзд на балансеNot enough Stars on the balanceПополнить в /apiTop up in /api
private_accountАккаунт закрыт или нужен входPrivate account or login requiredНе повторятьDo not retry
not_foundПост удалён или ссылка битаяPost deleted or link brokenНе повторятьDo not retry
restrictedВозрастное или региональное ограничениеAge or region restrictionНе повторятьDo not retry
unsupported_urlПлощадка не поддерживаетсяPlatform not supportedНе повторятьDo not retry
platform_disabledПлощадка временно выключенаPlatform temporarily disabledПовторить позжеRetry later
rate_limitedСоцсеть ограничивает запросыThe network is throttling requestsПовторить через минутуRetry in a minute
download_failedПрочий сбой скачиванияOther download failureПовторить один разRetry once
bad_requestНет файла или ссылки, пустой текст, в посте нет видеоNo file or link, empty text, no video in the postИсправить запросFix the request
too_bigФайл в /uniq больше 300 МБFile in /uniq exceeds 300 MBСжать файлCompress the file
uniq_failedffmpeg не смог прочитать видеоffmpeg could not read the videoПроверить файлCheck the file
unauthorizedТокен неверный или отозван (HTTP 401)Token invalid or revoked (HTTP 401)Проверить токенCheck the token

Примеры кода

Code examples

Скачать пост, затем сделать три версии первого видео с подписями.

Download a post, then make three versions of the first video with captions.

import requests

API = "https://api.savebot.pro"
H = {"Authorization": "Bearer sb_ВАШ_ТОКЕН"}

# 1. скачать постdownload the post
r = requests.post(f"{API}/download", headers=H,
                  json={"url": "https://www.tiktok.com/@user/video/123"}, timeout=300).json()
if not r["ok"]:
    raise SystemExit(r["error"])
video = next(m for m in r["media"] if m["type"] == "video")
data = requests.get(video["url"], timeout=300).content

# 2. три уникальные версии с подписямиthree unique versions with captions
u = requests.post(f"{API}/uniq", headers=H, timeout=600,
                  files={"file": ("video.mp4", data, "video/mp4")},
                  data={"count": 3, "caption": r["caption"]}).json()
for v in u["media"]:
    print(v["index"], v["url"], v.get("caption", "")[:40])
print("balance:", u["balance"])
const API = "https://api.savebot.pro";
const H = { Authorization: "Bearer sb_ВАШ_ТОКЕН" };

// 1. скачать постdownload the post
const r = await fetch(`${API}/download`, {
  method: "POST", headers: { ...H, "Content-Type": "application/json" },
  body: JSON.stringify({ url: "https://www.tiktok.com/@user/video/123" }),
}).then(x => x.json());
if (!r.ok) throw new Error(r.error);
const video = r.media.find(m => m.type === "video");
const blob = await fetch(video.url).then(x => x.blob());

// 2. три уникальные версииthree unique versions
const form = new FormData();
form.append("file", blob, "video.mp4");
form.append("count", "3");
form.append("caption", r.caption);
const u = await fetch(`${API}/uniq`, { method: "POST", headers: H, body: form }).then(x => x.json());
for (const v of u.media) console.log(v.index, v.url, v.caption);
console.log("balance:", u.balance);
# версии прямо из ссылки на пост, подпись возьмётся из постаversions straight from a post link; the caption is taken from the post
curl -X POST https://api.savebot.pro/uniq \
  -H "Authorization: Bearer sb_ВАШ_ТОКЕН" \
  -F url=https://www.tiktok.com/@user/video/123 -F count=3

# только аудио из YouTubeaudio only from YouTube
curl -X POST https://api.savebot.pro/download \
  -H "Authorization: Bearer sb_ВАШ_ТОКЕН" -H "Content-Type: application/json" \
  -d '{"url":"https://youtu.be/dQw4w9WgXcQ","audio_only":true}'

# балансbalance
curl -H "Authorization: Bearer sb_ВАШ_ТОКЕН" https://api.savebot.pro/me

Лимиты и детали

Limits and details