synaplex

Для разработчиков

API Synaplex

Генерация фото, видео, музыки и озвучки из своего сайта, бота, n8n или Claude Code. Те же модели, что в приложении: Nano Banana, Seedance, Veo, Kling, Suno. Те же цены, оплата алмазами Synaplex.

Почему это работает в России. Официальные API зарубежных моделей с российских серверов и российскими картами не работают. API Synaplex отвечает с сервера в России и оплачивается в рублях, поэтому сайт или бот на российском хостинге сможет генерировать.

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

  1. Пополни баланс в кабинете: app.synaplex.ru/plans. Генерации через API списываются с того же баланса.
  2. Создай ключ в разделе «API-ключи». Ключ показывается один раз — сразу сохрани его в менеджер паролей или в переменную окружения сервера SYNAPLEX_API_KEY. Поставь лимит трат на сутки: он защитит баланс, если ключ утечёт.
  3. Сделай первый запрос. Картинка по промту:
    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" }
      }'
    Ответ сразу, генерация идёт в фоне:
    { "id": "6f1c…", "status": "queued", "model": "nano-banana-2", "kind": "image", "price": 20, "balance": 180 }
    Через 20–60 секунд забери результат:
    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"
    }
  4. Подключи в n8n — раздел ниже.
  5. Подключи в свой сайт через Claude Code: ключ на сервере, сайт ходит в свой бэкенд, бэкенд — в Synaplex. Раздел ниже.

Ключ и безопасность

Методы

МетодЧто делает
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" }] }
}

Проверка подписи: 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Что делать
400validation, bad_param, inputs_countПроверь параметры по GET /v1/models
401invalid_keyКлюча нет, он неверный или отозван
402insufficient_balanceНе хватает алмазов: в ответе needDiamonds и topUpUrl
403scope_required, browser_not_allowedДобавь ключу право или перенеси запрос на сервер
409in_progressЗапрос с этим Idempotency-Key ещё обрабатывается
429rate_limited, too_many_running, daily_limit, monthly_limitЛимит запросов, одновременных генераций или трат ключа

Если генерация не получилась у провайдера, статус станет failed, а алмазы вернутся на баланс автоматически.

Лимиты

Как подключить в n8n

  1. Добавь узел HTTP Request: метод POST, URL https://api.synaplex.ru/v1/generations.
  2. Authentication → Generic Credential Type → Header Auth: имя Authorization, значение Bearer sx_live_…. Ключ хранится в учётных данных n8n, а не в самом сценарии.
  3. Send Body → JSON: { "model": "nano-banana-2", "prompt": "{{ $json.prompt }}" }.
  4. Дальше два пути: узел Wait на 30–60 секунд и ещё один HTTP Request на GET /v1/generations/{{ $json.id }} — или узел Webhook и его адрес в поле webhookUrl: n8n получит результат сам.

Как подключить в свой сайт через Claude Code

  1. Положи ключ на сервер в .env: SYNAPLEX_API_KEY=sx_live_…. Файл .env — в .gitignore.
  2. Дай 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.

Поддержка