Review demo · endpoints match production (api.platform.wayshot.ai · wsk_live_ · Svix webhook)

Integrate in 5 minutes

Generation is an async job: submit to get a job_id, then poll or use a webhook to fetch the result. Base URL: https://api.platform.wayshot.ai

Fastest: integrate with AI

Developers write code with AI now. Copy this prompt, paste it into Cursor / Claude / Copilot, and it generates the full integration.

ai-integration-prompt
Integrate the WayShot digi image API.
Base URL https://api.platform.wayshot.ai
Auth header "Authorization: Bearer $WAYSHOT_API_KEY".
Create job: POST /v1/jobs {"capability":"digi","image":"","params":{"resolution":"1K"}}.
Poll GET /v1/jobs/{job_id} with backoff 2s,5s,10s until succeeded | failed | rejected.
On succeeded read output.url (JPEG). Only succeeded is billed.
Errors: 401 invalid_api_key, 402 insufficient_balance, 422 image_unavailable / content_rejected, 429 rate_limited, 503 model_unavailable.

1 · Create an API key

Create one in Console → API Keys. The secret is shown once (format wsk_live_…). Revoking takes effect immediately.

env
export WAYSHOT_API_KEY="wsk_live_xxx"

2 · Authentication

Send Authorization: Bearer <WAYSHOT_API_KEY> with every request.

3 · Upload an image (optional)

You can pass a public image URL directly, or use the upload channel to get an upload:// reference (jpeg/png/webp, ≤10MB).

POST /v1/uploads
curl -X POST https://api.platform.wayshot.ai/v1/uploads \
  -H "Authorization: Bearer $WAYSHOT_API_KEY"
# → { "upload_id":"...", "put_url":"...", "image_ref":"upload://..." }
# then PUT your file to put_url within 15 minutes

4 · Create a job

POST /v1/jobs
curl -X POST https://api.platform.wayshot.ai/v1/jobs \
  -H "Authorization: Bearer $WAYSHOT_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "capability": "digi",
    "image": "https://your.cdn/portrait.jpg",
    "params": { "resolution": "1K" },
    "webhook_url": "https://your.app/hook"
  }'
# → { "job_id":"job_8f2a91", "status":"queued" }

5 · Fetch the result (polling)

GET /v1/jobs/{job_id}
curl https://api.platform.wayshot.ai/v1/jobs/job_8f2a91 \
  -H "Authorization: Bearer $WAYSHOT_API_KEY"
# → { "status":"succeeded",
#     "output":{ "url":"https://out.../job_8f2a91.jpg" },
#     "billed":true }

output.url is signed for 1 hour, outputs kept 30 days; input.url expires after 24 hours.

6 · Webhook

If you pass webhook_url, we POST an image.completed event when the job finishes. Verify with the Svix standard signature (svix-id / svix-timestamp / svix-signature); failures retry with exponential backoff; dedupe on svix-id.

Request body

FieldRequiredNotes
capabilityYesWhich capability to run — see below
imageYesPublic URL or upload:// reference
paramsDependsCapability-specific params (see Capabilities)
webhook_urlNoCompletion callback; omit to poll
Idempotency-KeyNoHeader; reuse the same key to dedupe

Capabilities

Every capability shares the same POST /v1/jobs endpoint. To run a different one you only change the capability value and its capability-specific params — everything else (auth, fetch, webhook, errors, billing) is identical. New capabilities are documented here, one block each.

All capabilities share resolution 1K/2K and $0.10 / $0.15 per successful output. Non-digi identifiers are illustrative.

capability: "digi"LiveStyles

Digicam portrait editing. params: resolution = 1K (default) | 2K. input: a photo. output: JPEG. pricing: 1K $0.10 / 2K $0.15.

capability: "digix"LiveStylesresolution 1K/2K · $0.10 / $0.15
capability: "redlight"LiveStylesresolution 1K/2K · $0.10 / $0.15
capability: "golden_hour"Coming soonStyles
capability: "watermark_removal"LiveEditresolution 1K/2K · $0.10 / $0.15
capability: "photo_restoration"LiveEditresolution 1K/2K · $0.10 / $0.15
capability: "upscale"Coming soonEdit

Job statuses

statusMeaningBilled
queuedQueuedNo
processingGeneratingNo
succeededDone, returns outputYes
failedGeneration failedNo
rejectedRejected by moderationNo

Errors

HTTPcodeRetryableNotes
401invalid_api_keyNoMissing / revoked key
402insufficient_balanceNoBalance depleted
422image_unavailableYesImage URL unreachable
422content_rejectedNoPolicy violation
429rate_limitedYesRespect Retry-After
503model_unavailableYesService temporarily down

Processing limits (v1)

2 concurrent jobs per account (shared across keys); up to 25 in-flight; 10 write req/s and 30 read req/s per key.

Billing rules

Billed on success: the cost is held on job creation, charged on succeeded, and fully released on failed / rejected. 1K $0.10 / 2K $0.15. Prepaid via Stripe, no subscription.