Your account
Assets
Every output you generate — character sheets, first frames, TTS audio, finished videos — lands in one durable ledger with a stable URL. Lose a response? The asset is still here.
What lands here
| kind | Produced by |
|---|---|
character_sheet | POST /characters |
character_sheet | POST /characters/{id}/regenerate (a new sheet each time) |
first_frame | POST /images/first-frame, and video jobs that generate their own frame |
tts_audio | POST /tts |
video | Completed video jobs — talking head, scenes, and edits |
Asset URLs are public CDN links with unguessable paths — safe to hand straight to your own app or player, no extra auth step. They're long-lived; still, most partners copy finished videos into their own storage as part of their pipeline.
List assets
| Field | Type | Description |
|---|---|---|
| kind | query, enum | Filter: character_sheet | first_frame | tts_audio | video. |
| limit | query, int ≤100 | Default 30. |
| offset | query, int | For pagination, newest first. |
curl "https://platform.promoat.ai/api/partner/v1/assets?kind=video&limit=10" \
-H "Authorization: Bearer $PROMOAT_KEY"{
"asset_id": "7f3f9a2c-…",
"kind": "video",
"url": "https://…/video.mp4",
"workflow_id": "partner_h3v_5d0e…", // which job made it (null for instant outputs)
"character_id": "0b2f1c3e-…", // who's in it, when applicable
"voice_id": null,
"metadata": {
"poster_url": "https://…/poster.jpg",
"duration_sec": 15.2,
"resolution": "768P",
"video_type": "moving_scene",
"video_mode": "reference",
"voice_mode": "voice",
"scene_count": 3,
"price_table_version": "2026-09-30"
},
"created_at": "2026-07-08T04:31:02.114Z"
}The cross-references are the useful part: workflow_id ties an asset back to its job (and therefore its cost), character_id/voice_id tie it to the identity that made it.
Video metadata may include poster_url, duration_sec, resolution, video_type, video_mode, voice_mode, scene_count, source_workflow_id and edit_kind (on edits), and price_table_version. Character sheets carry mode, presenter_gender and head_covering; first frames video_type and head_covering. Treat every key as optional.
Get one asset
Same object by asset_id — handy when a job's result gave you an id and you want the full record later.