ApplianceOps

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.

Quick links Getting started Authentication POST /api/booking/book — create a booking Field reference Errors Rate limits Code examples Support

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.

  1. Ask the ApplianceOps customer for their slug. They can find it in Settings → Online Booking.
  2. POST your booking to https://applianceops.pro/api/booking/book with the customer's slug in the body.
  3. 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).

⚙️ Private partner key: if you need higher rate limits, custom source tagging, or write access to fields beyond the public booking schema, contact the shop owner. They can create a private partner account in Settings → Scheduler Accounts and share credentials with you. The portal lives at 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

FieldTypeRequiredNotes
slugstringYesTenant identifier shown on their booking page URL.
namestringYesCustomer name (first + last works).
phonestringYesE.164 (+15551234567) preferred. Digits-only also accepted.
emailstringNoUsed for confirmation + reminder emails.
addressstringYesService address. Full street address recommended for routing.
appliance_typestringYese.g. Refrigerator, Washer, Dryer, Dishwasher, Range, Microwave, Wall Oven, Cooktop, Garbage Disposal, Other.
issuestringNoCustomer's description of the problem. Free-form text up to 2000 chars.
scheduled_datestringYesISO date YYYY-MM-DD. Must be today or future.
time_slotstringNoAM (8am–12pm), PM (12pm–5pm), or a specific time like 10:00. If omitted, the next available slot is auto-assigned.
sourcestringNoFree-form tag identifying your platform. Surfaces on the booking for reporting (e.g. ahs, cinch, angi, your domain).
work_order_numberstringNoYour platform's WO# — surfaces in the dispatcher view.
claim_numberstringNoWarranty claim ID, if applicable.
authorization_numberstringNoPre-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" }
CodeMeaning
400Validation failure — see error for the field at fault.
404The slug doesn't match any active ApplianceOps tenant.
429Rate limit exceeded. Retry after a few minutes.
500Server 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'])
⚠️ Time slot availability: if the requested slot is full, the API auto-assigns the next available time on the same date. If the date itself is full, you'll get a 400 with "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.