Partner Booking API
Send bookings directly into an ApplianceOps customer's dispatch calendar from your warranty platform, call center, lead service, or ticketing system. No login required by your end users — bookings appear on the shop's calendar tagged with your source.
Getting started
Every ApplianceOps customer has a public booking page with a unique slug — for example, applianceops.pro/book/done-right-appliance. The same backing endpoint accepts API calls from partners.
- Ask the ApplianceOps customer for their
slug. They can find it in Settings → Online Booking. - POST your booking to
https://applianceops.pro/api/booking/bookwith the customer's slug in the body. - You'll get back a booking ID and the date/time slot the booking landed in.
Authentication
The public booking endpoint does not require authentication. The shop's slug serves as the routing identifier. Rate limits apply per IP (see below).
applianceops.pro/scheduler-login.html.Create a booking
POST https://applianceops.pro/api/booking/book
Request body
{
"slug": "done-right-appliance",
"name": "Jane Smith",
"phone": "+15551234567",
"email": "jane@example.com",
"address": "123 Main St, Lancaster CA 93534",
"appliance_type": "Refrigerator",
"issue": "Not cooling. Compressor running but freezer warm.",
"scheduled_date": "2026-06-03",
"time_slot": "AM",
"source": "ahs"
}
Successful response
{
"success": true,
"booking_id": "0b9a55a0-e6b1-4f7a-9c2f-1c2e6a9e5b91",
"scheduled_date": "2026-06-03",
"scheduled_time": "09:00:00",
"time_slot": "am"
}
Field reference
| Field | Type | Required | Notes |
|---|---|---|---|
slug | string | Yes | Tenant identifier shown on their booking page URL. |
name | string | Yes | Customer name (first + last works). |
phone | string | Yes | E.164 (+15551234567) preferred. Digits-only also accepted. |
email | string | No | Used for confirmation + reminder emails. |
address | string | Yes | Service address. Full street address recommended for routing. |
appliance_type | string | Yes | e.g. Refrigerator, Washer, Dryer, Dishwasher, Range, Microwave, Wall Oven, Cooktop, Garbage Disposal, Other. |
issue | string | No | Customer's description of the problem. Free-form text up to 2000 chars. |
scheduled_date | string | Yes | ISO date YYYY-MM-DD. Must be today or future. |
time_slot | string | No | AM (8am–12pm), PM (12pm–5pm), or a specific time like 10:00. If omitted, the next available slot is auto-assigned. |
source | string | No | Free-form tag identifying your platform. Surfaces on the booking for reporting (e.g. ahs, cinch, angi, your domain). |
work_order_number | string | No | Your platform's WO# — surfaces in the dispatcher view. |
claim_number | string | No | Warranty claim ID, if applicable. |
authorization_number | string | No | Pre-auth dollar amount or auth code. |
Errors
All errors return an HTTP 4xx or 5xx status with a JSON body:
{ "error": "Missing required field: phone" }
| Code | Meaning |
|---|---|
| 400 | Validation failure — see error for the field at fault. |
| 404 | The slug doesn't match any active ApplianceOps tenant. |
| 429 | Rate limit exceeded. Retry after a few minutes. |
| 500 | Server error. Safe to retry with exponential backoff. |
Rate limits
Default: 100 requests/hour per IP. The public booking endpoint also enforces 5 successful bookings/hour per IP to deter spam. Need higher limits? Email nick@applianceops.pro with your use case and we'll set up a partner key.
Code examples
cURL
curl -X POST https://applianceops.pro/api/booking/book \
-H 'Content-Type: application/json' \
-d '{
"slug": "done-right-appliance",
"name": "Jane Smith",
"phone": "+15551234567",
"email": "jane@example.com",
"address": "123 Main St, Lancaster CA 93534",
"appliance_type": "Refrigerator",
"issue": "Not cooling.",
"scheduled_date": "2026-06-03",
"time_slot": "AM",
"source": "ahs"
}'
Node.js (fetch)
const res = await fetch('https://applianceops.pro/api/booking/book', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
slug: 'done-right-appliance',
name: 'Jane Smith',
phone: '+15551234567',
email: 'jane@example.com',
address: '123 Main St, Lancaster CA 93534',
appliance_type: 'Refrigerator',
issue: 'Not cooling.',
scheduled_date: '2026-06-03',
time_slot: 'AM',
source: 'ahs',
}),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error);
console.log('Booking ID:', data.booking_id);
Python (requests)
import requests
r = requests.post(
'https://applianceops.pro/api/booking/book',
json={
'slug': 'done-right-appliance',
'name': 'Jane Smith',
'phone': '+15551234567',
'email': 'jane@example.com',
'address': '123 Main St, Lancaster CA 93534',
'appliance_type': 'Refrigerator',
'issue': 'Not cooling.',
'scheduled_date': '2026-06-03',
'time_slot': 'AM',
'source': 'ahs',
},
timeout=15,
)
r.raise_for_status()
print('Booking ID:', r.json()['booking_id'])
"error": "No availability on requested date". Recommend retrying with scheduled_date + 1 day.Support
Email nick@applianceops.pro with your integration questions. Include your platform name, expected volume, and the slug of any test tenant we should grant elevated access to.