Quickstart
Create a key, check credits, and poll your first process.
1. Create a team API key
Open Account → Developer, create a key, and save the secret immediately — Yapper only shows the full secret once.
Use the key as a bearer token:
export YAPPER_API_KEY="yap_live_..."2. Check credits
API requests spend the same workspace credits as the team.
curl https://yapper.so/api/v1/credits \
-H "Authorization: Bearer $YAPPER_API_KEY"{
"totalCredits": 5000,
"usedCredits": 1240,
"availableCredits": 3760,
"purchaseUrl": "https://yapper.so/account/usage?tab=credits"
}3. List models
curl https://yapper.so/api/v1/models \
-H "Authorization: Bearer $YAPPER_API_KEY"4. List and poll processes
Generations started in the Yapper app show up here too — the API and app share one team workspace.
curl "https://yapper.so/api/v1/processes?status=completed&limit=5" \
-H "Authorization: Bearer $YAPPER_API_KEY"Poll one process:
curl https://yapper.so/api/v1/processes/PROCESS_ID \
-H "Authorization: Bearer $YAPPER_API_KEY"Public statuses: queued, processing, completed, failed.
Completed response:
{
"id": "proc_abc123",
"type": "image-generation",
"status": "completed",
"model": "gpt-image-2",
"creditsUsed": 12,
"outputs": [
{
"type": "image",
"assetId": "asset_img_123",
"url": "https://...",
"width": 1024,
"height": 1024,
"duration": null,
"mimeType": "image/png"
}
],
"links": { "self": "/api/v1/processes/proc_abc123" }
}5. Start a process
POST /api/v1/processes starts a generation and spends team credits. Send an
Idempotency-Key header for retry-safe creation:
curl -X POST https://yapper.so/api/v1/processes \
-H "Authorization: Bearer $YAPPER_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: job_123" \
-d '{
"type": "image-generation",
"model": "gpt-image-2",
"input": {
"prompt": "A polished product photo of a stainless steel water bottle",
"aspectRatio": "1:1",
"resolution": "1080"
}
}'6. Upload local media and lip-sync it
For a local image, video, or audio file, create an upload ticket with
POST /api/v1/assets/uploads, PUT the raw bytes to its uploadUrl using
every returned header verbatim, then POST its completeUrl. The completed
response contains the asset id.
After uploading the source video and matched audio, quote the lip-sync without spending credits:
curl -X POST https://yapper.so/api/v1/processes \
-H "Authorization: Bearer $YAPPER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "video-lipsync",
"model": "sync-lipsync-v3",
"input": {
"sourceVideoAssetId": "video_asset_id",
"audioAssetId": "audio_asset_id"
},
"dryRun": true
}'The server uses the audio asset's measured duration for the exact quote. Send
the same body without dryRun and with a stable Idempotency-Key to start it.
Model behavior differs:
maxis train-once. OmittrainingIdon the first Max request; that run trains from the source video before generating and therefore takes longer. Poll the process, save the returnedtrainingId, and reuse it for faster later Max requests against the same trained source.lipdub-v2,pro, andsync-lipsync-v3are single-shot models. They require no training and should not receivetrainingId. For alipdub-v2source video longer than the safe 59-second cap, Yapper creates or reuses a cached variant containing its first 59 seconds.