{"openapi":"3.1.0","info":{"title":"SavvyCal (BYOK) API","version":"0.1.0","description":"SavvyCal (BYOK) lets an AI assistant read your own SavvyCal data through the SavvyCal API with a key you supply (personal access token (starts with pt_secret_)). Read-only: 8 tools (get_current_user, list_events, get_event, list_links, get_link, list_link_slots, list_workflows, list_time_zones). The BYOK key travels with each request, is used for that one call only and is never stored, logged or...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-savvycal.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-savvycal/docs"},"termsOfService":"https://connectorbay.com/byok-savvycal/terms"},"servers":[{"url":"https://byok-savvycal.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-savvycal/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_current_user":{"post":{"operationId":"get_current_user","summary":"Show the SavvyCal user the token belongs to: name, email, plan, time zone and time format. Use for \"Which SavvyCal accou","description":"Show the SavvyCal user the token belongs to: name, email, plan, time zone and time format. Use for \"Which SavvyCal account is my token connected to\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_current_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_events":{"post":{"operationId":"list_events","summary":"List booked meetings with title, start and end, state, link, organizer, attendees and join details. Defaults to your upc","description":"List booked meetings with title, start and end, state, link, organizer, attendees and join details. Defaults to your upcoming confirmed meetings; filter by state, period, dates or link. Pages by cursor. Use for \"What meetings do I have coming up in SavvyCal\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Items per page (1 to 100, default 20).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor from the previous answer's metadata.after to get the next page.","title":"After"},"before":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor from metadata.before to get the previous page.","title":"Before"},"state":{"anyOf":[{"enum":["all","confirmed","canceled","awaiting_reschedule","awaiting_checkout","checkout_expired","awaiting_approval","declined","tentative"],"type":"string"},{"type":"null"}],"default":null,"description":"Only events in this state (default confirmed).","title":"State"},"period":{"anyOf":[{"enum":["past","upcoming","fixed","all"],"type":"string"},{"type":"null"}],"default":null,"description":"When events occur: upcoming (default), past, fixed (uses from and until) or all.","title":"Period"},"from_date":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Earliest start date, YYYY-MM-DD; used when period is fixed.","title":"From Date"},"until":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Latest start date, YYYY-MM-DD; used when period is fixed.","title":"Until"},"direction":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction by start time: asc (default) or desc.","title":"Direction"},"attendance":{"anyOf":[{"enum":["attending","any"],"type":"string"},{"type":"null"}],"default":null,"description":"attending (default) for events you attend, or any for every event you can access.","title":"Attendance"},"link":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only events booked through this scheduling link id.","title":"Link"}},"title":"list_eventsArguments","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_event":{"post":{"operationId":"get_event","summary":"Get one booked meeting by event id or UUID with title, times, state, attendees, location, conferencing, payment and canc","description":"Get one booked meeting by event id or UUID with title, times, state, attendees, location, conferencing, payment and cancel or reschedule details. Use for \"Show SavvyCal event event_01KKGY70MFPCECSQ6KM6FMDPC3\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"event_id":{"description":"Event id (event_...) or UUID as returned by list_events.","maxLength":200,"title":"Event Id","type":"string"}},"required":["event_id"],"title":"get_eventArguments","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_links":{"post":{"operationId":"list_links","summary":"List scheduling links with name, slug, state, durations, increment, custom fields and owning scope. Filter by active or ","description":"List scheduling links with name, slug, state, durations, increment, custom fields and owning scope. Filter by active or disabled. Pages by cursor. Use for \"Which scheduling links do I have in SavvyCal\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Items per page (1 to 100, default 20).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor from the previous answer's metadata.after to get the next page.","title":"After"},"before":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor from metadata.before to get the previous page.","title":"Before"},"state":{"anyOf":[{"enum":["active","disabled"],"type":"string"},{"type":"null"}],"default":null,"description":"Only links in this state.","title":"State"}},"title":"list_linksArguments","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_link":{"post":{"operationId":"get_link","summary":"Get one scheduling link by id with name, slug, state, durations, increment, custom fields and scope. Use for \"Show Savvy","description":"Get one scheduling link by id with name, slug, state, durations, increment, custom fields and scope. Use for \"Show SavvyCal scheduling link link_01J5KC2G3MHPCECSQ6KM6FMDPC\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"link_id":{"description":"Scheduling link id as returned by list_links.","maxLength":200,"title":"Link Id","type":"string"}},"required":["link_id"],"title":"get_linkArguments","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_link_slots":{"post":{"operationId":"list_link_slots","summary":"List open time slots on a scheduling link with start, end, duration and rank. The window can span at most 31 days. Use f","description":"List open time slots on a scheduling link with start, end, duration and rank. The window can span at most 31 days. Use for \"When is my SavvyCal link link_01J5KC2G3MHPCECSQ6KM6FMDPC bookable this week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"link_id":{"description":"Scheduling link id as returned by list_links.","maxLength":200,"title":"Link Id","type":"string"},"from_time":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Start of the search window, ISO 8601 date-time.","title":"From Time"},"until":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"End of the search window, ISO 8601 date-time, at most 31 days after from.","title":"Until"}},"required":["link_id"],"title":"list_link_slotsArguments","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_workflows":{"post":{"operationId":"list_workflows","summary":"List automated workflows with name, state and creation date. Pages by cursor. Use for \"Which SavvyCal workflows are acti","description":"List automated workflows with name, state and creation date. Pages by cursor. Use for \"Which SavvyCal workflows are active\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"Items per page (1 to 100, default 20).","title":"Limit"},"after":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor from the previous answer's metadata.after to get the next page.","title":"After"},"before":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor from metadata.before to get the previous page.","title":"Before"}},"title":"list_workflowsArguments","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_time_zones":{"post":{"operationId":"list_time_zones","summary":"List time zones with id, abbreviation, offset, daylight-saving flag and names, as of now or a chosen instant. Large answ","description":"List time zones with id, abbreviation, offset, daylight-saving flag and names, as of now or a chosen instant. Large answer, capped. Use for \"What is the current UTC offset of each time zone in SavvyCal\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"instant":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Moment to describe the zones at, ISO 8601 date-time (default now).","title":"Instant"},"include_legacy":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Include legacy or deprecated zone ids.","title":"Include Legacy"}},"title":"list_time_zonesArguments","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}}}}