The core flow
a. Create (or resolve) the client
curl https://app.quinable.com/api/partner/v1/clients \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ "first_name":"June", "last_name":"Delano",
"external_ref":"RAH-CL-00123",
"address":{"line1":"412 Palmer St","city":"Detroit","state":"MI","zip":"48201"} }'
Set external_ref to your own client id, then resolve later with
GET /clients?external_ref=RAH-CL-00123 — so you never store Quinable's ids.
b. Post the route with its visits
curl https://app.quinable.com/api/partner/v1/routes \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ "name":"Morning care", "date":"2026-09-01",
"confirmation_type":"agency_confirm", "profession_id":291,
"external_ref":"RAH-SCH-991",
"visits":[{ "client":"client_841", "start_time":"08:00", "end_time":"10:00",
"pay_type":"per_hour", "hourly_rate":3200 }] }'
profession_id comes from GET /professions. Post one route per date (recurrence is your
tool's job). The response's total_pay and status are computed by Quinable.
c. Choosing the caregiver
agency_confirm— caregivers bid; you choose. Read the route's bid list to decide:curl https://app.quinable.com/api/partner/v1/routes/route_10312 -H "Authorization: Bearer $KEY"bids.data[]gives each bidder'sproviderwithfirst_name,last_name,mobile,email,rating(0–5), andreliability_score(0–100). Acceptance itself happens in the Quinable portal in v1.instant_confirm— the first eligible bid is auto-accepted; the winner appears atbids.acceptedwith the sameproviderfields.
New caregivers may have
nullrating/reliability — treat that as "no track record yet," not a zero.
d. Follow the work
Watch webhooks (below), or poll:
GET /bids/{id}— a bid's current status.GET /timesheets?route=route_10312— clock in/out, duration, approval + pay status.