Getting started
Quickstart
This is the whole loop. Before you start you need a recording in Personade with a usable voice, and an API key that is allowed to write.
1. Find a recording
Use one where usable is true. If it is false, blockedReason says what to fix, and generating on it would be refused later anyway.
curl https://app.personade.com/api/v1/templates \ -H "Authorization: Bearer $PERSONADE_KEY"{
"templates": [
{
"id": "9f1c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
"name": "Founder intro, 40s",
"usable": true,
"createdAt": "2026-08-02T09:14:22.000Z"
}
]
}2. Start a campaign
curl https://app.personade.com/api/v1/campaigns \ -H "Authorization: Bearer $PERSONADE_KEY" \ -H "Content-Type: application/json" \ -d '{ "templateId": "9f1c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f", "name": "Series A ops leads", "goal": "Heads of RevOps who opened the pricing page" }'{
"id": "3b7e5a12-9c04-4f2a-b6d1-77e8c9a0f4b2",
"name": "Series A ops leads",
"templateId": "9f1c2d3e-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
"status": "draft"
}3. Add people
One at a time or up to a thousand per call. Nothing is charged here, so a table can fill up over a morning and be reviewed once.
curl https://app.personade.com/api/v1/campaigns/3b7e5a12-9c04-4f2a-b6d1-77e8c9a0f4b2/leads \ -H "Authorization: Bearer $PERSONADE_KEY" \ -H "Content-Type: application/json" \ -d '{ "people": [ { "firstName": "Jonny", "company": "Northwind", "email": "jonny@northwind.com", "website": "https://northwind.com", "role": "Head of RevOps" } ] }'{
"added": 1, "skipped": 0, "total": 1,
"people": [
{ "id": "b77d0a89-e98f-46a0-a3f3-efadddacb434",
"firstName": "Jonny", "company": "Northwind",
"url": "https://vid.personade.com/p/jonny-lbGRs_NOzRrpuOU4",
"videoUrl": "https://vid.personade.com/p/jonny-lbGRs_NOzRrpuOU4/video" }
]
}The link is already live. It shows a personalized holding screen with their name until the render lands, then becomes the video at the same URL, so you can write it into your own system on this first call.
skipped counts people already in this campaign. They are not added twice, because twice would be a second video and a second credit, but they still come back in people with the id and URL they already had. Re-running is safe.
You can also set this person's own button and headline here, with ctaLabel, ctaUrl and headline. They merge over the recording's. See the reference.
4. Check what it would cost
A range, not a number. Only people who have never been rendered are charged for, and the verified-email surcharge is collected once per campaign by whichever render happens first. Branch on affordable, which compares the high end against your balance.
curl https://app.personade.com/api/v1/campaigns/3b7e5a12-9c04-4f2a-b6d1-77e8c9a0f4b2/estimate \ -H "Authorization: Bearer $PERSONADE_KEY"{ "leads": 40, "low": 40, "high": 48, "balance": 210, "affordable": true }5. Preview, and actually watch one
Renders the first few, so you can watch one before the rest run.
curl -X POST https://app.personade.com/api/v1/campaigns/3b7e5a12-9c04-4f2a-b6d1-77e8c9a0f4b2/preview \ -H "Authorization: Bearer $PERSONADE_KEY"6. Generate the rest
Charges for everyone still waiting and starts the renders.
curl -X POST https://app.personade.com/api/v1/campaigns/3b7e5a12-9c04-4f2a-b6d1-77e8c9a0f4b2/generate \ -H "Authorization: Bearer $PERSONADE_KEY"{ "campaignId": "3b7e5a12-9c04-4f2a-b6d1-77e8c9a0f4b2", "started": 40, "creditsCharged": 48 }7. Poll, then collect the links
Videos render on a queue and take a minute or two each, so ask for status before you ask for links. Poll every 30 seconds or so. If stalled appears, our side has stopped moving and polling harder will not help.
curl https://app.personade.com/api/v1/campaigns/3b7e5a12-9c04-4f2a-b6d1-77e8c9a0f4b2 \ -H "Authorization: Bearer $PERSONADE_KEY"{
"id": "3b7e5a12-9c04-4f2a-b6d1-77e8c9a0f4b2",
"name": "Series A ops leads",
"status": "generating",
"counts": { "total": 40, "pending": 0, "rendering": 12, "complete": 28,
"failed": 0, "cancelled": 0, "skipped": 0 },
"stages": { "lipsync": 9, "compose": 3 }
}For one person, ask about that person rather than filtering the campaign:
curl https://app.personade.com/api/v1/leads/b77d0a89-e98f-46a0-a3f3-efadddacb434 \ -H "Authorization: Bearer $PERSONADE_KEY"{ "id": "b77d0a89-...", "firstName": "Jonny", "company": "Northwind",
"status": "complete", "videoReady": true,
"url": "https://vid.personade.com/p/jonny-lbGRs_NOzRrpuOU4",
"videoUrl": "https://vid.personade.com/p/jonny-lbGRs_NOzRrpuOU4/video" }Or take the whole campaign at once.
curl https://app.personade.com/api/v1/campaigns/3b7e5a12-9c04-4f2a-b6d1-77e8c9a0f4b2/videos \ -H "Authorization: Bearer $PERSONADE_KEY"{
"videos": [
{
"firstName": "Jonny",
"company": "Northwind",
"url": "https://vid.personade.com/p/jonny-northwind-UiZZ3qsUxkl8hKY",
"videoUrl": "https://vid.personade.com/p/jonny-northwind-UiZZ3qsUxkl8hKY/video"
}
]
}Send url, the page. It carries the personalization around the video and the watch tracking, and a link survives an inbox in a way an attached MP4 does not. videoUrl is the file, for when you want to watch one yourself.
Start building
Ready to build?
Make a key in Personade,
or have us walk you through the integration on a call.