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.

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

  • Authorizationstringrequired

    Bearer followed by your API key. A test key works in the test environment only.

  • Idempotency-Keystringrequired

    A value that is the same every time you send THIS event, and different for every other event.

  • Content-Typestringrequired

    application/json

Request body

  • memberobjectrequired

    The 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 member
    • idstring

      The member's Video Intros identifier, from GET /v1/members.

    • external_idstring

      Your own identifier for this person, as stored on the member.

    • emailstring

      The member's email address. If more than one member has it, the request is refused with member_ambiguous.

  • recipientobjectrequired

    The customer the Video Intro is for.

    3 fields in recipient
    • first_namestringrequired

      Used in the script and on the page.

    • last_namestring

      Optional.

    • phonestringrequired

      Mobile number in E.164 form, for example +12405550100.

  • referenceobject

    The 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 reference
    • sourcestring

      The system the record lives in, for example your_crm.

    • typestring

      What kind of record: appointment, job, deal, contact.

    • idstring

      Its identifier in that system.

  • contextobject

    What the page says the video is about.

    2 fields in context
    • titlestring

      The line above the video.

    • appointmentobject

      When the moment has a date and time.

      2 fields in appointment
      • starts_atstring

        ISO 8601 date and time.

      • timezonestring

        IANA time zone, for example America/New_York.

  • instructionsobject

    What the member is asked to say.

    1 field in instructions
    • scriptstring

      The words shown to the member while recording. About 15 seconds.

  • deliveryobject

    Who gets the finished Video Intro to the recipient.

    1 field in delivery
    • responsibilitystring

      integration (the default): Video Intros prepares the Video Intro and your system delivers the link. video_intros: Video Intros sends it to the recipient.

  • metadataobject

    Up to a few of your own key and value pairs. Stored and returned, never interpreted.

Errors

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

All errors

Request
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()
Response · 201
{
  "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"
}
An error
{
  "error": {
    "code": "idempotency_conflict",
    "message": "This Idempotency-Key was already used with a different body."
  }
}