Promoat.Partner API

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

kindProduced by
character_sheetPOST /characters
character_sheetPOST /characters/{id}/regenerate (a new sheet each time)
first_framePOST /images/first-frame, and video jobs that generate their own frame
tts_audioPOST /tts
videoCompleted 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

GET/api/partner/v1/assets
FieldTypeDescription
kindquery, enumFilter: character_sheet | first_frame | tts_audio | video.
limitquery, int ≤100Default 30.
offsetquery, intFor pagination, newest first.
Every video you've ever generated
curl "https://platform.promoat.ai/api/partner/v1/assets?kind=video&limit=10" \
  -H "Authorization: Bearer $PROMOAT_KEY"
Asset object
{
  "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

GET/api/partner/v1/assets/{id}

Same object by asset_id — handy when a job's result gave you an id and you want the full record later.

Try it

Try itGET/api/partner/v1/assetsfree
Add your API key in the sidebar to enable this.