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.

Integration guide · Exterior Remodeling Coming soon

Rytela and Video Intros

Rytela already knows when an appointment is booked and when a job moves. A native connection to Video Intros is planned. Until then, this is the mapping it will follow, and the same request any system can send today in Test.

How it fits together

  1. RytelaAn appointment is booked for a rep
  2. Your adapterMapping lives here
  3. Video Introsnew_appointment

Native names stay in your adapter’s mapping. Video Intros only ever sees the organization’s touchpoint.

Example mapping

In RytelaKindVideo Intros touchpointContext
An appointment is booked for a rep
Appointment
new_appointmentNew Appointment
None
An inspection is booked
Appointment
new_inspectionNew Inspection
None
The rep is dispatched
Status
on_my_wayOn My Way
None
An estimate is sent
Milestone
estimate_follow_upEstimate / Proposal Follow-Up
None
A job moves into production
Milestone
project_kickoffProject Kickoff / Next Steps
None
A job is completed
Milestone
project_completeProject Complete / Thank You
None

The request your adapter sends

Whatever happened in Rytela, the request is the same one every integration sends.

  1. Detect the changeSubscribe to Rytela’s notifications, or poll, for the records you care about.
  2. Look up the mappingFind the organization’s touchpoint for the native value. If there is none, do nothing.
  3. Build the keyrytela:job_5521:project_complete
  4. Send the eventPOST /v1/touchpoint-events
  5. Store the event idSo you can look the event up later.
Rytela → project_complete
curl -X POST https://api.videointros.com/v1/touchpoint-events \
  -H "Authorization: Bearer $VIDEO_INTROS_API_KEY" \
  -H "Idempotency-Key: rytela:job_5521:project_complete" \
  -H "Content-Type: application/json" \
  -d '{
  "touchpoint": "project_complete",
  "occurred_at": "2026-10-05T17:40:00Z",
  "member": {
    "external_id": "rep_456"
  },
  "recipient": {
    "first_name": "Andrea",
    "last_name": "Smith",
    "phone": "+12405550100"
  },
  "reference": {
    "source": "rytela",
    "type": "job",
    "id": "job_5521"
  }
}'
const response = await fetch("https://api.videointros.com/v1/touchpoint-events", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.VIDEO_INTROS_API_KEY}`,
    "Idempotency-Key": "rytela:job_5521:project_complete",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "touchpoint": "project_complete",
    "occurred_at": "2026-10-05T17:40:00Z",
    "member": {
      "external_id": "rep_456"
    },
    "recipient": {
      "first_name": "Andrea",
      "last_name": "Smith",
      "phone": "+12405550100"
    },
    "reference": {
      "source": "rytela",
      "type": "job",
      "id": "job_5521"
    }
  }),
});
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": "rytela:job_5521:project_complete",
    },
    json={
        "touchpoint": "project_complete",
        "occurred_at": "2026-10-05T17:40:00Z",
        "member": {
            "external_id": "rep_456",
        },
        "recipient": {
            "first_name": "Andrea",
            "last_name": "Smith",
            "phone": "+12405550100",
        },
        "reference": {
            "source": "rytela",
            "type": "job",
            "id": "job_5521",
        },
    },
)
result = response.json()

Next