{"openapi":"3.1.0","info":{"title":"TestingBot (BYOK) API","version":"0.1.0","description":"TestingBot (BYOK) lets an AI assistant read your own TestingBot data through the TestingBot API with a key you supply (TestingBot API key). Read-only: 9 tools (get_user, list_tests, get_test, list_builds, list_build_tests, get_test_summary, get_test_trends, list_top_failures, list_test_case_stats). The BYOK key travels with each request, is used for that one call only and is never stored, logged...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-testingbot.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-testingbot/docs"},"termsOfService":"https://connectorbay.com/byok-testingbot/terms"},"servers":[{"url":"https://byok-testingbot.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-testingbot/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 the TestingBot account the key belongs to: name, plan, remaining test seconds, concurrency limits and current concu","description":"Show the TestingBot account the key belongs to: name, plan, remaining test seconds, concurrency limits and current concurrent sessions. Use for \"How many test minutes do I have left on TestingBot\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"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_tests":{"post":{"operationId":"list_tests","summary":"List your TestingBot test sessions, newest first, with pass/fail, browser, OS, duration and build. Filter by build, grou","description":"List your TestingBot test sessions, newest first, with pass/fail, browser, OS, duration and build. Filter by build, group, browser ID or update time. Use for \"Which of my recent TestingBot tests failed\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many items to skip from the start of the result set.","title":"Offset"},"count":{"anyOf":[{"maximum":500,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 500).","title":"Count"},"since":{"anyOf":[{"maximum":4102444800,"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"UNIX timestamp; only tests updated at or after it.","title":"Since"},"browser_id":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only tests that ran on this browser ID.","title":"Browser Id"},"group":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only tests tagged with this group name.","title":"Group"},"build":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only tests in this build identifier.","title":"Build"},"skip_fields":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":"logs,thumbs,steps,video","description":"Comma-separated fields to leave out of each test to keep answers short.","title":"Skip Fields"}},"title":"list_testsArguments","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_test":{"post":{"operationId":"get_test","summary":"Get one test session by numeric ID or WebDriver session ID: state, result, failure message, browser, OS or device, build","description":"Get one test session by numeric ID or WebDriver session ID: state, result, failure message, browser, OS or device, build, groups, duration and type. Use for \"Why did TestingBot test 3 fail\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"test_id":{"description":"Numeric test ID or WebDriver session_id.","maxLength":100,"title":"Test Id","type":"string"},"skip_fields":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":"logs,thumbs,steps,video","description":"Comma-separated fields to leave out of each test to keep answers short.","title":"Skip Fields"}},"required":["test_id"],"title":"get_testArguments","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_builds":{"post":{"operationId":"list_builds","summary":"List your TestingBot builds (groups of tests sharing a build identifier), optionally by tag. Use for \"Which TestingBot b","description":"List your TestingBot builds (groups of tests sharing a build identifier), optionally by tag. Use for \"Which TestingBot builds do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many items to skip from the start of the result set.","title":"Offset"},"count":{"anyOf":[{"maximum":500,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 500).","title":"Count"},"tag":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only builds carrying this tag.","title":"Tag"}},"title":"list_buildsArguments","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_build_tests":{"post":{"operationId":"list_build_tests","summary":"List the test sessions of one build, by numeric build ID or build identifier, with result, browser, OS and duration. Use","description":"List the test sessions of one build, by numeric build ID or build identifier, with result, browser, OS and duration. Use for \"Which tests in TestingBot build first-build failed\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"build_id":{"description":"Numeric build ID or the build identifier string.","maxLength":200,"title":"Build Id","type":"string"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many items to skip from the start of the result set.","title":"Offset"},"count":{"anyOf":[{"maximum":500,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 500).","title":"Count"},"skip_fields":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":"logs,thumbs,steps,video","description":"Comma-separated fields to leave out of each test to keep answers short.","title":"Skip Fields"}},"required":["build_id"],"title":"list_build_testsArguments","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_test_summary":{"post":{"operationId":"get_test_summary","summary":"Show headline totals for a period: tests run, passed, failed, unknown, pass rate and failure rate. Use for \"What was my ","description":"Show headline totals for a period: tests run, passed, failed, unknown, pass rate and failure rate. Use for \"What was my TestingBot pass rate over the last 7 days\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"time_range":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Relative window such as 24h, 7d or 4w; ignored when start is given. Defaults to the last 30 days.","title":"Time Range"},"start":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Period start as ISO-8601 (2026-06-01 or 2026-06-01T00:00:00Z) or a UNIX timestamp.","title":"Start"},"end":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Period end as ISO-8601 or a UNIX timestamp; defaults to now.","title":"End"},"status":{"anyOf":[{"enum":["all","success","failure","unknown"],"type":"string"},{"type":"null"}],"default":null,"description":"Only tests with this status.","title":"Status"},"build":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only these build IDs (comma-separated numeric IDs from the builds list).","title":"Build"},"name":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Only the test with this exact name.","title":"Name"}},"title":"get_test_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_test_trends":{"post":{"operationId":"get_test_trends","summary":"Show pass, fail and unknown counts per day (or per browser, or rolled up by status) for a period, newest first. Use for ","description":"Show pass, fail and unknown counts per day (or per browser, or rolled up by status) for a period, newest first. Use for \"How did my TestingBot results trend over the last 30 days\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"time_range":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Relative window such as 24h, 7d or 4w; ignored when start is given. Defaults to the last 30 days.","title":"Time Range"},"start":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Period start as ISO-8601 (2026-06-01 or 2026-06-01T00:00:00Z) or a UNIX timestamp.","title":"Start"},"end":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Period end as ISO-8601 or a UNIX timestamp; defaults to now.","title":"End"},"status":{"anyOf":[{"enum":["all","success","failure","unknown"],"type":"string"},{"type":"null"}],"default":null,"description":"Only tests with this status.","title":"Status"},"build":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only these build IDs (comma-separated numeric IDs from the builds list).","title":"Build"},"name":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Only the test with this exact name.","title":"Name"},"group_by":{"anyOf":[{"enum":["date","browser","status"],"type":"string"},{"type":"null"}],"default":"date","description":"Bucket dimension: date (default), browser or status.","title":"Group By"}},"title":"get_test_trendsArguments","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_top_failures":{"post":{"operationId":"list_top_failures","summary":"List the most common failure messages of failed tests in a period with occurrence counts. Use for \"What are the top fail","description":"List the most common failure messages of failed tests in a period with occurrence counts. Use for \"What are the top failure messages in my TestingBot tests this week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"time_range":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Relative window such as 24h, 7d or 4w; ignored when start is given. Defaults to the last 30 days.","title":"Time Range"},"start":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Period start as ISO-8601 (2026-06-01 or 2026-06-01T00:00:00Z) or a UNIX timestamp.","title":"Start"},"end":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Period end as ISO-8601 or a UNIX timestamp; defaults to now.","title":"End"},"status":{"anyOf":[{"enum":["all","success","failure","unknown"],"type":"string"},{"type":"null"}],"default":null,"description":"Only tests with this status.","title":"Status"},"build":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only these build IDs (comma-separated numeric IDs from the builds list).","title":"Build"},"name":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Only the test with this exact name.","title":"Name"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many items to skip from the start of the result set.","title":"Offset"},"count":{"anyOf":[{"maximum":500,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 500).","title":"Count"}},"title":"list_top_failuresArguments","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_test_case_stats":{"post":{"operationId":"list_test_case_stats","summary":"List per-test-name statistics for a period: runs, passes, failures, pass rate, flaky flag and average duration. Use for ","description":"List per-test-name statistics for a period: runs, passes, failures, pass rate, flaky flag and average duration. Use for \"Which of my tests are flaky on TestingBot\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"time_range":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Relative window such as 24h, 7d or 4w; ignored when start is given. Defaults to the last 30 days.","title":"Time Range"},"start":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Period start as ISO-8601 (2026-06-01 or 2026-06-01T00:00:00Z) or a UNIX timestamp.","title":"Start"},"end":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Period end as ISO-8601 or a UNIX timestamp; defaults to now.","title":"End"},"status":{"anyOf":[{"enum":["all","success","failure","unknown"],"type":"string"},{"type":"null"}],"default":null,"description":"Only tests with this status.","title":"Status"},"build":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only these build IDs (comma-separated numeric IDs from the builds list).","title":"Build"},"name":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Only the test with this exact name.","title":"Name"},"sort":{"anyOf":[{"enum":["total","pass_rate","failure","flaky","avg_duration"],"type":"string"},{"type":"null"}],"default":"total","description":"Sort field: total, pass_rate, failure, flaky or avg_duration.","title":"Sort"},"sort_order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":"desc","description":"Sort direction.","title":"Sort Order"},"offset":{"anyOf":[{"maximum":1000000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many items to skip from the start of the result set.","title":"Offset"},"count":{"anyOf":[{"maximum":500,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 500).","title":"Count"}},"title":"list_test_case_statsArguments","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}}}}