Ship in an afternoon
A stable, versioned REST API with idempotency keys, cursor pagination, and signed webhooks. All requests require a bearer token.
Signed & scoped
HMAC-signed webhooks, scoped OAuth tokens.
Realtime events
Sub-second webhook delivery, retry with backoff.
99.98% uptime
Multi-AZ, health-checked, transparent status.
Quickstart
curl https://api.shiftmed.nyc/v1/shifts \ -H "Authorization: Bearer $SHIFTMED_TOKEN" \ -H "Accept: application/json"
Authentication
/v1/auth/tokenExchange API key for a scoped access token.
Request
{ "api_key": "sk_live_...", "scope": ["shifts:read","shifts:write"] }Response
{ "token": "eyJhbGciOi...", "expires_in": 3600 }Shifts
/v1/shiftsList shifts with filters (borough, license, status, urgent).
Response
{
"data": [
{ "id": "shf_9k2", "facility_id": "fac_88", "role": "RN", "borough": "Manhattan",
"start": "2026-07-12T07:00:00Z", "end": "2026-07-12T15:00:00Z",
"starting_rate": 55, "max_rate": 72, "urgent": true, "status": "open" }
],
"next_cursor": "shf_9k3"
}/v1/shiftsCreate a new shift or block posting.
Request
{
"role": "RN", "borough": "Brooklyn",
"start": "2026-07-14T19:00:00Z", "end": "2026-07-15T07:00:00Z",
"starting_rate": 58, "max_rate": 78, "urgent": false, "block": 3
}Response
{ "id": "shf_9k4", "status": "open" }/v1/shifts/:idUpdate rate range, urgency, or cancel a shift.
/v1/shifts/:id/bids/:bid_id/acceptAccept a clinician's bid; funds move to escrow.
Clinicians
/v1/cliniciansSearch vetted clinicians (facilities only).
/v1/clinicians/:id/favoriteMark clinician as preferred; boosts matching weight.
/v1/clinicians/:id/credentialsList credentials with expiration status.
Payments
/v1/payoutsRequest a payout (next-day or standard).
Request
{ "amount": 420.00, "method": "next_day" }Response
{ "id": "po_281", "status": "requested" }/v1/invoicesList weekly facility invoices.
Webhooks
/v1/webhooksRegister a webhook endpoint. Events are signed with HMAC-SHA256.
Webhook event catalog
| Event | Description |
|---|---|
shift.posted | A facility posted a new shift. |
shift.bid_received | A clinician submitted a bid or counteroffer. |
shift.filled | A bid was accepted; funds moved to escrow. |
shift.completed | Shift finished; payout eligible after 2h dispute window. |
payout.paid | A payout landed in the clinician's bank. |
credential.expiring | A credential is within 60 days of expiration. |
SDKs available
Official libraries for Node.js, Python, Ruby, and Go. Postman collection and OpenAPI 3.1 spec included.