curl "https://api.telzino.com/v1/reservations/analytics?start_date=2026-08-01&end_date=2026-08-17" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
const params = new URLSearchParams({
start_date: '2026-08-01',
end_date: '2026-08-17',
});
const response = await fetch(
`https://api.telzino.com/v1/reservations/analytics?${params}`,
{ headers: { Authorization: 'Bearer YOUR_ACCESS_TOKEN' } },
);
const report = await response.json();
console.log(report.outcomes.booking_rate);
import requests
response = requests.get(
'https://api.telzino.com/v1/reservations/analytics',
params={'start_date': '2026-08-01', 'end_date': '2026-08-17'},
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'},
)
report = response.json()
print(report['outcomes']['booking_rate'])
{
"start_date": "2026-08-01",
"end_date": "2026-08-17",
"agents": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Nerea",
"organization_id": "9c1b2d3e-4f56-4789-a0b1-c2d3e4f56789"
}
],
"outcomes": {
"total_calls": 412,
"booking_rate": 0.61,
"counts": { "booked_verified": 214, "alternative_accepted": 38, "human_handoff": 44 },
"drop_off": [{ "step": "availability_checked", "calls": 27 }],
"average_duration_by_outcome": { "booked_verified": 96 },
"barge_in_rate": 0.04,
"by_hour": [0, 0, 0, 0, 0, 0, 0, 2, 9, 21, 34, 48, 51, 39, 26, 22, 31, 44, 39, 28, 12, 5, 1, 0],
"by_weekday": [41, 52, 58, 61, 74, 83, 43],
"fallback_steps": { "email": 11, "callback": 7 }
},
"deliveries": {
"total_messages": 252,
"delivered": 241,
"failed": 5,
"pending": 6,
"delivery_rate": 0.98,
"failure_rate": 0.02,
"alert": false,
"alerts": [],
"by_provider": { "twilio": { "sent": 252, "delivered": 241, "failed": 5 } },
"by_kind": { "booking_link": 238, "waitlist_link": 14 }
},
"usage": {
"stayapi_calls": 503,
"stayapi_cache_hits": 147,
"cache_hit_rate": 0.23,
"lookup_calls": 249,
"outliers": []
},
"truncated": false
}
{
"error": "invalid_request",
"error_description": "start_date must be on or before end_date"
}
Reports
Reservation Analytics
Call outcomes, drop-off, SMS delivery and third-party API usage for OpenTable Reservation agents over a date range
GET
/
v1
/
reservations
/
analytics
curl "https://api.telzino.com/v1/reservations/analytics?start_date=2026-08-01&end_date=2026-08-17" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
const params = new URLSearchParams({
start_date: '2026-08-01',
end_date: '2026-08-17',
});
const response = await fetch(
`https://api.telzino.com/v1/reservations/analytics?${params}`,
{ headers: { Authorization: 'Bearer YOUR_ACCESS_TOKEN' } },
);
const report = await response.json();
console.log(report.outcomes.booking_rate);
import requests
response = requests.get(
'https://api.telzino.com/v1/reservations/analytics',
params={'start_date': '2026-08-01', 'end_date': '2026-08-17'},
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'},
)
report = response.json()
print(report['outcomes']['booking_rate'])
{
"start_date": "2026-08-01",
"end_date": "2026-08-17",
"agents": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Nerea",
"organization_id": "9c1b2d3e-4f56-4789-a0b1-c2d3e4f56789"
}
],
"outcomes": {
"total_calls": 412,
"booking_rate": 0.61,
"counts": { "booked_verified": 214, "alternative_accepted": 38, "human_handoff": 44 },
"drop_off": [{ "step": "availability_checked", "calls": 27 }],
"average_duration_by_outcome": { "booked_verified": 96 },
"barge_in_rate": 0.04,
"by_hour": [0, 0, 0, 0, 0, 0, 0, 2, 9, 21, 34, 48, 51, 39, 26, 22, 31, 44, 39, 28, 12, 5, 1, 0],
"by_weekday": [41, 52, 58, 61, 74, 83, 43],
"fallback_steps": { "email": 11, "callback": 7 }
},
"deliveries": {
"total_messages": 252,
"delivered": 241,
"failed": 5,
"pending": 6,
"delivery_rate": 0.98,
"failure_rate": 0.02,
"alert": false,
"alerts": [],
"by_provider": { "twilio": { "sent": 252, "delivered": 241, "failed": 5 } },
"by_kind": { "booking_link": 238, "waitlist_link": 14 }
},
"usage": {
"stayapi_calls": 503,
"stayapi_cache_hits": 147,
"cache_hit_rate": 0.23,
"lookup_calls": 249,
"outliers": []
},
"truncated": false
}
{
"error": "invalid_request",
"error_description": "start_date must be on or before end_date"
}
The same figures the dashboard’s Reports → Reservation Agent page shows, for
OpenTable Reservation agents.
Scoped to the authenticated account, and narrowable to one organization or one
agent. An account with no reservation agents gets a valid, empty report rather than
an error — no agents is not a failure, and it must not read as a restaurant that
took no bookings.
Third-party API cost is never returned. StayAPI and Twilio Lookup are funded at
the Platform tier, so this exposes call counts only, for capacity planning and
anomaly detection.
Query Parameters
string
required
Inclusive start of the range,
YYYY-MM-DD.string
required
Inclusive end of the range,
YYYY-MM-DD. Must be on or after start_date, or the
request is rejected with 400.string
Narrow to one organization (UUID). An organization outside your account returns an
empty report, not an error.
string
Narrow to one agent (UUID).
curl "https://api.telzino.com/v1/reservations/analytics?start_date=2026-08-01&end_date=2026-08-17" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
const params = new URLSearchParams({
start_date: '2026-08-01',
end_date: '2026-08-17',
});
const response = await fetch(
`https://api.telzino.com/v1/reservations/analytics?${params}`,
{ headers: { Authorization: 'Bearer YOUR_ACCESS_TOKEN' } },
);
const report = await response.json();
console.log(report.outcomes.booking_rate);
import requests
response = requests.get(
'https://api.telzino.com/v1/reservations/analytics',
params={'start_date': '2026-08-01', 'end_date': '2026-08-17'},
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'},
)
report = response.json()
print(report['outcomes']['booking_rate'])
Response
string
Echoed back.
string
Echoed back.
array
The reservation agents in scope:
id, name, organization_id.boolean
true when the range held more calls or messages than one report can load, so the
figures cover only part of it. Narrow the dates for an exact answer.object
Show fields
Show fields
integer
number | null
Share of calls that sent a booking link or had an alternative accepted.
null
rather than 0 when there were no calls — an absence, not a failure. Every rate
in this response follows that rule.object
Calls per outcome, keyed by outcome name.
array
{ step, calls } for each step of the conversation, counting the furthest step
an unsuccessful call reached. Successful calls are excluded, so the success case
is not rendered as the biggest cliff.object
Mean call length in seconds, per outcome.
null where unknown.number | null
array
24 counts, bucketed in each agent’s own restaurant timezone, not the
server’s or yours.
array
7 counts,
0 = Sunday, in the same restaurant-local clock.object
How often each rung of the “text cannot get through” ladder was used.
object
Show fields
Show fields
integer
integer
integer
integer
Sent, with no carrier verdict yet.
number | null
Computed over resolved messages only, so the figure does not dip every time
you look at it mid-service.
number | null
boolean
true when the range-wide failure rate is above 5%, or when any single
restaurant-day breached it.array
R6.6’s threshold as the story states it — per restaurant, per day. Each entry
is
{ agent_id, day, messages, failed, failure_rate }, worst first. Days with
fewer than five resolved messages are excluded, because a 50% failure rate over
two messages says nothing. The range-wide failure_rate above averages every
restaurant over every day, so one restaurant carrier-filtered for one day
disappears into it; this is where it shows up.object
{ sent, delivered, failed } per carrier, so provider-specific degradation is
visible rather than averaged away.object
Booking links, waitlist links, manage-reservation links and events-contact texts
counted separately.
object
{
"start_date": "2026-08-01",
"end_date": "2026-08-17",
"agents": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Nerea",
"organization_id": "9c1b2d3e-4f56-4789-a0b1-c2d3e4f56789"
}
],
"outcomes": {
"total_calls": 412,
"booking_rate": 0.61,
"counts": { "booked_verified": 214, "alternative_accepted": 38, "human_handoff": 44 },
"drop_off": [{ "step": "availability_checked", "calls": 27 }],
"average_duration_by_outcome": { "booked_verified": 96 },
"barge_in_rate": 0.04,
"by_hour": [0, 0, 0, 0, 0, 0, 0, 2, 9, 21, 34, 48, 51, 39, 26, 22, 31, 44, 39, 28, 12, 5, 1, 0],
"by_weekday": [41, 52, 58, 61, 74, 83, 43],
"fallback_steps": { "email": 11, "callback": 7 }
},
"deliveries": {
"total_messages": 252,
"delivered": 241,
"failed": 5,
"pending": 6,
"delivery_rate": 0.98,
"failure_rate": 0.02,
"alert": false,
"alerts": [],
"by_provider": { "twilio": { "sent": 252, "delivered": 241, "failed": 5 } },
"by_kind": { "booking_link": 238, "waitlist_link": 14 }
},
"usage": {
"stayapi_calls": 503,
"stayapi_cache_hits": 147,
"cache_hit_rate": 0.23,
"lookup_calls": 249,
"outliers": []
},
"truncated": false
}
{
"error": "invalid_request",
"error_description": "start_date must be on or before end_date"
}
