{"openapi":"3.1.0","info":{"title":"ROOK (BYOK) API","version":"0.1.0","description":"ROOK (BYOK) lets an AI assistant read your own ROOK data through the ROOK API with a key you supply (ROOK client UUID). Read-only: 6 tools (list_authorized_data_sources, get_users_status, get_physical_summary, get_sleep_summary, get_body_summary, get_nutrition_summary). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is only ever...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-rook.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-rook/docs"},"termsOfService":"https://connectorbay.com/byok-rook/terms"},"servers":[{"url":"https://byok-rook.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-rook/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_authorized_data_sources":{"post":{"operationId":"list_authorized_data_sources","summary":"List the data sources (Garmin, Oura, Fitbit, Apple Health and others) one end user has authorized in ROOK, with an autho","description":"List the data sources (Garmin, Oura, Fitbit, Apple Health and others) one end user has authorized in ROOK, with an authorized flag for each. Use for \"Which wearables has ROOK user app-user-42 connected\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"user_id":{"description":"Your own identifier for the end user in ROOK (1 to 50 characters).","maxLength":50,"title":"User Id","type":"string"}},"required":["user_id"],"title":"list_authorized_data_sourcesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_users_status":{"post":{"operationId":"get_users_status","summary":"List the users of your ROOK project with active flag, creation date and the data sources they authorized, as of a date u","description":"List the users of your ROOK project with active flag, creation date and the data sources they authorized, as of a date up to six months back. Paged; the answer carries total counts and pagination. Use for \"How many active users does my ROOK project have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"up_to_date":{"description":"Date in YYYY-MM-DD that bounds the listing; not in the future and at most six months back.","maxLength":10,"title":"Up To Date","type":"string"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1 (default 1).","title":"Page"}},"required":["up_to_date"],"title":"get_users_statusArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_physical_summary":{"post":{"operationId":"get_physical_summary","summary":"Get one end user's physical summary for a day: seconds at each activity intensity, calories, steps, distance, floors, el","description":"Get one end user's physical summary for a day: seconds at each activity intensity, calories, steps, distance, floors, elevation gain and heart rate (average, minimum, maximum, resting, HRV). An empty answer means no data for that day. Use for \"How active was ROOK user app-user-42 on 2026-10-02\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"user_id":{"description":"Your own identifier for the end user in ROOK (1 to 50 characters).","maxLength":50,"title":"User Id","type":"string"},"date":{"description":"Day to read, as YYYY-MM-DD.","maxLength":10,"title":"Date","type":"string"}},"required":["user_id","date"],"title":"get_physical_summaryArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_sleep_summary":{"post":{"operationId":"get_sleep_summary","summary":"Get one end user's sleep summary for a day: start and end, total, light, REM and deep sleep seconds, time in bed, time t","description":"Get one end user's sleep summary for a day: start and end, total, light, REM and deep sleep seconds, time in bed, time to fall asleep, awake time, quality and efficiency ratings, heart rate, HRV and breathing rate. An empty answer means no data for that day. Use for \"How did ROOK user app-user-42 sleep on 2026-10-02\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"user_id":{"description":"Your own identifier for the end user in ROOK (1 to 50 characters).","maxLength":50,"title":"User Id","type":"string"},"date":{"description":"Day to read, as YYYY-MM-DD.","maxLength":10,"title":"Date","type":"string"}},"required":["user_id","date"],"title":"get_sleep_summaryArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_body_summary":{"post":{"operationId":"get_body_summary","summary":"Get one end user's body measurements for a day: weight, height, BMI, waist, hip and chest circumference and body composi","description":"Get one end user's body measurements for a day: weight, height, BMI, waist, hip and chest circumference and body composition percentages. Only these measurements are returned. An empty answer means no data for that day. Use for \"What did ROOK user app-user-42 weigh on 2026-10-02\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"user_id":{"description":"Your own identifier for the end user in ROOK (1 to 50 characters).","maxLength":50,"title":"User Id","type":"string"},"date":{"description":"Day to read, as YYYY-MM-DD.","maxLength":10,"title":"Date","type":"string"}},"required":["user_id","date"],"title":"get_body_summaryArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_nutrition_summary":{"post":{"operationId":"get_nutrition_summary","summary":"Get one end user's food intake for a day from connected nutrition apps: calories, protein, carbohydrates, fat, fibre, su","description":"Get one end user's food intake for a day from connected nutrition apps: calories, protein, carbohydrates, fat, fibre, sugar, sodium and total food in grams. An empty answer means no data for that day. Use for \"How many calories did ROOK user app-user-42 eat on 2026-10-02\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"user_id":{"description":"Your own identifier for the end user in ROOK (1 to 50 characters).","maxLength":50,"title":"User Id","type":"string"},"date":{"description":"Day to read, as YYYY-MM-DD.","maxLength":10,"title":"Date","type":"string"}},"required":["user_id","date"],"title":"get_nutrition_summaryArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}