Uploading footage

Send a screen recording or an image to Getuser.

Uploads go straight to storage in three steps. They are free, but count toward the plan's uploads a day and a month.

1. Ask for an upload URL

curl https://getuser.app/api/v1/uploads \
  -H "Authorization: Bearer $GETUSER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "kind": "demo", "filename": "onboarding.mp4", "mime_type": "video/mp4", "size": 18392011 }'
{
  "asset_id": "a81e…",
  "reused": false,
  "upload_url": "https://…supabase.co/storage/v1/object/upload/sign/…",
  "upload_headers": { "content-type": "video/mp4" },
  "expires_at": "2026-10-26T10:15:00Z"
}

Pass fingerprint (the file's SHA-256, 64 lowercase hex characters) to skip uploading a file Getuser already has: you get the existing asset_id, reused: true and upload_url: null.

Images can say which slide they are for with role (hook, app, background, icon). A long demo recording can be cut into parts with cuts (1–8), each its own demo.

2. Send the bytes

curl -X PUT "$UPLOAD_URL" -H "content-type: video/mp4" --data-binary @onboarding.mp4

3. Finish, then wait

curl -X POST https://getuser.app/api/v1/uploads/a81e…/complete \
  -H "Authorization: Bearer $GETUSER_API_KEY"

Getuser processes the file (trims, makes a poster). Poll GET /assets/a81e… until status is ready (usually within a minute), or rejected with a reject_reason.

Limits

  • Videos up to 200 MB, images up to 10 MB. HEIC photos are not taken: export JPG or PNG.
  • kind is one of demo, hook, ending, image, music.
  • The plan sets how many uploads a day and a month: uploads_used (422); bigger files answer too_large (413).
  • Uploads that go unused are kept for the plan's period (see the pricing page); finished videos are kept until the founder deletes them.

From chat

Claude and ChatGPT in the browser cannot send file bytes. A founder using them uploads new footage in the app; the chat then uses it.

On this page