{"openapi":"3.1.0","info":{"title":"Beeminder (BYOK) API","version":"0.1.0","description":"Beeminder (BYOK) lets an AI assistant read your own Beeminder data through the Beeminder API with a key you supply (personal auth token). Read-only: 5 tools (get_user, list_goals, get_goal, list_archived_goals, list_datapoints). 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 sent to www.beeminder.com. Unofficial...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-beeminder.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-beeminder/docs"},"termsOfService":"https://connectorbay.com/byok-beeminder/terms"},"servers":[{"url":"https://byok-beeminder.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-beeminder/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/get_user":{"post":{"operationId":"get_user","summary":"Show a Beeminder user: username, time zone, last update time, urgency load, and the slugs of their goals. Use for \"Which","description":"Show a Beeminder user: username, time zone, last update time, urgency load, and the slugs of their goals. Use for \"Which Beeminder goals do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"username":{"description":"Your Beeminder username, for example 'alice' (the word 'me' also works for the key's owner).","maxLength":64,"title":"Username","type":"string"}},"required":["username"],"title":"get_userArguments","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/list_goals":{"post":{"operationId":"list_goals","summary":"List active Beeminder goals, most urgent first, with target, rate, derailment time, safety buffer and last value. Use fo","description":"List active Beeminder goals, most urgent first, with target, rate, derailment time, safety buffer and last value. Use for \"Which of my Beeminder goals are closest to derailing\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"username":{"description":"Your Beeminder username, for example 'alice' (the word 'me' also works for the key's owner).","maxLength":64,"title":"Username","type":"string"},"emaciated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to drop the bulky road, roadall and fullroad arrays from each goal.","title":"Emaciated"}},"required":["username"],"title":"list_goalsArguments","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_goal":{"post":{"operationId":"get_goal","summary":"Get one Beeminder goal in detail: target, rate, deadline, safety days, summary of what is needed next and graph URL. Use","description":"Get one Beeminder goal in detail: target, rate, deadline, safety days, summary of what is needed next and graph URL. Use for \"How is my Beeminder 'weight' goal doing\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"username":{"description":"Your Beeminder username, for example 'alice' (the word 'me' also works for the key's owner).","maxLength":64,"title":"Username","type":"string"},"goal_slug":{"description":"Goal slug, the last part of the goal URL beeminder.com/alice/weight, for example 'weight'.","maxLength":100,"title":"Goal Slug","type":"string"},"emaciated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to drop the bulky road, roadall and fullroad arrays from each goal.","title":"Emaciated"}},"required":["username","goal_slug"],"title":"get_goalArguments","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/list_archived_goals":{"post":{"operationId":"list_archived_goals","summary":"List a user's archived Beeminder goals with their final settings. Use for \"Which Beeminder goals have I archived\".","description":"List a user's archived Beeminder goals with their final settings. Use for \"Which Beeminder goals have I archived\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"username":{"description":"Your Beeminder username, for example 'alice' (the word 'me' also works for the key's owner).","maxLength":64,"title":"Username","type":"string"},"emaciated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to drop the bulky road, roadall and fullroad arrays from each goal.","title":"Emaciated"}},"required":["username"],"title":"list_archived_goalsArguments","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/list_datapoints":{"post":{"operationId":"list_datapoints","summary":"List datapoints (date, value, comment) of one Beeminder goal, newest id first by default; use count or page and per to l","description":"List datapoints (date, value, comment) of one Beeminder goal, newest id first by default; use count or page and per to limit. Use for \"What were my last 10 datapoints on the Beeminder 'weight' goal\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"username":{"description":"Your Beeminder username, for example 'alice' (the word 'me' also works for the key's owner).","maxLength":64,"title":"Username","type":"string"},"goal_slug":{"description":"Goal slug, the last part of the goal URL beeminder.com/alice/weight, for example 'weight'.","maxLength":100,"title":"Goal Slug","type":"string"},"sort":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Attribute to sort descending by (default id), for example timestamp or updated_at.","title":"Sort"},"count":{"anyOf":[{"maximum":1000,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Return only this many datapoints (ignored when page is set).","title":"Count"},"page":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Page number, starting at 1.","title":"Page"},"per":{"anyOf":[{"maximum":300,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Datapoints per page (default 25; only used with page).","title":"Per"}},"required":["username","goal_slug"],"title":"list_datapointsArguments","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}}}}