{"openapi":"3.1.0","info":{"title":"Vitally (BYOK) API","version":"0.1.0","description":"Vitally (BYOK) lets an AI assistant read your own Vitally data through the Vitally API with a key you supply (Vitally REST API key (US data center)). Read-only: 9 tools (list_accounts, get_account, list_users, search_users, list_notes, list_tasks, list_nps_responses, list_meetings, list_note_categories). The BYOK key travels with each request, is used for that one call only and is never stored,...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-vitally.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-vitally/docs"},"termsOfService":"https://connectorbay.com/byok-vitally/terms"},"servers":[{"url":"https://byok-vitally.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-vitally/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_accounts":{"post":{"operationId":"list_accounts","summary":"List Vitally accounts (customers) with owner, MRR, renewal and churn dates, last seen time, user count, NPS score, healt","description":"List Vitally accounts (customers) with owner, MRR, renewal and churn dates, last seen time, user count, NPS score, health score and traits. Active accounts by default. Use for \"Which Vitally accounts renew soon\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"subdomain":{"description":"Your Vitally subdomain, the first part of the address you log in at (for example acme for acme.vitally.io).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Subdomain","type":"string"},"status":{"anyOf":[{"enum":["active","churned","activeOrChurned"],"type":"string"},{"type":"null"}],"default":null,"description":"Which accounts: active (default), churned or activeOrChurned.","title":"Status"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100, default 100).","title":"Limit"},"from_cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the next value from the previous answer.","title":"From Cursor"},"sort_by":{"anyOf":[{"enum":["createdAt","updatedAt"],"type":"string"},{"type":"null"}],"default":null,"description":"Order by createdAt or updatedAt (default updatedAt; use createdAt on every page when fetching everything).","title":"Sort By"}},"required":["subdomain"],"title":"list_accountsArguments","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_account":{"post":{"operationId":"get_account","summary":"Get one Vitally account by its Vitally id or external id. Use for \"Show Vitally account acct_123\".","description":"Get one Vitally account by its Vitally id or external id. Use for \"Show Vitally account acct_123\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"subdomain":{"description":"Your Vitally subdomain, the first part of the address you log in at (for example acme for acme.vitally.io).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Subdomain","type":"string"},"id":{"description":"Vitally account id or the account's external id.","maxLength":100,"title":"Id","type":"string"}},"required":["subdomain","id"],"title":"get_accountArguments","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_users":{"post":{"operationId":"list_users","summary":"List Vitally users (your customers' end users) with name, email, last seen time, last NPS score and feedback and segment","description":"List Vitally users (your customers' end users) with name, email, last seen time, last NPS score and feedback and segments. Contains personal data. Use for \"Which users are tracked in Vitally\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"subdomain":{"description":"Your Vitally subdomain, the first part of the address you log in at (for example acme for acme.vitally.io).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Subdomain","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100, default 100).","title":"Limit"},"from_cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the next value from the previous answer.","title":"From Cursor"}},"required":["subdomain"],"title":"list_usersArguments","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/search_users":{"post":{"operationId":"search_users","summary":"Find a Vitally user by exactly one of: email, email domain or external id. Use for \"Is ana@example.com a user in Vitally","description":"Find a Vitally user by exactly one of: email, email domain or external id. Use for \"Is ana@example.com a user in Vitally\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"subdomain":{"description":"Your Vitally subdomain, the first part of the address you log in at (for example acme for acme.vitally.io).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Subdomain","type":"string"},"email":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Exact email address to find.","title":"Email"},"email_subdomain":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Email domain to find, for example example.com.","title":"Email Subdomain"},"external_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"External id of the user.","title":"External Id"}},"required":["subdomain"],"title":"search_usersArguments","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_notes":{"post":{"operationId":"list_notes","summary":"List notes logged on accounts and organizations with subject, text, date, author, category, tags and source. Use for \"Wh","description":"List notes logged on accounts and organizations with subject, text, date, author, category, tags and source. Use for \"What notes were logged in Vitally recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"subdomain":{"description":"Your Vitally subdomain, the first part of the address you log in at (for example acme for acme.vitally.io).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Subdomain","type":"string"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for deleted notes only, false for active only.","title":"Archived"},"source":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only notes created by this integration (case-insensitive).","title":"Source"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100, default 100).","title":"Limit"},"from_cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the next value from the previous answer.","title":"From Cursor"}},"required":["subdomain"],"title":"list_notesArguments","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_tasks":{"post":{"operationId":"list_tasks","summary":"List tasks with name, description, due date, completion time and assignee. Use for \"Which Vitally tasks are overdue\".","description":"List tasks with name, description, due date, completion time and assignee. Use for \"Which Vitally tasks are overdue\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"subdomain":{"description":"Your Vitally subdomain, the first part of the address you log in at (for example acme for acme.vitally.io).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Subdomain","type":"string"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for archived tasks only, false for active only.","title":"Archived"},"source":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only tasks created by this integration (case-insensitive).","title":"Source"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100, default 100).","title":"Limit"},"from_cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the next value from the previous answer.","title":"From Cursor"}},"required":["subdomain"],"title":"list_tasksArguments","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_nps_responses":{"post":{"operationId":"list_nps_responses","summary":"List NPS survey responses with score, feedback, respondent user id and response time, for accounts or organizations. Use","description":"List NPS survey responses with score, feedback, respondent user id and response time, for accounts or organizations. Use for \"What NPS scores did Vitally users give recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"subdomain":{"description":"Your Vitally subdomain, the first part of the address you log in at (for example acme for acme.vitally.io).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Subdomain","type":"string"},"target":{"anyOf":[{"enum":["accounts","organizations"],"type":"string"},{"type":"null"}],"default":null,"description":"Whose responses to list: accounts (default) or organizations.","title":"Target"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100, default 100).","title":"Limit"},"from_cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the next value from the previous answer.","title":"From Cursor"}},"required":["subdomain"],"title":"list_nps_responsesArguments","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_meetings":{"post":{"operationId":"list_meetings","summary":"List meetings with title, description, start and end time, location, status, AI summary and source. Use for \"What custom","description":"List meetings with title, description, start and end time, location, status, AI summary and source. Use for \"What customer meetings does Vitally have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"subdomain":{"description":"Your Vitally subdomain, the first part of the address you log in at (for example acme for acme.vitally.io).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Subdomain","type":"string"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for archived meetings only.","title":"Archived"},"sort_by":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Sort order of results.","title":"Sort By"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100, default 100).","title":"Limit"},"from_cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the next value from the previous answer.","title":"From Cursor"}},"required":["subdomain"],"title":"list_meetingsArguments","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_note_categories":{"post":{"operationId":"list_note_categories","summary":"List the categories notes can have, with id and name. Use for \"What note categories exist in Vitally\".","description":"List the categories notes can have, with id and name. Use for \"What note categories exist in Vitally\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"subdomain":{"description":"Your Vitally subdomain, the first part of the address you log in at (for example acme for acme.vitally.io).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Subdomain","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100, default 100).","title":"Limit"},"from_cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the next value from the previous answer.","title":"From Cursor"}},"required":["subdomain"],"title":"list_note_categoriesArguments","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}}}}