Yapper API

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:

  • max is train-once. Omit trainingId on the first Max request; that run trains from the source video before generating and therefore takes longer. Poll the process, save the returned trainingId, and reuse it for faster later Max requests against the same trained source.
  • lipdub-v2, pro, and sync-lipsync-v3 are single-shot models. They require no training and should not receive trainingId. For a lipdub-v2 source video longer than the safe 59-second cap, Yapper creates or reuses a cached variant containing its first 59 seconds.

On this page