Getting started

Get a key and make your first video in four calls.

1. Get a key

In Getuser, open Settings › Connect to AI › For developers and click New key. Copy it: it starts with gu_ and is shown once.

export GETUSER_API_KEY="gu_..."

Check it works:

curl https://getuser.app/api/v1/health/auth \
  -H "Authorization: Bearer $GETUSER_API_KEY"
# {"ok":true}

2. See your account

curl https://getuser.app/api/v1/me -H "Authorization: Bearer $GETUSER_API_KEY"
{
  "workspace": { "id": "…", "name": "Acme" },
  "app_name": "Acme Notes",
  "plan": "pro",
  "credits": {
    "balance": 2350,
    "held": 0,
    "resets_at": "2026-11-18T00:00:00Z",
    "daily": false,
    "video_cost": 25,
    "slideshow_cost": 25
  },
  "storage": { "used_bytes": 1830000000, "limit_bytes": 20000000000 },
  "setup": {
    "videos": { "ready": true, "missing": [] },
    "slideshows": { "ready": false, "missing": ["images"] }
  },
  "key": { "id": "…" }
}

setup has one gate for videos and one for slideshows. Videos need the app's profile, 5 demos and the founder's own reaction; slideshows need the app's profile and 5 images. If a gate is not ready, the founder adds what its missing lists (app, demos, reaction, images) in the app first.

3. Plan, for free

POST /videos/plan renders nothing and costs nothing. It returns the drafts the Batch page would make, and the cost.

curl https://getuser.app/api/v1/videos/plan \
  -H "Authorization: Bearer $GETUSER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "format": "hook-demo", "count": 3, "lines": "all", "music": true, "theme": "white" }'
{
  "drafts": [
    {
      "format": "hook-demo",
      "pattern_id": "p07",
      "hook_text": "POV: you finally found a notes app that keeps up",
      "ending_text": "Acme Notes",
      "clip_id": "…",
      "hook_asset_id": null,
      "demo_id": "…",
      "ending_id": "…",
      "track": { "id": "…", "source": "stock" },
      "theme": "white",
      "ai_label": true,
      "keep_audio": false
    }
  ],
  "cost": 75,
  "credits_after": 2275,
  "note": null
}

4. Render, then wait

Send the drafts back with an Idempotency-Key, so a retry never makes twins:

curl https://getuser.app/api/v1/videos \
  -H "Authorization: Bearer $GETUSER_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{ "drafts": [ … the drafts from step 3 … ] }'
{ "batch_id": "…", "videos": [{ "id": "6f1c…", "status": "queued" }], "refused": null, "credits_held": 75 }

Check each video until it is ready (most take 1–3 minutes):

curl https://getuser.app/api/v1/videos/6f1c… -H "Authorization: Bearer $GETUSER_API_KEY"
{
  "id": "6f1c…",
  "format": "hook-demo",
  "status": "ready",
  "error_code": null,
  "error": null,
  "hook_text": "POV: you finally found a notes app that keeps up",
  "persona_id": "…",
  "batch_id": "…",
  "created_at": "2026-10-26T09:12:44Z",
  "poster_url": "https://…",
  "download_url": "https://…",
  "credits": 25
}

download_url works for one hour; read the video again for a fresh one. The video is also on the founder's Videos page.

Next

On this page