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 UID (User ID). Some endpoints also require a Bearer token (your Supabase JWT). Your UID is on your API Keys page.
Include both uid 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 '{"uid": "__UID__"}'These only need your uid — 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.01 |
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 |
|---|---|---|---|
| uid | string | required | Your user ID |
| 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 '{
"uid": "__UID__",
"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({
uid: "__UID__",
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={
"uid": "__UID__",
"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{
"uid": "__UID__",
"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 '{"uid": "__UID__", "text": "Check if this text is safe"}'curl -X POST "https://moderate.syncnode.ai" \
-H "Content-Type: application/json" \
-d '{"uid": "__UID__", "imageUrl": "https://example.com/image.jpg"}'curl -X POST "https://moderate.syncnode.ai" \
-H "Content-Type: application/json" \
-d '{
"uid": "__UID__",
"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 |
|---|---|---|---|
| uid | string | required | Your user ID |
| 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 '{
"uid": "__UID__",
"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({
uid: "__UID__",
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={
"uid": "__UID__",
"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,
"uid": "__UID__",
"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 '{
"uid": "__UID__",
"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.
| Parameter | Type | Required | Description |
|---|---|---|---|
| uid | string | required | Your user ID |
| 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 '{
"uid": "__UID__",
"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 '{
"uid": "__UID__",
"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.Swap faces between two images. Provide source and target as base64-encoded strings.
| Parameter | Type | Required | Description |
|---|---|---|---|
| uid | string | required | Your user ID |
| 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 '{
"uid": "__UID__",
"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?uid=__UID__"{"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 '{"uid": "__UID__", "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?uid={uid} | GET | Get charge history |
/billing-threshold?uid={uid} | GET | Get auto-recharge threshold |
/billing-threshold | POST | Set auto-recharge threshold |
/card?uid={uid} | GET | View saved payment card |
/topup_card | POST | Top up balance |
Test endpoints directly from this page. Your UID is auto-filled when signed in.
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 uid parameter"}