JanuslySign up
API reference

Quickstart

Upload a reference image, render a ten-second video from it, and poll until it's ready — the whole flow is three requests.

Before you start

You need an API key from Account → API keys (any paid plan). Export it as JANUSLY_API_KEY in your shell — details in Authentication.

1. Upload a reference image

curl
curl -X POST https://janusly.com/api/v1/uploads \
  -H "Authorization: Bearer $JANUSLY_API_KEY" \
  -F kind=image -F file=@product.jpg
response
{ "url": "https://…/uploads/….jpg", "kind": "image", "contentType": "image/jpeg", "bytes": 482133 }

Only URLs returned by the uploads endpoint are accepted as references in render requests.

2. Start a render

curl
curl -X POST https://janusly.com/api/v1/renders \
  -H "Authorization: Bearer $JANUSLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "video",
    "model": "kling",
    "prompt": "Slow push-in on the bottle, condensation beading, golden hour",
    "durationSeconds": 10,
    "referenceImageUrls": ["https://…/uploads/….jpg"]
  }'
response — 202 Accepted
{
  "id": "b3f1…",
  "ids": ["b3f1…"],
  "batchId": null,
  "kind": "video",
  "status": "pending",
  "renderModel": "kling-720p",
  "creditsCharged": 200
}

3. Poll until ready

curl
curl https://janusly.com/api/v1/renders/$RENDER_ID \
  -H "Authorization: Bearer $JANUSLY_API_KEY"
response
{
  "id": "b3f1…",
  "kind": "video",
  "status": "ready",
  "renderModel": "kling-720p",
  "outputUrl": "https://…/renders/….mp4",
  "errorMessage": null,
  "creditsRefunded": 0,
  "createdAt": "2026-07-16T09:12:03.000Z",
  "updatedAt": "2026-07-16T09:14:41.000Z"
}

status moves pending → running → ready (or failed, with an automatic refund). Poll every few seconds — images typically finish in under a minute, videos in one to several minutes depending on model and duration. Status polls are limited to 60 per minute; see Errors & limits.