{"openapi":"3.1.0","info":{"title":"SpeedCurve (BYOK) API","version":"0.1.0","description":"SpeedCurve (BYOK) lets an AI assistant read your own SpeedCurve data through the SpeedCurve API with a key you supply (API key (sent as the Basic auth user name)). Read-only: 10 tools (list_sites, get_site, list_urls, list_tests, get_test, get_url_tests, list_budgets, list_deploys, get_latest_deploy, list_notes). The BYOK key travels with each request, is used for that one call only and is never...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-speedcurve.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-speedcurve/docs"},"termsOfService":"https://connectorbay.com/byok-speedcurve/terms"},"servers":[{"url":"https://byok-speedcurve.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-speedcurve/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_sites":{"post":{"operationId":"list_sites","summary":"List the sites and monitored URLs of the team with the number of scheduled checks. Use for \"Which sites does SpeedCurve ","description":"List the sites and monitored URLs of the team with the number of scheduled checks. Use for \"Which sites does SpeedCurve monitor for me\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_sitesArguments","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_site":{"post":{"operationId":"get_site","summary":"Get one site's monitored URLs, test regions, browsers and test times. Use for \"Which regions and browsers does SpeedCurv","description":"Get one site's monitored URLs, test regions, browsers and test times. Use for \"Which regions and browsers does SpeedCurve test site 123 from\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"site_id":{"description":"Numeric site ID, from list_sites.","title":"Site Id","type":"integer"}},"required":["site_id"],"title":"get_siteArguments","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_urls":{"post":{"operationId":"list_urls","summary":"List the monitored URLs across all sites. Use for \"Which URLs are monitored in SpeedCurve\".","description":"List the monitored URLs across all sites. Use for \"Which URLs are monitored in SpeedCurve\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_urlsArguments","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 synthetic test results in a date range with Core Web Vitals style metrics (speed index, FCP, LCP, CLS, TTI), size a","description":"List synthetic test results in a date range with Core Web Vitals style metrics (speed index, FCP, LCP, CLS, TTI), size and request count. Use for \"What did SpeedCurve measure for my site over the last week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start_timestamp":{"description":"Unix timestamp in seconds for the start of the period (at most 12 months back).","minimum":0,"title":"Start Timestamp","type":"integer"},"end_timestamp":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Unix timestamp in seconds (end of the period; at most 12 months back).","title":"End Timestamp"},"site_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only tests of this site ID.","title":"Site Id"},"url_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only tests of this URL ID.","title":"Url Id"},"region":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only this test location ID, for example us-west-1.","title":"Region"},"browser":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only this browser name.","title":"Browser"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"Tests per page (1 to 100, default 10).","title":"Per Page"}},"required":["start_timestamp"],"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 synthetic test result with its performance metrics, resource sizes and request counts. Use for \"Show the details","description":"Get one synthetic test result with its performance metrics, resource sizes and request counts. Use for \"Show the details of SpeedCurve test 230101_AB_1\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"test_id":{"description":"The test ID, from list_tests.","maxLength":200,"title":"Test Id","type":"string"}},"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/get_url_tests":{"post":{"operationId":"get_url_tests","summary":"List recent tests of one monitored URL (default last 7 days, up to 365) with metrics. Use for \"How has SpeedCurve URL 7 ","description":"List recent tests of one monitored URL (default last 7 days, up to 365) with metrics. Use for \"How has SpeedCurve URL 7 performed over the last month\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"url_id":{"description":"Numeric URL ID, from list_sites or list_urls.","title":"Url Id","type":"integer"},"days":{"anyOf":[{"maximum":365,"minimum":1,"type":"integer"},{"type":"null"}],"default":7,"description":"How many days of tests (default 7, maximum 365).","title":"Days"},"region":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only this test location ID.","title":"Region"},"browser":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only this browser name.","title":"Browser"},"per_page":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Tests per page (maximum 100); enables paging.","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Page number when per_page is set.","title":"Page"}},"required":["url_id"],"title":"get_url_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/list_budgets":{"post":{"operationId":"list_budgets","summary":"List performance budgets with metric, thresholds, current status, alert settings and the chart they belong to. Use for \"","description":"List performance budgets with metric, thresholds, current status, alert settings and the chart they belong to. Use for \"Which SpeedCurve performance budgets are currently exceeded\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"deploy_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only budgets affected by this deploy ID.","title":"Deploy Id"}},"title":"list_budgetsArguments","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_deploys":{"post":{"operationId":"list_deploys","summary":"List deploys with site, time, note and detail, optionally for one site or a time range. Use for \"What deploys has SpeedC","description":"List deploys with site, time, note and detail, optionally for one site or a time range. Use for \"What deploys has SpeedCurve recorded this month\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"site_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only deploys of this site ID.","title":"Site Id"},"start_timestamp":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Unix timestamp in seconds for the start of the period.","title":"Start Timestamp"},"end_timestamp":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Unix timestamp in seconds for the end of the period.","title":"End Timestamp"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"per_page":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1000,"description":"Deploys per page (maximum 1000, default 1000).","title":"Per Page"}},"title":"list_deploysArguments","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_latest_deploy":{"post":{"operationId":"get_latest_deploy","summary":"Get the latest deploy with its test status: tests completed and tests still remaining. Use for \"Have the tests for my la","description":"Get the latest deploy with its test status: tests completed and tests still remaining. Use for \"Have the tests for my latest SpeedCurve deploy finished\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_latest_deployArguments","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 (annotations) added to sites, with time and text. Use for \"What notes are on my SpeedCurve charts\".","description":"List notes (annotations) added to sites, with time and text. Use for \"What notes are on my SpeedCurve charts\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"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}}}}