SyncNode is a unified AI API gateway. Run AI tasks across multiple providers through a single endpoint — no separate integrations needed. Connect your provider keys once, and SyncNode handles routing, billing, file hosting, and result tracking.
Moderate text & images in one call. Get safety scores instantly.
GPT, Claude, Llama & 200+ models via OpenRouter or direct OpenAI.
Generate images & video with any Replicate model + auto CDN hosting.
Swap faces in images with a single API call.
Pay-as-you-go. Auto-recharge when balance is low.
Generated files auto-upload to your Bunny CDN or S3 bucket.
| Service | Base URL |
|---|---|
| AI Tasks (Chat, Images, Face Swap) | https://run.syncnode.ai |
| Content Moderation | https://moderate.syncnode.ai |
Get up and running in under 2 minutes.
All API requests require your SyncNode API key (sent as apiKey in the request body or query string). Some endpoints also require a Bearer token for additional authentication. Both are on your API Key page.
apiKey (preferred, modern), api_key (snake_case alternative), or uid (legacy alias). Pick whichever fits your codebase; they all behave identically. These docs use apiKey for examples.Include both apiKey in the body/query and a Bearer token in the header for protected endpoints.
curl -X POST https://run.syncnode.ai/chat-completion \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{"apiKey": "__API_KEY__"}'These only need your API key (sent as apiKey) — no Bearer token:
POST /chat-completionPOST /chatgpt-completionPOST /generatePOST /face-swap/runGET /prediction-statusGET /balancePOST https://moderate.syncnode.aiSimple, per-call pricing. No subscriptions.
| Endpoint | Cost per Call |
|---|---|
| Chat Completion (OpenRouter) | $0.02 |
| ChatGPT Completion (OpenAI) | $0.02 |
| Image / Video Generation (Replicate) | $0.02 |
| Face Swap | $0.02 |
| Content Moderation | $0.005 |
New accounts start with $5.00 free credits. Auto-recharge triggers when your balance drops below $0.01 (configurable threshold, default $50).
Moderate text and images in a single request. Returns granular safety scores for harassment, hate, violence, sexual content, self-harm, and more — plus a simple safe flag. No provider API keys needed.
| Parameter | Type | Required | Description |
|---|---|---|---|
| apiKey | string | required | Your SyncNode API key (from /api_keys) |
| text | string | optional | Text content to moderate |
| imageUrl | string | optional | URL of image to moderate |
| imageBase64 | string | optional | Base64-encoded image data |
| imageMime | string | optional | MIME type when using imageBase64 (e.g. image/png) |
text, imageUrl, or imageBase64 must be provided. You can combine text + image in a single call.curl -X POST "https://moderate.syncnode.ai" \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"text": "Hello, this is a test message",
"imageUrl": "https://example.com/photo.jpg"
}'const response = await fetch("https://moderate.syncnode.ai", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
apiKey: "__API_KEY__",
text: "Hello, this is a test message",
imageUrl: "https://example.com/photo.jpg"
})
});
const result = await response.json();
console.log(result.overall_moderation.safe); // 1 = safe, 0 = flaggedimport requests
response = requests.post("https://moderate.syncnode.ai", json={
"apiKey": "__API_KEY__",
"text": "Hello, this is a test message",
"imageUrl": "https://example.com/photo.jpg"
})
result = response.json()
print(result["overall_moderation"]["safe"]) # 1 = safe, 0 = flagged{
"apiKey": "__API_KEY__",
"text_moderation": {
"scores": {
"harassment": 0.00004,
"harassment/threatening": 0.000007,
"sexual": 0.003,
"hate": 0.00001,
"hate/threatening": 0.0000005,
"illicit": 0.00001,
"illicit/violent": 0.000009,
"self-harm/intent": 0.000002,
"self-harm/instructions": 0.000001,
"self-harm": 0.000006,
"sexual/minors": 0.00002,
"violence": 0.0005,
"violence/graphic": 0.000009
},
"nudity": 0, "underage": 0, "vulgar": 0, "safe": 1
},
"image_moderation": {
"scores": { "harassment": 0, "sexual": 0.00007, "violence": 0.023, "self-harm": 0.004 },
"nudity": 0, "underage": 0, "vulgar": 0, "safe": 1
},
"overall_moderation": { "nudity": 0, "underage": 0, "vulgar": 0, "safe": 1 }
}| Field | Description |
|---|---|
| text_moderation | Present when text was provided. Contains per-category scores and flags. |
| image_moderation | Present when an image was provided. Contains per-category scores and flags. |
| overall_moderation | Combined result across all inputs. |
| safe | 1 = content is safe, 0 = content was flagged. |
| nudity / underage / vulgar | 0 or 1 — specific content flags. |
| scores | Granular 0–1 scores for each moderation category (lower = safer). |
curl -X POST "https://moderate.syncnode.ai" \
-H "Content-Type: application/json" \
-d '{"apiKey": "__API_KEY__", "text": "Check if this text is safe"}'curl -X POST "https://moderate.syncnode.ai" \
-H "Content-Type: application/json" \
-d '{"apiKey": "__API_KEY__", "imageUrl": "https://example.com/image.jpg"}'curl -X POST "https://moderate.syncnode.ai" \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"imageBase64": "iVBORw0KGgoAAAANS...",
"imageMime": "image/png"
}'overall_moderation.safe first. If 0, inspect scores to see which categories were flagged.Send chat messages to 200+ AI models via OpenRouter. Requires an OpenRouter API key in your API Keys settings.
| Parameter | Type | Required | Description |
|---|---|---|---|
| apiKey | string | required | Your SyncNode API key (from /api_keys) |
| model | string | required | Model ID (e.g. openai/gpt-4o, anthropic/claude-3.5-sonnet) |
| messages | array | required | Array of {role, content} message objects |
| prompt | string | optional | Alternative to messages for simple single prompts |
| max_tokens | number | optional | Maximum tokens in response |
| temperature | number | optional | Sampling temperature (0–2) |
curl -X POST https://run.syncnode.ai/chat-completion \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"model": "openai/gpt-4o",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Explain quantum computing in 3 sentences."}
],
"max_tokens": 500,
"temperature": 0.7
}'const response = await fetch("https://run.syncnode.ai/chat-completion", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
apiKey: "__API_KEY__",
model: "openai/gpt-4o",
messages: [
{ role: "system", content: "You are a helpful assistant." },
{ role: "user", content: "Explain quantum computing in 3 sentences." }
],
max_tokens: 500,
temperature: 0.7
})
});
const data = await response.json();
console.log(data.prediction.output.choices[0].message.content);import requests
response = requests.post("https://run.syncnode.ai/chat-completion", json={
"apiKey": "__API_KEY__",
"model": "openai/gpt-4o",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Explain quantum computing in 3 sentences."}
],
"max_tokens": 500,
"temperature": 0.7
})
data = response.json()
print(data["prediction"]["output"]["choices"][0]["message"]["content"]){
"prediction": {
"id": 123,
"apiKey": "__API_KEY__",
"output": {
"model": "openai/gpt-4o",
"choices": [{
"index": 0,
"message": { "role": "assistant", "content": "Quantum computing uses qubits..." },
"finish_reason": "stop"
}],
"usage": { "prompt_tokens": 25, "completion_tokens": 85, "total_tokens": 110 }
},
"cost": 0.02, "model": "openai/gpt-4o", "status": "completed",
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}Send requests directly to the OpenAI API. Requires an OpenAI API key stored in your API Keys.
curl -X POST https://run.syncnode.ai/chatgpt-completion \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"model": "gpt-4o",
"messages": [
{"role": "user", "content": "Write a haiku about programming."}
],
"max_tokens": 100,
"temperature": 0.8
}'/chat-completion routes through OpenRouter (200+ models). /chatgpt-completion goes directly to OpenAI using your OpenAI key.Generate images, videos, and audio using any Replicate model. Results auto-upload to your configured CDN host. Requires a Replicate API key saved under Provider Credentials.
| Parameter | Type | Required | Description |
|---|---|---|---|
| apiKey | string | required | Your SyncNode API key (from /api_keys) |
| model | string | required | Replicate model ID (e.g. stability-ai/sdxl or full version hash) |
| input | object | required | Model-specific input parameters |
curl -X POST https://run.syncnode.ai/generate \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"model": "black-forest-labs/flux-schnell",
"input": {
"prompt": "A serene mountain landscape at sunset, photorealistic",
"aspect_ratio": "16:9",
"num_outputs": 1,
"output_format": "webp"
}
}'curl -X POST https://run.syncnode.ai/generate \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"model": "adirik/realvisxl-v3.0-turbo:3dc73c80...",
"input": {
"width": 768, "height": 768,
"prompt": "A serene mountain landscape at sunset, photorealistic",
"negative_prompt": "low quality, blurry, sketch",
"num_outputs": 1, "guidance_scale": 7, "num_inference_steps": 25
}
}'curl -X POST https://run.syncnode.ai/generate \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"model": "bytedance/seedance-1-lite",
"input": {
"fps": 24, "prompt": "A woman walks through a sunlit park",
"duration": 5, "resolution": "720p", "aspect_ratio": "16:9"
}
}'{
"success": true,
"job_id": "b6nqrw6zbdrmc0cqwqbr8b3dm8",
"get": "https://run.syncnode.ai/prediction-status?job_id=b6nqrw6zbdrmc0cqwqbr8b3dm8",
"status": "in_progress"
}get URL or the Prediction Status endpoint to poll for results.Run any model from fal.ai through SyncNode — images, video, audio, multimodal. Submission is queued and SyncNode polls FAL until the job completes, then uploads the result to your CDN. Requires a FAL API key saved under Provider Credentials.
| Parameter | Type | Required | Description |
|---|---|---|---|
| apiKey | string | required | Your SyncNode API key (from /api_keys) |
| model | string | required | Full FAL model path (e.g. fal-ai/recraft/v4.1/text-to-image, fal-ai/flux/dev). The model is part of the URL on FAL's side. |
| input | object | required | Model-specific input (e.g. prompt, image_size, enable_safety_checker). Forwarded directly to FAL. |
curl -X POST https://run.syncnode.ai/fal/generate \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"model": "fal-ai/recraft/v4.1/text-to-image",
"input": {
"prompt": "Tilt-shift miniature of a Portuguese fishing village at golden hour",
"image_size": "landscape_16_9",
"enable_safety_checker": true
}
}'{
"success": true,
"job_id": "eff9450f-84e5-4aeb-86e8-3ec1a197c033",
"provider_job_id": "019e314d-ed5f-70d1-8781-20ac1eb39f06",
"task_status": "IN_QUEUE",
"status": "in_progress"
}curl "https://run.syncnode.ai/fal/status?job_id=eff9450f-84e5-4aeb-86e8-3ec1a197c033"| Status | Description |
|---|---|
IN_QUEUE | Submitted, waiting to start |
IN_PROGRESS | Model is running |
COMPLETED | Done — output contains the final URL (uploaded to your CDN host if configured) |
FAILED | Failed — check output for the error message |
/fal/status. Manual polling just makes it faster.Run Wan family models (image, video, multimodal) from Alibaba DashScope through SyncNode. Image and multimodal generation can be synchronous; video generation is always async. Requires an Alibaba DashScope API key saved under Provider Credentials.
| Parameter | Type | Required | Description |
|---|---|---|---|
| apiKey | string | required | Your SyncNode API key (from /api_keys) |
| model | string | required | DashScope model name (e.g. wan2.7-image-pro, wan2.7-i2v) |
| input | object | required | DashScope input. For multimodal: { messages: [...] }. For video: { prompt, media: [...] }. |
| parameters | object | optional | Model-specific knobs: size, resolution, duration, n, watermark, prompt_extend, etc. |
| endpoint | string | optional | Override the DashScope endpoint path. Defaults are inferred from model name. |
curl -X POST https://run.syncnode.ai/alibaba/generate \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"model": "wan2.7-image-pro",
"input": {
"messages": [{
"role": "user",
"content": [{ "text": "A futuristic cyberpunk city at night, neon lights, rain" }]
}]
},
"parameters": { "size": "2K", "n": 1, "watermark": false }
}'curl -X POST https://run.syncnode.ai/alibaba/generate \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"model": "wan2.7-i2v",
"input": {
"prompt": "A cat surfing on a wave",
"media": [
{ "type": "first_frame", "url": "https://example.com/first.jpg" }
]
},
"parameters": { "resolution": "1080P", "duration": 5, "prompt_extend": true }
}'{
"success": true,
"job_id": "a3c8...",
"provider_job_id": "ds-task-abc...",
"task_status": "PENDING",
"status": "in_progress"
}curl "https://run.syncnode.ai/alibaba/status?job_id=a3c8..."| Status | Description |
|---|---|
PENDING / QUEUED | Submitted, waiting to start |
RUNNING | Model is running |
SUCCEEDED | Done — output contains the final URL (uploaded to your CDN host if configured) |
FAILED / CANCELED | Failed — check output for the error message |
i2v models, SyncNode automatically re-uploads your image URLs to DashScope OSS first (DashScope's backend can't reliably fetch external CDN URLs). You don't need to do anything — just pass an https://... URL.Swap faces between two images. Provide source and target as base64-encoded strings.
| Parameter | Type | Required | Description |
|---|---|---|---|
| apiKey | string | required | Your SyncNode API key (from /api_keys) |
| input.source_image | string | required | Base64 source face image |
| input.target_image | string | required | Base64 target image |
| input.background_enhance | boolean | optional | Enhance background quality |
curl -X POST https://run.syncnode.ai/face-swap/run \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"input": {
"source_image": "BASE64_SOURCE_FACE...",
"target_image": "BASE64_TARGET_IMAGE...",
"background_enhance": true
}
}'/face-swap/status?job_id=... for the result.Poll for results of async jobs (image generation, face swap).
curl "https://run.syncnode.ai/prediction-status?job_id=b6nqrw6zbdrmc0cqwqbr8b3dm8"{
"job_id": "b6nqrw6zbdrmc0cqwqbr8b3dm8",
"replicate_status": "completed",
"output": "https://your-cdn.b-cdn.net/gen_abc123_1752140031948.png",
"updated": true
}| Status | Description |
|---|---|
in_progress | Job is still processing |
completed | Done — output contains the result URL |
failed | Failed — check error field |
in_progress.Check your current credit balance.
curl "https://run.syncnode.ai/balance?apiKey=__API_KEY__"{"balance": 4.96}Manage your provider API keys. Stored securely and used to authenticate to providers on your behalf.
{
"replicate_key": "r8_abc...",
"chatgpt_key": "sk-abc...",
"huggingface_key": "hf_abc...",
"openrouter_key": "sk-or-v1-abc..."
}curl -X POST https://run.syncnode.ai/api-keys \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{"apiKey": "__API_KEY__", "openrouter_key": "sk-or-v1-your-key-here"}'| Key Name | Provider | Used By |
|---|---|---|
openrouter_key | OpenRouter | /chat-completion |
chatgpt_key | OpenAI | /chatgpt-completion |
replicate_key | Replicate | /generate |
huggingface_key | Hugging Face | Usage tracking |
List, view, and manage your task history.
{
"tasks": [{
"id": 1, "job_id": "abc-123", "model": "openai/gpt-4o",
"prompt": "Explain AI", "status": "completed", "cost": 0.02,
"created_at": "2025-07-08T10:00:00Z"
}],
"page": 1, "size": 10, "total": 42
}View billing history, set auto-recharge thresholds, and manage payment methods.
| Endpoint | Method | Description |
|---|---|---|
/billing-history?apiKey={apiKey} | GET | Get charge history |
/billing-threshold?apiKey={apiKey} | GET | Get auto-recharge threshold |
/billing-threshold | POST | Set auto-recharge threshold |
/card?apiKey={apiKey} | GET | View saved payment card |
/topup_card | POST | Top up balance |
Test endpoints directly from this page. Your API key is auto-filled when signed in.
Use SyncNode from inside Claude Code with a single install. The official SyncNode skill teaches Claude every endpoint, the auth flow, polling lifecycle, and pricing — so you can scaffold integrations by describing what you want instead of reading docs.
When you ask Claude Code something like "add image generation to my app via SyncNode" or "use SyncNode to wire up chat completions", the skill loads automatically and gives Claude:
/generate, /chat-completion, /fal/generate, /alibaba/generate, /face-swap/run, /moderate)Clone into your user-level skills directory and it's available in every project:
git clone https://github.com/syncnode-ai/claude-skill.git ~/.claude/skills/syncnodeRestart Claude Code. The skill auto-loads when its trigger description matches your prompt.
Drop the SKILL.md (and examples/) into .claude/skills/syncnode/ inside your project. Anyone using Claude Code in that repo gets it.
In Claude Code, type /skills — syncnode should appear in the list. Then try:
Set me up to use SyncNode for image generationClaude should walk you through getting an API key, adding a Replicate provider credential, and scaffolding a working /generate call.
Source, examples, and contribution guidelines live on GitHub:
github.com/syncnode-ai/claude-skill
Direct link to the skill definition: SKILL.md
waitForCompletion() helper in both the JS and Python clients so you don't have to write polling loops for async jobs.Standard HTTP error codes returned by the API.
| Code | Meaning |
|---|---|
200 | Success |
400 | Bad request — missing or invalid parameters |
401 | Unauthorized — invalid or missing token |
402 | Payment required — insufficient balance, no card on file |
404 | Not found |
500 | Server error |
{"error": "Missing API key"}