Skip to content
VideoIntrosDevelopers
TestLive not yet available
videointros.com

Preview Developer preview. The API described here is not available yet. Examples are illustrative and every console screen uses sample data: nothing is sent, created or stored.

Integration guide Guide

Use VideoIntros with any CRM

If your system knows that a customer moment happened, it can trigger VideoIntros.

Your CRM

  • Appointment booked
  • Deal changed
  • Milestone reached
  • Project started
  • Customer closed
POST/v1/touchpoint-events

VideoIntros

A personalized Video Intro from the right person.

Six steps

  1. Detect the business eventA webhook from your CRM, a database trigger, a job that polls. Any of them works.
  2. Map it to a touchpointKeep a small table from your event to the organization’s touchpoint slug. How touchpoints work.
  3. Create a deterministic idempotency keyyour_crm:appointment_123:new_appointment. Why.
  4. POST the touchpoint eventPOST /v1/touchpoint-events
  5. Store the returned event idIt is how you ask what happened.
  6. Retry safely when appropriateOn a timeout, 429 or 5xx, with the same key.
The whole integration
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"
    }
  }
}'
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"
      }
    }
  }),
});
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",
            },
        },
    },
)
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"
}

When your application decides the message

If there is no touchpoint for what you are doing, or your product writes its own script, create the Video Intro directly.

POST /v1/video-intros
{
  "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"
  }
}