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

POST
/v1/auth/token

Exchange API key for a scoped access token.

Request

{ "api_key": "sk_live_...", "scope": ["shifts:read","shifts:write"] }

Response

{ "token": "eyJhbGciOi...", "expires_in": 3600 }

Shifts

GET
/v1/shifts

List 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"
}
POST
/v1/shifts

Create 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" }
PATCH
/v1/shifts/:id

Update rate range, urgency, or cancel a shift.

POST
/v1/shifts/:id/bids/:bid_id/accept

Accept a clinician's bid; funds move to escrow.

Clinicians

GET
/v1/clinicians

Search vetted clinicians (facilities only).

POST
/v1/clinicians/:id/favorite

Mark clinician as preferred; boosts matching weight.

GET
/v1/clinicians/:id/credentials

List credentials with expiration status.

Payments

POST
/v1/payouts

Request a payout (next-day or standard).

Request

{ "amount": 420.00, "method": "next_day" }

Response

{ "id": "po_281", "status": "requested" }
GET
/v1/invoices

List weekly facility invoices.

Webhooks

POST
/v1/webhooks

Register a webhook endpoint. Events are signed with HMAC-SHA256.

Webhook event catalog

EventDescription
shift.postedA facility posted a new shift.
shift.bid_receivedA clinician submitted a bid or counteroffer.
shift.filledA bid was accepted; funds moved to escrow.
shift.completedShift finished; payout eligible after 2h dispute window.
payout.paidA payout landed in the clinician's bank.
credential.expiringA 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.