API Synaplex
Генерация фото, видео, музыки и озвучки из своего сайта, бота, n8n или Claude Code. Те же модели, что в приложении: Nano Banana, Seedance, Veo, Kling, Suno. Те же цены, оплата алмазами Synaplex.
Почему это работает в России. Официальные API зарубежных моделей с российских серверов и российскими картами не работают. API Synaplex отвечает с сервера в России и оплачивается в рублях, поэтому сайт или бот на российском хостинге сможет генерировать.
Быстрый старт
- Пополни баланс в кабинете: app.synaplex.ru/plans. Генерации через API списываются с того же баланса.
- Создай ключ в разделе «API-ключи». Ключ показывается один раз — сразу сохрани его в менеджер паролей или в переменную окружения сервера
SYNAPLEX_API_KEY. Поставь лимит трат на сутки: он защитит баланс, если ключ утечёт. - Сделай первый запрос. Картинка по промту:
Ответ сразу, генерация идёт в фоне:curl https://api.synaplex.ru/v1/generations \ -H "Authorization: Bearer $SYNAPLEX_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: first-try-0001" \ -d '{ "model": "nano-banana-2", "prompt": "A ginger cat sleeping on a sunny windowsill, golden hour light, 85mm lens, shallow depth of field, photorealistic", "params": { "resolution": "2K", "aspectRatio": "3:4" } }'
Через 20–60 секунд забери результат:{ "id": "6f1c…", "status": "queued", "model": "nano-banana-2", "kind": "image", "price": 20, "balance": 180 }curl https://api.synaplex.ru/v1/generations/6f1c… -H "Authorization: Bearer $SYNAPLEX_API_KEY"{ "id": "6f1c…", "status": "succeeded", "price": 20, "results": [{ "url": "https://…подписанная-ссылка…", "type": "image" }], "expiresAt": "2026-10-14T12:00:00.000Z" } - Подключи в n8n — раздел ниже.
- Подключи в свой сайт через Claude Code: ключ на сервере, сайт ходит в свой бэкенд, бэкенд — в Synaplex. Раздел ниже.
Ключ и безопасность
- Запросы — с заголовком
Authorization: Bearer sx_live_…. - Ключ — только на сервере. Всё, что лежит в коде страницы или мобильного приложения, видит любой посетитель. Запрос из браузера (с заголовком
Origin) API отклоняет с кодомbrowser_not_allowed. - Права ключа:
generate— генерации и загрузки,read— статусы и история,balance— баланс и траты. - Ключ мог утечь — отзови его в кабинете. Отзыв действует сразу, следующий запрос получит 401.
Методы
| Метод | Что делает |
|---|---|
GET /v1/me | Баланс, права ключа, лимиты и траты за сутки и месяц |
GET /v1/models | Модели с ценами в алмазах и возможностями: разрешения, длительности, звук, первый и последний кадр |
GET /v1/voices | Голоса для озвучки и говорящих аватаров |
POST /v1/uploads | Загрузка файла (multipart, поле file) или по публичной https-ссылке → inputKey |
POST /v1/generations | Запуск генерации: model, prompt, params, inputKeys, webhookUrl |
GET /v1/generations/:id | Статус и подписанные ссылки на результат (живут сутки) |
GET /v1/generations | История с курсором: ?limit=20&cursor=… |
POST /v1/tools/:slug | Инструменты приложения: avatar, greeting, lipsync, upscale, upscale-video, remove-bg, restore, recreate, tryon, product, motion |
Полная спецификация OpenAPI 3.1: https://api.synaplex.ru/v1/openapi.json. Её можно отдать ИИ-ассистенту — он соберёт интеграцию сам.
JavaScript
// Node.js 18+. Ключ — в переменной окружения сервера, не в коде страницы.
const API = 'https://api.synaplex.ru/v1';
const headers = { Authorization: `Bearer ${process.env.SYNAPLEX_API_KEY}`, 'Content-Type': 'application/json' };
export async function generateImage(prompt) {
const res = await fetch(`${API}/generations`, {
method: 'POST',
headers: { ...headers, 'Idempotency-Key': crypto.randomUUID() },
body: JSON.stringify({ model: 'nano-banana-2', prompt, params: { resolution: '2K', aspectRatio: '1:1' } }),
});
const started = await res.json();
if (res.status === 402) throw new Error(`Пополни баланс: ${started.topUpUrl}`);
if (!res.ok) throw new Error(started.error.message);
// Картинка — обычно до минуты, видео — несколько минут. Опрашиваем раз в 5 секунд.
for (;;) {
await new Promise((r) => setTimeout(r, 5000));
const gen = await fetch(`${API}/generations/${started.id}`, { headers }).then((r) => r.json());
if (gen.status === 'succeeded') return gen.results[0].url;
if (gen.status === 'failed') throw new Error(gen.error); // алмазы уже вернулись на баланс
}
}Python
import os, time, uuid, requests
API = "https://api.synaplex.ru/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['SYNAPLEX_API_KEY']}"}
def generate_video(prompt: str) -> str:
res = requests.post(f"{API}/generations", headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())}, json={
"model": "seedance-2-mini",
"prompt": prompt,
"params": {"resolution": "720p", "duration": 5, "aspectRatio": "9:16"},
})
data = res.json()
if res.status_code == 402:
raise RuntimeError(f"Пополни баланс: {data['topUpUrl']}")
res.raise_for_status()
while True:
time.sleep(10)
gen = requests.get(f"{API}/generations/{data['id']}", headers=HEADERS).json()
if gen["status"] == "succeeded":
return gen["results"][0]["url"]
if gen["status"] == "failed":
raise RuntimeError(gen["error"])Свои фото и видео
# Файлом
curl https://api.synaplex.ru/v1/uploads -H "Authorization: Bearer $SYNAPLEX_API_KEY" -F "file=@selfie.jpg"
# По публичной ссылке (только https)
curl https://api.synaplex.ru/v1/uploads -H "Authorization: Bearer $SYNAPLEX_API_KEY" \
-H "Content-Type: application/json" -d '{ "url": "https://example.com/selfie.jpg" }'
# Ответ: { "inputKey": "uploads/…/….jpg", "kind": "image" } — передай его в inputKeys генерацииФото до 20 МБ (JPEG, PNG, WebP, HEIC), видео до 100 МБ и 60 секунд, аудио до 20 МБ. Загрузки хранятся 30 дней.
Параметры и модели
Допустимые значения params у каждой модели — в GET /v1/models, в поле capabilities. Цена — в поле pricing: базовая, по таблице параметров или за секунду входного видео и аудио. Ответ на запуск всегда содержит итоговую цену price.
Видео от заданных кадров — у моделей с capabilities.firstFrame и lastFrame (Veo 3.1, Seedance):imageMode: "first_frame" с одной картинкой или "first_last" с двумя.
{
"model": "veo-3-1-fast",
"prompt": "The old black-and-white photo slowly fills with color, gentle natural motion",
"params": { "imageMode": "first_last", "resolution": "720p", "aspectRatio": "9:16" },
"inputKeys": ["uploads/…/first.jpg", "uploads/…/last.jpg"]
}Инструменты
Те же, что в приложении. Говорящий аватар по фото и тексту:
curl https://api.synaplex.ru/v1/tools/avatar \
-H "Authorization: Bearer $SYNAPLEX_API_KEY" -H "Content-Type: application/json" \
-d '{ "photoKey": "uploads/…/portrait.jpg", "text": "Привет! Это видео сделано через API Synaplex.", "voice": "FGY2WhTYpPnrIDTdsKH5" }'Липсинк — губы в готовом видео (до 60 секунд) под новый текст или свою запись: { "videoKey": "…", "text": "…", "voice": "…" } или { "videoKey": "…", "audioKey": "…" }. Ролик получается длиной со звук, цена — за секунду звука.
Вебхуки
Вместо опроса передай webhookUrl в запросе генерации — публичный https-адрес твоего сервера. Когда генерация закончится, туда придёт POST:
{
"event": "generation.succeeded",
"eventId": "0f8b…",
"createdAt": "2026-10-13T12:00:00.000Z",
"generation": { "id": "6f1c…", "status": "succeeded", "model": "nano-banana-2", "price": 20, "results": [{ "url": "https://…", "type": "image" }] }
}- Заголовки:
X-Synaplex-Event,X-Synaplex-Event-IdиX-Synaplex-Signature: sha256=…— HMAC-SHA256 сырого тела с секретом вебхуков ключа. Секрет показан при создании ключа и в кабинете. - Ответь 2xx. Иначе — повторы с нарастающей паузой, 11 попыток в течение примерно часа.
Проверка подписи: Node.js
import crypto from 'node:crypto';
import express from 'express';
const app = express();
// Подпись считается по сырому телу — не парси JSON до проверки.
app.post('/hooks/synaplex', express.raw({ type: 'application/json' }), (req, res) => {
const expected = 'sha256=' + crypto.createHmac('sha256', process.env.SYNAPLEX_WEBHOOK_SECRET).update(req.body).digest('hex');
const got = req.get('X-Synaplex-Signature') ?? '';
if (got.length !== expected.length || !crypto.timingSafeEqual(Buffer.from(got), Buffer.from(expected))) return res.sendStatus(401);
const { event, eventId, generation } = JSON.parse(req.body);
// eventId — для защиты от повторов: одно событие может прийти дважды.
if (event === 'generation.succeeded') console.log(generation.results[0].url);
res.sendStatus(200);
});Проверка подписи: Python
import hashlib, hmac, os
from flask import Flask, request, abort
app = Flask(__name__)
@app.post("/hooks/synaplex")
def synaplex_hook():
expected = "sha256=" + hmac.new(os.environ["SYNAPLEX_WEBHOOK_SECRET"].encode(), request.get_data(), hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, request.headers.get("X-Synaplex-Signature", "")):
abort(401)
event = request.get_json()
return "", 200Идемпотентность
Передавай заголовок Idempotency-Key (8–100 символов, например UUID) в POST /v1/generations и /v1/tools/:slug. Если сеть оборвалась и запрос ушёл повторно, API вернёт ту же генерацию и не спишет алмазы второй раз.
Ошибки
Всегда в одном формате: { "error": { "code": "…", "message": "…" } }.
| Код | error.code | Что делать |
|---|---|---|
| 400 | validation, bad_param, inputs_count | Проверь параметры по GET /v1/models |
| 401 | invalid_key | Ключа нет, он неверный или отозван |
| 402 | insufficient_balance | Не хватает алмазов: в ответе needDiamonds и topUpUrl |
| 403 | scope_required, browser_not_allowed | Добавь ключу право или перенеси запрос на сервер |
| 409 | in_progress | Запрос с этим Idempotency-Key ещё обрабатывается |
| 429 | rate_limited, too_many_running, daily_limit, monthly_limit | Лимит запросов, одновременных генераций или трат ключа |
Если генерация не получилась у провайдера, статус станет failed, а алмазы вернутся на баланс автоматически.
Лимиты
- 60 запросов в минуту и 5 одновременных генераций на ключ.
- Лимит трат в алмазах на сутки и месяц (по Москве) — задаёшь сам в кабинете.
- До 10 ключей на аккаунт.
- Ссылки на результат живут сутки: сохраняй файлы у себя или бери свежую ссылку через GET /v1/generations/:id.
Как подключить в n8n
- Добавь узел HTTP Request: метод POST, URL
https://api.synaplex.ru/v1/generations. - Authentication → Generic Credential Type → Header Auth: имя
Authorization, значениеBearer sx_live_…. Ключ хранится в учётных данных n8n, а не в самом сценарии. - Send Body → JSON:
{ "model": "nano-banana-2", "prompt": "{{ $json.prompt }}" }. - Дальше два пути: узел Wait на 30–60 секунд и ещё один HTTP Request на
GET /v1/generations/{{ $json.id }}— или узел Webhook и его адрес в полеwebhookUrl: n8n получит результат сам.
Как подключить в свой сайт через Claude Code
- Положи ключ на сервер в
.env:SYNAPLEX_API_KEY=sx_live_…. Файл.env— в.gitignore. - Дай Claude Code задачу — например, такую:
Подключи к моему сайту генерацию картинок через Synaplex API.
Спецификация: https://api.synaplex.ru/v1/openapi.json
Ключ лежит на сервере в переменной окружения SYNAPLEX_API_KEY — в код страницы и в браузер он попадать не должен.
Сделай серверный эндпоинт POST /api/generate: принимает промт, запускает генерацию nano-banana-2,
опрашивает статус раз в 5 секунд и возвращает ссылку на картинку. На 402 покажи пользователю «нужно пополнить баланс».Схема всегда одна: страница → твой бэкенд → Synaplex. Тогда ключ не виден посетителям, а лимиты и проверку оплаты своих клиентов ты держишь у себя.
MCP-сервер: генерация прямо из чата с ИИ
Подключи Synaplex к Claude Code, Codex или Cursor — и проси в чате: «сделай картинку для поста про кофейню, покажи цену» или «оживи это фото». Ассистент сам выберет модель, покажет цену, запустит генерацию и принесёт результат. Те же ключ, цены и лимиты, что у API.
Адрес: https://api.synaplex.ru/mcp, транспорт Streamable HTTP, ключ — в заголовке Authorization: Bearer sx_live_….
Claude Code
claude mcp add --transport http synaplex https://api.synaplex.ru/mcp --header "Authorization: Bearer sx_live_…"Codex
Добавь сервер в ~/.codex/config.toml и положи ключ в переменную окружения SYNAPLEX_API_KEY — например, в ~/.zshrc: export SYNAPLEX_API_KEY=sx_live_….
# ~/.codex/config.toml — ключ берётся из переменной окружения, в конфиге только её имя
[mcp_servers.synaplex]
url = "https://api.synaplex.ru/mcp"
bearer_token_env_var = "SYNAPLEX_API_KEY"Cursor
// .cursor/mcp.json
{
"mcpServers": {
"synaplex": {
"url": "https://api.synaplex.ru/mcp",
"headers": { "Authorization": "Bearer sx_live_…" }
}
}
}Коннекторы claude.ai и ChatGPT
Они принимают только адрес, без заголовков. Для них ключ идёт в адресе: https://api.synaplex.ru/mcp/sx_live_…. Создай для этого отдельный ключ с лимитом трат и отзови его, если адрес мог попасть к посторонним. Такие коннекторы ходят к серверу из облака — если подключение не прошло, используй Claude Code, Codex или Cursor.
Инструменты
| Инструмент | Что делает |
|---|---|
list_models | Модели, цены, что умеют: разрешения, длительности, звук, первый и последний кадр |
get_price | Цена генерации до запуска |
get_balance | Баланс и остаток лимита ключа |
list_voices | Голоса для озвучки |
upload_from_url | Загрузить картинку, видео или аудио по ссылке → inputKey |
generate_image | Картинка; сразу возвращает id |
generate_video | Видео, в том числе от первого и последнего кадра; сразу возвращает id |
generate_music | Песня Suno по описанию или своему тексту |
text_to_speech | Озвучка текста |
run_tool | Инструменты приложения: аватар, поздравление, липсинк, апскейл, удаление фона… |
get_generation | Статус и ссылка на результат; картинку ассистент видит сам |
list_generations | Последние генерации |
Генерация идёт минутами, поэтому generate_* сразу отвечают id, а результат ассистент забирает через get_generation. Имена инструментов не пересекаются с MCP курса «Я — креатор ИИ» — оба сервера можно подключить вместе.
Условия
Генерации через API списываются по тем же ценам, что в приложении. Контент через API подчиняется тем же правилам, что в приложении. Вопросы — hi@synaplex.ru.