{"openapi":"3.1.0","info":{"title":"Page Speed Insights (BYOK) API","version":"0.1.0","description":"Page Speed Insights (BYOK) lets an AI assistant read your own Page Speed Insights data through the Page Speed Insights API with a key you supply (Google API key (PageSpeed Insights API enabled)). Read-only: 6 tools (get_performance_score, get_accessibility_score, get_seo_score, get_best_practices_score, get_page_field_data, get_origin_field_data). The BYOK key travels with each request, is used...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-pagespeed.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-pagespeed/docs"},"termsOfService":"https://connectorbay.com/byok-pagespeed/terms"},"servers":[{"url":"https://byok-pagespeed.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-pagespeed/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_performance_score":{"post":{"operationId":"get_performance_score","summary":"Analyze a public page and return its Lighthouse performance score (0 to 1) with the main lab timings: first contentful p","description":"Analyze a public page and return its Lighthouse performance score (0 to 1) with the main lab timings: first contentful paint, speed index, largest contentful paint, total blocking time and time to interactive. Use for \"How fast does https://example.com/ load on mobile according to PageSpeed Insights\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"url":{"description":"Full http or https address of the page to analyze, for example https://example.com/.","maxLength":500,"title":"Url","type":"string"},"strategy":{"anyOf":[{"enum":["desktop","mobile"],"type":"string"},{"type":"null"}],"default":"desktop","description":"Analyze as desktop (default) or mobile.","title":"Strategy"},"category":{"anyOf":[{"const":"performance","type":"string"},{"type":"null"}],"default":"performance","description":"Lighthouse category to run (fixed to performance for this tool).","title":"Category"}},"required":["url"],"title":"get_performance_scoreArguments","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_accessibility_score":{"post":{"operationId":"get_accessibility_score","summary":"Analyze a public page and return its Lighthouse accessibility score (0 to 1). Use for \"What is the accessibility score o","description":"Analyze a public page and return its Lighthouse accessibility score (0 to 1). Use for \"What is the accessibility score of https://example.com/\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"url":{"description":"Full http or https address of the page to analyze, for example https://example.com/.","maxLength":500,"title":"Url","type":"string"},"strategy":{"anyOf":[{"enum":["desktop","mobile"],"type":"string"},{"type":"null"}],"default":"desktop","description":"Analyze as desktop (default) or mobile.","title":"Strategy"},"category":{"anyOf":[{"const":"accessibility","type":"string"},{"type":"null"}],"default":"accessibility","description":"Lighthouse category to run (fixed to accessibility for this tool).","title":"Category"}},"required":["url"],"title":"get_accessibility_scoreArguments","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_seo_score":{"post":{"operationId":"get_seo_score","summary":"Analyze a public page and return its Lighthouse SEO score (0 to 1). Use for \"What is the Lighthouse SEO score of https:/","description":"Analyze a public page and return its Lighthouse SEO score (0 to 1). Use for \"What is the Lighthouse SEO score of https://example.com/\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"url":{"description":"Full http or https address of the page to analyze, for example https://example.com/.","maxLength":500,"title":"Url","type":"string"},"strategy":{"anyOf":[{"enum":["desktop","mobile"],"type":"string"},{"type":"null"}],"default":"desktop","description":"Analyze as desktop (default) or mobile.","title":"Strategy"},"category":{"anyOf":[{"const":"seo","type":"string"},{"type":"null"}],"default":"seo","description":"Lighthouse category to run (fixed to seo for this tool).","title":"Category"}},"required":["url"],"title":"get_seo_scoreArguments","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_best_practices_score":{"post":{"operationId":"get_best_practices_score","summary":"Analyze a public page and return its Lighthouse best-practices score (0 to 1). Use for \"What is the best-practices score","description":"Analyze a public page and return its Lighthouse best-practices score (0 to 1). Use for \"What is the best-practices score of https://example.com/\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"url":{"description":"Full http or https address of the page to analyze, for example https://example.com/.","maxLength":500,"title":"Url","type":"string"},"strategy":{"anyOf":[{"enum":["desktop","mobile"],"type":"string"},{"type":"null"}],"default":"desktop","description":"Analyze as desktop (default) or mobile.","title":"Strategy"},"category":{"anyOf":[{"const":"best-practices","type":"string"},{"type":"null"}],"default":"best-practices","description":"Lighthouse category to run (fixed to best-practices for this tool).","title":"Category"}},"required":["url"],"title":"get_best_practices_scoreArguments","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_page_field_data":{"post":{"operationId":"get_page_field_data","summary":"Get real-user (Chrome UX Report) field data for one page: overall rating and the 75th percentile with FAST, AVERAGE or S","description":"Get real-user (Chrome UX Report) field data for one page: overall rating and the 75th percentile with FAST, AVERAGE or SLOW category for first contentful paint and interaction to next paint. Empty when Google has too little data for the page. Google has announced this field data will be discontinued in this API. Use for \"What do real users experience on https://example.com/ for load and interaction speed\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"url":{"description":"Full http or https address of the page to analyze, for example https://example.com/.","maxLength":500,"title":"Url","type":"string"},"strategy":{"anyOf":[{"enum":["desktop","mobile"],"type":"string"},{"type":"null"}],"default":"desktop","description":"Analyze as desktop (default) or mobile.","title":"Strategy"}},"required":["url"],"title":"get_page_field_dataArguments","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_origin_field_data":{"post":{"operationId":"get_origin_field_data","summary":"Get real-user (Chrome UX Report) field data for the whole origin of a page: overall rating and the 75th percentile with ","description":"Get real-user (Chrome UX Report) field data for the whole origin of a page: overall rating and the 75th percentile with category for first contentful paint and interaction to next paint. Empty when Google has too little data. Google has announced this field data will be discontinued in this API. Use for \"How does the whole example.com site perform for real users\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"url":{"description":"Full http or https address of the page to analyze, for example https://example.com/.","maxLength":500,"title":"Url","type":"string"},"strategy":{"anyOf":[{"enum":["desktop","mobile"],"type":"string"},{"type":"null"}],"default":"desktop","description":"Analyze as desktop (default) or mobile.","title":"Strategy"}},"required":["url"],"title":"get_origin_field_dataArguments","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}}}}