{"openapi":"3.1.0","info":{"title":"Selectel (BYOK) API","version":"0.1.0","description":"Selectel (BYOK) lets an AI assistant read your own Selectel data through the Selectel API with a key you supply (Selectel static token (not an IAM token)). Read-only: 8 tools (get_balances, get_billing_prediction, get_project_cost_report, list_transactions, list_ptr_records, get_ptr_record, list_support_tickets, count_support_tickets). The BYOK key travels with each request, is used for that one...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-selectel.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-selectel/docs"},"termsOfService":"https://connectorbay.com/byok-selectel/terms"},"servers":[{"url":"https://byok-selectel.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-selectel/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_balances":{"post":{"operationId":"get_balances","summary":"Get account balances per billing type with debts, final sum, currency and debt status. Use for \"How much money is left o","description":"Get account balances per billing type with debts, final sum, currency and debt status. Use for \"How much money is left on my Selectel balance\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_balancesArguments","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_billing_prediction":{"post":{"operationId":"get_billing_prediction","summary":"Estimate for how many hours the remaining balance will keep services running, per product line. Use for \"How long will m","description":"Estimate for how many hours the remaining balance will keep services running, per product line. Use for \"How long will my Selectel balance last\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_billing_predictionArguments","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_project_cost_report":{"post":{"operationId":"get_project_cost_report","summary":"Get the detailed cost report for one month, by project and product, with amounts paid from each balance. Use for \"What d","description":"Get the detailed cost report for one month, by project and product, with amounts paid from each balance. Use for \"What did each of my Selectel projects cost in September 2026\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"year":{"description":"Report year, for example 2026.","maximum":2030,"minimum":2015,"title":"Year","type":"integer"},"month":{"description":"Report month, 1 to 12.","maximum":12,"minimum":1,"title":"Month","type":"integer"},"locale":{"anyOf":[{"enum":["ru","en"],"type":"string"},{"type":"null"}],"default":"en","description":"Language of names: ru or en.","title":"Locale"}},"required":["year","month"],"title":"get_project_cost_reportArguments","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_transactions":{"post":{"operationId":"list_transactions","summary":"List balance transactions in a date range with type, direction, amount, state and service. Use for \"What balance transac","description":"List balance transactions in a date range with type, direction, amount, state and service. Use for \"What balance transactions happened on my Selectel account in September\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"created_from":{"description":"Start of the range, ISO 8601 date-time such as 2026-09-01T00:00:00Z.","maxLength":200,"title":"Created From","type":"string"},"created_to":{"description":"End of the range, ISO 8601 date-time such as 2026-09-30T23:59:59Z.","maxLength":200,"title":"Created To","type":"string"},"limit":{"description":"How many transactions to return (1 to 500).","maximum":500,"minimum":1,"title":"Limit","type":"integer"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many transactions to skip.","title":"Offset"}},"required":["created_from","created_to","limit"],"title":"list_transactionsArguments","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_ptr_records":{"post":{"operationId":"list_ptr_records","summary":"List reverse DNS (PTR) records of your public IP addresses; pages of up to 1000. Use for \"Which PTR records are set for ","description":"List reverse DNS (PTR) records of your public IP addresses; pages of up to 1000. Use for \"Which PTR records are set for my Selectel IP addresses\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many records to return (1 to 1000).","title":"Limit"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many records to skip.","title":"Offset"},"filter":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only records whose domain name matches this text.","title":"Filter"}},"title":"list_ptr_recordsArguments","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_ptr_record":{"post":{"operationId":"get_ptr_record","summary":"Get one PTR record by id: IP address, host name and TTL. Use for \"What is PTR record 42 on Selectel\".","description":"Get one PTR record by id: IP address, host name and TTL. Use for \"What is PTR record 42 on Selectel\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"ptr_id":{"description":"Numeric id of the PTR record, from list_ptr_records.","title":"Ptr Id","type":"integer"}},"required":["ptr_id"],"title":"get_ptr_recordArguments","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_support_tickets":{"post":{"operationId":"list_support_tickets","summary":"List your support tickets with number, summary, status, dates and unread comment count. Use for \"Which Selectel support ","description":"List your support tickets with number, summary, status, dates and unread comment count. Use for \"Which Selectel support tickets are still open\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"items_per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"How many tickets per page (1 to 100).","title":"Items Per Page"},"is_only_opened":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to list only open tickets.","title":"Is Only Opened"},"sort_by":{"anyOf":[{"enum":["created_at","updated_at","resolved_at","closed_at"],"type":"string"},{"type":"null"}],"default":"created_at","description":"Order by created_at, updated_at, resolved_at or closed_at.","title":"Sort By"}},"title":"list_support_ticketsArguments","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/count_support_tickets":{"post":{"operationId":"count_support_tickets","summary":"Count your support tickets, optionally only open or closed ones. Use for \"How many open support tickets do I have at Sel","description":"Count your support tickets, optionally only open or closed ones. Use for \"How many open support tickets do I have at Selectel\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"is_only_opened":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to count only open tickets.","title":"Is Only Opened"},"is_only_closed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to count only closed tickets.","title":"Is Only Closed"}},"title":"count_support_ticketsArguments","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}}}}