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
- RytelaAn appointment is booked for a rep
- Your adapterMapping lives here
- Video Intros
new_appointment
Native names stay in your adapter’s mapping. Video Intros only ever sees the organization’s touchpoint.
Example mapping
| In Rytela | Kind | Video Intros touchpoint | Context |
|---|---|---|---|
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.
- Detect the changeSubscribe to Rytela’s notifications, or poll, for the records you care about.
- Look up the mappingFind the organization’s touchpoint for the native value. If there is none, do nothing.
- Build the key
rytela:job_5521:project_complete - Send the eventPOST /v1/touchpoint-events
- Store the event idSo you can look the event up later.
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()