Skip to content
Video IntrosDevelopers
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.

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.

  1. 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_••••••••••••
  2. 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_appointment
  3. Trigger 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.