{"openapi":"3.0.3","info":{"title":"Shiftbrook API","version":"1.0.0","description":"Org-scoped API for paid plans. Create a key in Settings, then Integrations, then API. The key is shown once. Send it as Authorization: Bearer."},"servers":[{"url":"/api/v1"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}}},"paths":{"/people":{"get":{"summary":"List people","security":[{"bearer":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"People and open invites","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"summary":"Create a person","security":[{"bearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"201":{"description":"Invite created. The invite token is not returned.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/people/{id}":{"get":{"summary":"Get a person","security":[{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Person","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/locations":{"get":{"summary":"List locations","security":[{"bearer":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Locations","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/locations/{id}":{"get":{"summary":"Get a location","security":[{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Location","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/shifts":{"get":{"summary":"List shifts","security":[{"bearer":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"from","in":"query","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Shifts","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"summary":"Create a shift","security":[{"bearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"201":{"description":"Draft shift","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/shifts/{id}":{"get":{"summary":"Get a shift","security":[{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Shift","content":{"application/json":{"schema":{"type":"object"}}}}}},"patch":{"summary":"Update a shift","security":[{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"Updated shift","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/leave-requests":{"get":{"summary":"List leave requests","security":[{"bearer":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Leave requests","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"summary":"Create a leave request","security":[{"bearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"201":{"description":"Leave request","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/leave-requests/{id}":{"get":{"summary":"Get a leave request","security":[{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Leave request","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/leave-requests/{id}/approve":{"post":{"summary":"Approve a leave request","security":[{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Approved leave","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/timesheets":{"get":{"summary":"List timesheets and approved hours","security":[{"bearer":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string","example":"approved"}}],"responses":{"200":{"description":"Timesheets. approvedHours is set when status is approved.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/timesheets/{id}":{"get":{"summary":"Get a timesheet","security":[{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Timesheet","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/absences":{"get":{"summary":"List approved absences in a date range","security":[{"bearer":[]}],"parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Approved leave overlapping the range","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/webhooks":{"get":{"summary":"List webhooks","security":[{"bearer":[]}],"responses":{"200":{"description":"Webhooks, without the signing secret","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"summary":"Create a webhook","security":[{"bearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"201":{"description":"Webhook. The secret is returned once.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/webhooks/{id}":{"delete":{"summary":"Delete a webhook","security":[{"bearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}}}}}}}