Download OpenAPI specification:
The Quinable Partner API lets an agency's external systems (e.g. a scheduling tool) create clients and routes/visits in Quinable and receive lifecycle status by signed webhooks.
Authentication. Every request carries a per-agency secret key in the Authorization header (Bearer qk_live_…). The key's prefix is its mode: qk_live_ acts on real data; qk_test_ is a sandbox — test routes never reach caregivers and move no money.
Conventions. JSON bodies; money is integer cents; ids are opaque prefixed strings (route_123); times of day are HH:MM in the route's local timezone. POST endpoints accept an Idempotency-Key header (replayed for 24h, then pruned). List endpoints use cursor pagination (limit, starting_after). Errors use real HTTP status codes plus a typed body.
Operations. Default rate limit 120 requests/min per key; a 429 carries the typed error body and a Retry-After header. Every response includes an X-Request-Id — quote it in support requests. To rotate an API key with zero downtime, issue a second key, switch, then revoke the old one; to rotate a webhook signing secret, register a second endpoint (new secret), verify deliveries, then delete the old endpoint.
| external_ref | string Return the client with this partner-supplied id. |
| archived | boolean Default: false |
| limit | integer [ 1 .. 100 ] Default: 25 |
| starting_after | string A cursor — the id of the last object from the previous page. |
{- "object": "list",
- "data": [
- {
- "id": "client_841",
- "object": "client",
- "first_name": "string",
- "last_name": "string",
- "email": "string",
- "mobile": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "state": "string",
- "zip": "string"
}, - "timezone": "America/Detroit",
- "external_ref": "string",
- "archived": true,
- "livemode": true,
- "created_at": "2019-08-24T14:15:22Z"
}
], - "has_more": true
}| Idempotency-Key | string <= 191 characters Retrying with the same key replays the original response (24h) and creates nothing. |
| first_name required | string |
| last_name required | string |
string | |
| mobile | string |
| external_ref | string Your own id for this client. Unique per agency. |
required | object |
{- "first_name": "string",
- "last_name": "string",
- "email": "string",
- "mobile": "string",
- "external_ref": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "state": "string",
- "zip": "string"
}
}{- "id": "client_841",
- "object": "client",
- "first_name": "string",
- "last_name": "string",
- "email": "string",
- "mobile": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "state": "string",
- "zip": "string"
}, - "timezone": "America/Detroit",
- "external_ref": "string",
- "archived": true,
- "livemode": true,
- "created_at": "2019-08-24T14:15:22Z"
}| id required | string Example: client_841 |
{- "id": "client_841",
- "object": "client",
- "first_name": "string",
- "last_name": "string",
- "email": "string",
- "mobile": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "state": "string",
- "zip": "string"
}, - "timezone": "America/Detroit",
- "external_ref": "string",
- "archived": true,
- "livemode": true,
- "created_at": "2019-08-24T14:15:22Z"
}All fields optional. Sending address re-runs geocoding so timezone and caregiver-matching coordinates stay correct after a move. Sending external_ref reassigns the partner's own id (releases the old ref, claims the new one).
| id required | string Example: client_841 |
| first_name required | string |
| last_name required | string |
string | |
| mobile | string |
| external_ref | string Your own id for this client. Unique per agency. |
required | object |
{- "first_name": "string",
- "last_name": "string",
- "email": "string",
- "mobile": "string",
- "external_ref": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "state": "string",
- "zip": "string"
}
}{- "id": "client_841",
- "object": "client",
- "first_name": "string",
- "last_name": "string",
- "email": "string",
- "mobile": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "state": "string",
- "zip": "string"
}, - "timezone": "America/Detroit",
- "external_ref": "string",
- "archived": true,
- "livemode": true,
- "created_at": "2019-08-24T14:15:22Z"
}Archives the client (never deletes) and releases their external_ref for reuse by a replacement.
| id required | string Example: client_841 |
| reason | string |
{- "reason": "string"
}{- "id": "client_841",
- "object": "client",
- "first_name": "string",
- "last_name": "string",
- "email": "string",
- "mobile": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "state": "string",
- "zip": "string"
}, - "timezone": "America/Detroit",
- "external_ref": "string",
- "archived": true,
- "livemode": true,
- "created_at": "2019-08-24T14:15:22Z"
}