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.

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 VideoIntros 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.