Video Intros · Best for custom applications
Create a Video Intro
POST/v1/video-intros
Use this when your application decides what the Video Intro is: who records it, who it is for, what it says and who delivers it. No touchpoint is involved. It runs through the same creation engine as a touchpoint event.
Authentication
A bearer API key. Authentication.
Headers
AuthorizationstringrequiredBearer followed by your API key. A test key works in the test environment only.
Idempotency-KeystringrequiredA value that is the same every time you send THIS event, and different for every other event.
Content-Typestringrequiredapplication/json
Request body
memberobjectrequiredThe person on your team who records the video. Identify them by any one of these; Video Intros resolves the member in the organization.
3 fields in
memberidstringThe member's Video Intros identifier, from GET /v1/members.
external_idstringYour own identifier for this person, as stored on the member.
emailstringThe member's email address. If more than one member has it, the request is refused with member_ambiguous.
recipientobjectrequiredThe customer the Video Intro is for.
3 fields in
recipientfirst_namestringrequiredUsed in the script and on the page.
last_namestringOptional.
phonestringrequiredMobile number in E.164 form, for example +12405550100.
referenceobjectThe record in your system this is about. Stored with the Video Intro and returned on every event, so you can match it back.
3 fields in
referencesourcestringThe system the record lives in, for example your_crm.
typestringWhat kind of record: appointment, job, deal, contact.
idstringIts identifier in that system.
contextobjectWhat the page says the video is about.
2 fields in
contexttitlestringThe line above the video.
appointmentobjectWhen the moment has a date and time.
2 fields in
appointmentstarts_atstringISO 8601 date and time.
timezonestringIANA time zone, for example America/New_York.
instructionsobjectWhat the member is asked to say.
1 field in
instructionsscriptstringThe words shown to the member while recording. About 15 seconds.
deliveryobjectWho gets the finished Video Intro to the recipient.
1 field in
deliveryresponsibilitystringintegration (the default): Video Intros prepares the Video Intro and your system delivers the link. video_intros: Video Intros sends it to the recipient.
metadataobjectUp to a few of your own key and value pairs. Stored and returned, never interpreted.
Errors
| Status | Code | When |
|---|---|---|
401 | unauthorized | The API key is missing, malformed or revoked. |
409 | idempotency_conflict | This Idempotency-Key was already used with a different body. |
422 | validation_failed | A required field is missing or malformed. The response names the field. |
422 | member_not_found | No active member matches the member you named. |
422 | member_ambiguous | More than one member has that email address. Send the member's id or external_id instead. |
429 | rate_limited | Too many requests. Wait for the time in Retry-After and send again with the same Idempotency-Key. |
curl -X POST https://api.videointros.com/v1/video-intros \
-H "Authorization: Bearer $VIDEO_INTROS_API_KEY" \
-H "Idempotency-Key: your_app:order_981:intro" \
-H "Content-Type: application/json" \
-d '{
"member": {
"email": "[email protected]"
},
"recipient": {
"first_name": "Andrea",
"last_name": "Smith",
"phone": "+12405550100"
},
"reference": {
"source": "your_app",
"type": "order",
"id": "order_981"
},
"context": {
"title": "Your kitchen consultation",
"appointment": {
"starts_at": "2026-10-06T18:00:00Z",
"timezone": "America/New_York"
}
},
"instructions": {
"script": "Hi Andrea, I\u0027m Anthony. I\u0027ll be the one coming out tomorrow at 2:00 PM. I wanted you to see a friendly face before I get there."
},
"delivery": {
"responsibility": "integration"
},
"metadata": {
"order_id": "order_981"
}
}'
const response = await fetch("https://api.videointros.com/v1/video-intros", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VIDEO_INTROS_API_KEY}`,
"Idempotency-Key": "your_app:order_981:intro",
"Content-Type": "application/json",
},
body: JSON.stringify({
"member": {
"email": "[email protected]"
},
"recipient": {
"first_name": "Andrea",
"last_name": "Smith",
"phone": "+12405550100"
},
"reference": {
"source": "your_app",
"type": "order",
"id": "order_981"
},
"context": {
"title": "Your kitchen consultation",
"appointment": {
"starts_at": "2026-10-06T18:00:00Z",
"timezone": "America/New_York"
}
},
"instructions": {
"script": "Hi Andrea, I'm Anthony. I'll be the one coming out tomorrow at 2:00 PM. I wanted you to see a friendly face before I get there."
},
"delivery": {
"responsibility": "integration"
},
"metadata": {
"order_id": "order_981"
}
}),
});
const result = await response.json();
import os, requests
response = requests.post(
"https://api.videointros.com/v1/video-intros",
headers={
"Authorization": f"Bearer {os.environ['VIDEO_INTROS_API_KEY']}",
"Idempotency-Key": "your_app:order_981:intro",
},
json={
"member": {
"email": "[email protected]",
},
"recipient": {
"first_name": "Andrea",
"last_name": "Smith",
"phone": "+12405550100",
},
"reference": {
"source": "your_app",
"type": "order",
"id": "order_981",
},
"context": {
"title": "Your kitchen consultation",
"appointment": {
"starts_at": "2026-10-06T18:00:00Z",
"timezone": "America/New_York",
},
},
"instructions": {
"script": "Hi Andrea, I'm Anthony. I'll be the one coming out tomorrow at 2:00 PM. I wanted you to see a friendly face before I get there.",
},
"delivery": {
"responsibility": "integration",
},
"metadata": {
"order_id": "order_981",
},
},
)
result = response.json()
{
"id": "vi_5b0e7c1e-2a64-4d0f-9b1c-7d2f6a8e9c10",
"object": "video_intro",
"status": "requested",
"touchpoint": null,
"member": {
"id": "mem_3f9a1c27",
"external_id": "rep_456",
"first_name": "Anthony",
"last_name": "Baker"
},
"recipient": {
"first_name": "Andrea",
"last_name": "Smith",
"phone": "+12405550100"
},
"reference": {
"source": "your_app",
"type": "order",
"id": "order_981"
},
"delivery": {
"responsibility": "integration",
"recipient_url": null
},
"metadata": {
"order_id": "order_981"
},
"environment": "test",
"created_at": "2026-10-05T17:40:01Z"
}
{
"error": {
"code": "idempotency_conflict",
"message": "This Idempotency-Key was already used with a different body."
}
}