{"openapi":"3.1.0","info":{"title":"Regsta Public API","version":"1.0.0","description":"Read-first, versioned REST API for time-registration data. Authenticate with a tenant-scoped API key (Bearer). Cursor pagination; consistent error envelope; idempotent writes."},"servers":[{"url":"/api/v1"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Tenant-scoped API key (rk_live_…)."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"NOT_FOUND"},"message":{"type":"string"},"requestId":{"type":"string"}},"required":["code","message"]}}},"Pagination":{"type":"object","properties":{"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"}}},"Employee":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"fullName":{"type":"string"},"email":{"type":["string","null"],"format":"email"},"phone":{"type":["string","null"]},"employeeNumber":{"type":["string","null"]},"isActive":{"type":"boolean"},"hasLogin":{"type":"boolean"},"latestShift":{"anyOf":[{"type":"object","properties":{"date":{"type":"string","format":"date"},"status":{"type":["string","null"]}}},{"type":"null"}]}}},"Shift":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"employeeName":{"type":"string"},"date":{"type":"string","format":"date"},"startTime":{"type":["string","null"],"format":"date-time"},"endTime":{"type":["string","null"],"format":"date-time"},"pauseMinutes":{"type":"integer"},"workMinutes":{"type":["integer","null"]},"source":{"type":"string"},"status":{"type":"string"},"version":{"type":"integer"}}}},"parameters":{"limit":{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200}},"cursor":{"name":"cursor","in":"query","schema":{"type":"string"}}}},"security":[{"apiKey":[]}],"paths":{"/health":{"get":{"summary":"Service + API version","security":[],"responses":{"200":{"description":"OK"}}}},"/employees":{"get":{"summary":"List employees","security":[{"apiKey":[]}],"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/cursor"}],"responses":{"200":{"description":"Employees, keyset-paginated","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Employee"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Missing employees:read scope"}}}},"/shifts":{"get":{"summary":"List time records","security":[{"apiKey":[]}],"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/cursor"},{"name":"from","in":"query","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Time records, keyset-paginated","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Shift"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Missing shifts:read scope"},"422":{"description":"Invalid date range"}}}}}}