If it happens in the studio, it happens over the API.
The dashboard is a client of the same API you get. There is no second class public surface, and no capability that only exists behind the interface.
Read the docscurl -X POST https://api.ugcpacks.com/v1/campaigns \
-H "Authorization: Bearer $UGC_PACKS_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"name": "Spring launch",
"personaId": "per_8fa2...",
"productId": "prd_31bc...",
"formatProfileId": "UGC_TESTIMONIAL",
"aspectRatio": "9:16"
}'A retry never charges you twice.
Creation endpoints take an idempotency key. Send the same key with the same body and you get the same campaign back rather than a second one. On a surface where every duplicate costs real generation spend, that is not a nicety.
Generation takes minutes. The API is built for that.
Nothing blocks on a video finishing. Start the work, then either poll the status URL you were handed or wait on the event.
// Live job updates over server sent events
const { token } = await api.post('/v1/jobs/stream-token')
const es = new EventSource(
`https://api.ugcpacks.com/v1/jobs/stream?token=${token}`
)
es.onmessage = (e) => {
const jobs = JSON.parse(e.data)
jobs.forEach(j => console.log(j.jobType, j.lastKnownStatus))
}// Or let us call you when it is done
export async function POST(req: Request) {
const event = await req.json()
if (event.type === 'creative.completed') {
await publish(event.data.videoUrl)
}
return new Response(null, { status: 204 })
}Visibility while it runs.
One job list, every type
Character sheets, looks, campaigns, sequences and renders all report into a single job view with live status rather than a status field per resource.
Cancellable
Stop a job in flight. The API is honest that this does not refund provider spend already committed.
Traceable
Every generated asset records which provider and model produced it, which matters for AI disclosure requirements.
Build it into your own product.
Get a key on the Pro plan and generate creative straight from your catalogue.