Integration guide · Exterior Remodeling Coming soon
Rytela and VideoIntros
Rytela already knows when an appointment is booked and when a job moves. A native connection to VideoIntros 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
- VideoIntros
new_appointment
Native names stay in your adapter’s mapping. VideoIntros only ever sees the organization’s touchpoint.
Example mapping
| In Rytela | Kind | VideoIntros 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()