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.
Any Replicate, FAL, Alibaba, or BytePlus 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 /fal/generate · GET /fal/statusPOST /alibaba/generate · GET /alibaba/statusPOST /byteplus/generate · GET /byteplus/status · POST /byteplus/image · POST /byteplus/assetPOST /face-swap/run · GET /face-swap/statusGET /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 |
| Image / Video Generation (FAL) | $0.02 |
| Image / Video Generation (Alibaba DashScope) | $0.02 |
| Video Generation (BytePlus Seedance) | $0.02 |
| Image Generation (BytePlus Seedream) | $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.Run Dreamina / Seedance models through BytePlus Ark. Generation is async — submit a task, then poll until it completes. Results auto-upload to your configured CDN host. Requires a BytePlus API key (an ark-... key) saved under Provider Credentials.
| Parameter | Type | Required | Description |
|---|---|---|---|
| apiKey | string | required | Your SyncNode API key (from /api_keys) |
| model | string | required | Ark model ID (e.g. dreamina-seedance-2-0-260128) |
| content | array | required | Content parts, e.g. [{ "type": "text", "text": "..." }] |
| resolution | string | optional | e.g. 720p, 1080p |
| ratio | string | optional | Aspect ratio, e.g. 16:9 |
| duration | number | optional | Video length in seconds |
| watermark | boolean | optional | Whether to watermark output |
Any additional fields are forwarded to Ark unchanged, so model-specific options work without SyncNode updates.
curl -X POST https://run.syncnode.ai/byteplus/generate \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"model": "dreamina-seedance-2-0-260128",
"content": [
{ "type": "text", "text": "A cat playing in a sunny garden" }
],
"resolution": "720p",
"ratio": "16:9",
"duration": 5,
"watermark": false
}'{
"success": true,
"job_id": "1f4a...",
"provider_job_id": "cgt-20260716072325-5897s",
"task_status": "running",
"status": "in_progress"
}curl "https://run.syncnode.ai/byteplus/status?job_id=1f4a..."| Status | Description |
|---|---|
queued / running | Task is processing (video gen typically takes 2–4 minutes) |
succeeded | Done — output contains the final URL (uploaded to your CDN host if configured) |
failed / cancelled | Failed — check output for the error message |
/byteplus/status. Manual polling just makes it faster.Seedream image models use a separate synchronous endpoint — the response contains the image directly (no polling). SyncNode charges, re-hosts the image to your CDN, and returns it in one call.
curl -X POST https://run.syncnode.ai/byteplus/image \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"model": "dola-seedream-5-0-pro-260628",
"prompt": "A red vintage bicycle leaning on a white wall, golden hour",
"size": "2K",
"response_format": "url",
"watermark": false
}'
# → { "success": true, "job_id": "...", "status": "completed", "output": "https://your-cdn/..." }Uses the same BytePlus (Ark) key as video. Any extra fields (e.g. n, seed) are forwarded to BytePlus unchanged. Request n>1 and output comes back as an array of URLs.
4K) can exceed BytePlus's ~100s request limit and return HTTP 524. Keep sizes reasonable (1K/2K) or retry; SyncNode surfaces the timeout as an error rather than hanging.Seedance blocks raw photos of real people. To animate an actual person, first upload their photo to your BytePlus Virtual Avatar / Real-Human Portrait Library to get an asset:// ID, then reference that ID when generating. SyncNode proxies the (AK/SK-signed) library APIs so you never call BytePlus directly.
ark-… generation key). Add your Access Key + Secret Access Key under Provider Credentials → BytePlus Asset Library (AK:SK). You also need BytePlus Advanced Creation Rights activated on your account.| Parameter | Type | Required | Description |
|---|---|---|---|
| apiKey | string | required | Your SyncNode API key |
| action | string | required | Asset Library Action (see list below) |
| params | object | required | The Action's request body, passed to BytePlus verbatim |
Actions: CreateAssetGroup, CreateAsset, GetAsset, GetAssetGroup, ListAssets, ListAssetGroups, UpdateAsset, UpdateAssetGroup, DeleteAsset, DeleteAssetGroup. The Real-Human Portrait Library uses the same route (set its GroupType in params).
curl -X POST https://run.syncnode.ai/byteplus/asset \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"action": "CreateAssetGroup",
"params": { "Name": "person_jane", "ProjectName": "default" }
}'
# → { "Result": { "Id": "group-..." } }curl -X POST https://run.syncnode.ai/byteplus/asset \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"action": "CreateAsset",
"params": {
"GroupId": "group-...",
"URL": "https://your-cdn.com/jane-photo.jpg",
"AssetType": "Image",
"ProjectName": "default"
}
}'
# → { "Result": { "Id": "asset-..." } }Photo rules (else Status: Failed): jpeg/png/webp/bmp/tiff/gif/heic, aspect ratio 0.4–2.5, 300–6000 px, <30 MB, clear frontal face. AssetType can be Image, Video, or Audio.
curl -X POST https://run.syncnode.ai/byteplus/asset \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"action": "GetAsset",
"params": { "Id": "asset-...", "ProjectName": "default" }
}'Result.Status | Meaning |
|---|---|
Processing | Still preprocessing — keep polling |
Active | Ready — the asset ID can be used for generation |
Failed | Rejected (photo didn't meet requirements) |
Use the existing /byteplus/generate endpoint. Put asset://<asset-id> in content[].image_url.url with role: "reference_image", and refer to it positionally in the prompt ("Image 1") — never by ID.
curl -X POST https://run.syncnode.ai/byteplus/generate \
-H "Content-Type: application/json" \
-d '{
"apiKey": "__API_KEY__",
"model": "dreamina-seedance-2-0-260128",
"content": [
{ "type": "text", "text": "The person in Image 1 waves and smiles in a sunlit park" },
{ "type": "image_url", "role": "reference_image", "image_url": { "url": "asset://asset-..." } }
],
"ratio": "16:9", "duration": 5, "watermark": false
}'
# → { "job_id": "..." } then poll GET /byteplus/status?job_id=... → CDN-hosted video"default") — a mismatch causes "asset not found." Asset-library calls are not billed by SyncNode; generation is $0.02 as usual.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...",
"alibaba_key": "sk-abc...",
"fal_key": "abc123:def456...",
"byteplus_key": "ark-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 |
fal_key | FAL | /fal/generate |
alibaba_key | Alibaba Cloud (DashScope) | /alibaba/generate |
byteplus_key | BytePlus (Ark) | /byteplus/generate |
byteplus_aksk | BytePlus Asset Library (AK:SK) | /byteplus/asset |
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, /byteplus/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"}