Get started
Send your first Video Intro
Three steps: a key, a touchpoint, one request. This walks the touchpoint path, the one a CRM integration uses.
Get your API key
Start with a test key. It is sent as a bearer token on every request. More on keys.
Header Authorization: Bearer vi_test_••••••••••••Choose a touchpoint
A touchpoint is a business moment the organization has configured. List them with GET /v1/touchpoints and use the slug.
Touchpoint slug new_appointmentTrigger it
Say who it is for, who records it and what it refers to in your system. The Idempotency-Key makes a retry safe.
POST /v1/touchpoint-events curl -X POST https://api.videointros.com/v1/touchpoint-events \ -H "Authorization: Bearer $VIDEO_INTROS_API_KEY" \ -H "Idempotency-Key: your_crm:appointment_123:new_appointment" \ -H "Content-Type: application/json" \ -d '{ "touchpoint": "new_appointment", "occurred_at": "2026-10-05T17:40:00Z", "member": { "external_id": "rep_456" }, "recipient": { "first_name": "Andrea", "last_name": "Smith", "phone": "+12405550100" }, "reference": { "source": "your_crm", "type": "appointment", "id": "appointment_123" }, "context": { "appointment": { "starts_at": "2026-10-06T18:00:00Z", "timezone": "America/New_York" } }, "metadata": { "job_id": "job_789" } }'const response = await fetch("https://api.videointros.com/v1/touchpoint-events", { method: "POST", headers: { Authorization: `Bearer ${process.env.VIDEO_INTROS_API_KEY}`, "Idempotency-Key": "your_crm:appointment_123:new_appointment", "Content-Type": "application/json", }, body: JSON.stringify({ "touchpoint": "new_appointment", "occurred_at": "2026-10-05T17:40:00Z", "member": { "external_id": "rep_456" }, "recipient": { "first_name": "Andrea", "last_name": "Smith", "phone": "+12405550100" }, "reference": { "source": "your_crm", "type": "appointment", "id": "appointment_123" }, "context": { "appointment": { "starts_at": "2026-10-06T18:00:00Z", "timezone": "America/New_York" } }, "metadata": { "job_id": "job_789" } }), }); const result = await response.json();import os, requests response = requests.post( "https://api.videointros.com/v1/touchpoint-events", headers={ "Authorization": f"Bearer {os.environ['VIDEO_INTROS_API_KEY']}", "Idempotency-Key": "your_crm:appointment_123:new_appointment", }, json={ "touchpoint": "new_appointment", "occurred_at": "2026-10-05T17:40:00Z", "member": { "external_id": "rep_456", }, "recipient": { "first_name": "Andrea", "last_name": "Smith", "phone": "+12405550100", }, "reference": { "source": "your_crm", "type": "appointment", "id": "appointment_123", }, "context": { "appointment": { "starts_at": "2026-10-06T18:00:00Z", "timezone": "America/New_York", }, }, "metadata": { "job_id": "job_789", }, }, ) result = response.json()Response · 202 Accepted { "id": "evt_8f3c2a71d04e", "object": "touchpoint_event", "status": "accepted", "touchpoint": "new_appointment", "environment": "test", "created_at": "2026-10-05T17:40:01Z" }
Accepted means you are done
accepted does not mean your CRM has anything else to do. From here Video Intros resolves, for this organization:
- the touchpoint
- the member
- the template
- the script the member reads
- the Video Intro workflow
- the delivery behavior
Keep the event id. Retrieve the event later to see the Video Intro it created.
Building a custom application instead?
If your application decides what the Video Intro says, skip touchpoints and create a Video Intro directly.