{"componentChunkName":"component---src-templates-docs-js","path":"/guides/monitor-website-performance/ci-build-gating","result":{"data":{"site":{"siteMetadata":{"title":"Documentation | LoadFocus","docsLocation":""}},"mdx":{"fields":{"id":"80bca631-e450-5095-8561-0b6fbfa23dae","title":"CI Build Gating & Deploy Markers","slug":"/guides/monitor-website-performance/ci-build-gating","locale":"en-GB"},"body":"var _excluded = [\"components\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"CI Build Gating & Deploy Markers\",\n  \"date\": \"2026-10-29\",\n  \"metaTitle\": \"Page Speed CI Build Gating and Deploy Markers | LoadFocus\",\n  \"metaDescription\": \"Fail a CI build when a page gets slower: run a page speed monitor from GitHub Actions, check its budgets and mark every deploy on the history charts.\",\n  \"order\": 16\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"You can run a page speed monitor from your CI pipeline and fail the build when the page breaks a budget, so a slow release stops before it reaches your visitors. The same step can mark the deploy on the monitor's history charts, so a slowdown lines up with the release that caused it.\"), mdx(\"p\", null, \"Everything runs through one small script served at \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"https://speed.loadfocus.com/ci.js\"), \". It needs Node 14 or later and has no dependencies, so it works in GitHub Actions and in any other CI that runs Node.\"), mdx(\"h2\", null, \"Before you start\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"A monitor for the page.\"), \" The script runs a monitor you already have, see \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"/docs/guides/monitor-website-performance/getting-started\"\n  }, \"Getting started\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"The monitor id.\"), \" Open a result of the monitor and scroll to \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"CI and deploy markers\"), \" under the history charts. The step under \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Fail a build when this page gets slower\"), \" already contains the id, and \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Copy\"), \" puts it on your clipboard. The id is also the part after \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"/speedtests/\"), \" in the result page address.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"An API key.\"), \" Create one on the \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://loadfocus.com/account/api-keys\"\n  }, \"API Keys page\"), \" and store it as a CI secret called \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"LOADFOCUS_API_KEY\"), \". If you work in more than one team, set \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"LOADFOCUS_TEAM_ID\"), \" too; without it your default team is used.\")), mdx(\"p\", null, \"Each CI run starts a real run of the monitor, so it counts as one test run on your plan.\"), mdx(\"h2\", null, \"GitHub Actions example\"), mdx(\"p\", null, \"Add your API key as a repository secret (Settings > Secrets and variables > Actions > \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"LOADFOCUS_API_KEY\"), \"), then create \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".github/workflows/page-speed.yml\"), \":\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"name: Page speed budget\\n\\non:\\n  push:\\n    branches: [ main ]\\n\\njobs:\\n  page-speed:\\n    runs-on: ubuntu-latest\\n    steps:\\n      - name: Page speed budget\\n        run: curl -fsSL https://speed.loadfocus.com/ci.js | node - --monitor YOUR_MONITOR_ID --marker \\\"${{ github.sha }}\\\" --budget \\\"lcp<=2.5\\\"\\n        env:\\n          LOADFOCUS_API_KEY: ${{ secrets.LOADFOCUS_API_KEY }}\\n\")), mdx(\"p\", null, \"Replace \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"YOUR_MONITOR_ID\"), \" with your monitor id. The step posts a deploy marker labelled with the commit, runs the monitor, waits for the result and fails the job when a budget breaks. Put it after your deploy step so it measures the release you just shipped.\"), mdx(\"p\", null, \"To link the marker to the commit page, add \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"--marker-url \\\"${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}\\\"\"), \". Repeat \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"--budget\"), \" for more limits, for example \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"--budget \\\"lcp<=2.5\\\" --budget \\\"performance>=90\\\"\"), \".\"), mdx(\"h2\", null, \"Options\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Option\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"What it does\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"--monitor <id>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The monitor to run. Required.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"--budget \\\"lcp<=2.5\\\"\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"An extra limit for this run. Repeatable.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"--marker \\\"<label>\\\"\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Also posts a deploy marker with this label (up to 120 characters), for example the commit or tag.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"--marker-url <url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A link for the marker, for example the release or commit page.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"--timeout <seconds>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Gives up after this long. Default 900.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"--json\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Prints the raw result as JSON.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"--host <url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Default \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"https://speed.loadfocus.com\"), \".\")))), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"curl -fsSL https://speed.loadfocus.com/ci.js | node - --help\"), \" prints the same list.\"), mdx(\"h2\", null, \"Which budgets are checked\"), mdx(\"p\", null, \"Every run is checked against two sets of limits:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"The monitor's threshold alerts.\"), \" Each enabled alert with \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"above\"), \" or \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"below\"), \" and a value counts as a budget: an alert on Largest Contentful Paint above 2.5 becomes the budget \\\"LCP at most 2.5 s\\\". These are the same budgets the result page shows, see \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"/docs/guides/monitor-website-performance/performance-budgets\"\n  }, \"Performance budgets\"), \". Alerts that use \\\"regresses by (%)\\\" have no fixed limit and are not checked.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Every \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"--budget\"), \" you pass.\"), \" A budget is a metric, \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<=\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \">=\"), \", and a number. You can pass up to 30.\")), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Metric\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Unit\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"performance\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"accessibility\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"best-practices\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"seo\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"score from 0 to 100\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"fcp\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"lcp\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"si\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"tbt\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"tti\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"seconds\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"cls\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Cumulative Layout Shift\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"weight\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"page weight in KB\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"requests\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"number of requests\")))), mdx(\"p\", null, \"Time metrics are in seconds, Total Blocking Time included: \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"tbt<=0.3\"), \" means 300 ms. A budget whose metric was not measured on the run fails, so a page that could not be measured never passes the gate.\"), mdx(\"h2\", null, \"Exit codes and output\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Exit code\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Meaning\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"0\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"All budgets met.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"1\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A budget broke.\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"2\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"The run could not be checked: the API key or monitor id is missing, the run could not start (for example because of your plan's limits), the page could not be tested, the run was aborted, or there was no result before the timeout.\")))), mdx(\"p\", null, \"The log shows one \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"PASS\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"FAIL\"), \" line per budget with the measured value, the limit and where the budget came from (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"alert\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"pipeline\"), \"), then a link to the full report. If no budgets are set, the script says so and exits 0.\"), mdx(\"p\", null, \"On GitHub Actions the result is also written to the job summary: the four Lighthouse scores, a table of every budget and a \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Full report\"), \" link.\"), mdx(\"h2\", null, \"Deploy markers\"), mdx(\"p\", null, \"A marker is a dashed line on the monitor's history charts, in the \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Deploys\"), \" series. With \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"--marker\"), \" the script posts one before it starts the run. If the marker cannot be posted, the script says so and carries on with the check.\"), mdx(\"p\", null, \"To mark deploys without running a check, use the command under \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Or only mark deploys\"), \" in the same panel:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"curl -X POST \\\"https://speed.loadfocus.com/api/test/applighthouse/annotations\\\" \\\\\\n  -H \\\"loadfocus-auth: YOUR_API_KEY\\\" -H \\\"content-type: application/json\\\" \\\\\\n  -d '{\\\"label\\\":\\\"Deployed v1.4.2\\\",\\\"configId\\\":\\\"YOUR_MONITOR_ID\\\"}'\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"label\"), \" is required, up to 120 characters.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Leave out \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"configId\"), \" to mark every monitor in the team.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Add \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"url\"), \" to link the release.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Add \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"timestamp\"), \" (ISO date or epoch) to back-date the marker, up to 30 days.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Recent markers\"), \" in the panel lists the markers in the period shown, newest first. Markers posted without a monitor read \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"all monitors\"), \", and \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Delete\"), \" removes one. When a team reaches 5,000 markers, the oldest make room for new ones.\"), mdx(\"h2\", null, \"Compare two runs\"), mdx(\"p\", null, \"When a budget breaks, the \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Compare runs\"), \" section of the result shows what changed. Pick another run of the same monitor in \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Compare with\"), \" and LoadFocus lists, side by side with a \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Change\"), \" column:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Scores\"), \" and \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Metrics\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Page weight\"), \", in total and per resource type, plus the number of \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Requests\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"New requests\"), \", \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Requests that grew\"), \" and \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Removed requests\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"New issues\"), \" and \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Fixed since then\"), \", the audits that started or stopped failing\")), mdx(\"p\", null, \"Add the other run's id to the result address as a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"compare\"), \" parameter (for example \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"&compare=12345\"), \" after the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"testrunid\"), \") and the page opens with that run already picked, which is handy to share.\"), mdx(\"h2\", null, \"Related\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"/docs/guides/monitor-website-performance/performance-budgets\"\n  }, \"Performance budgets\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"/docs/guides/monitor-website-performance/alert-configuration\"\n  }, \"Alert configuration\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"/docs/guides/monitor-website-performance/experiments\"\n  }, \"Page speed experiments\"))));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#before-you-start","title":"Before you start"},{"url":"#github-actions-example","title":"GitHub Actions example"},{"url":"#options","title":"Options"},{"url":"#which-budgets-are-checked","title":"Which budgets are checked"},{"url":"#exit-codes-and-output","title":"Exit codes and output"},{"url":"#deploy-markers","title":"Deploy markers"},{"url":"#compare-two-runs","title":"Compare two runs"},{"url":"#related","title":"Related"}]},"parent":{"__typename":"File","relativePath":"en/guides/monitor-website-performance/ci-build-gating.md"},"frontmatter":{"metaTitle":"Page Speed CI Build Gating and Deploy Markers | LoadFocus","metaDescription":"Fail a CI build when a page gets slower: run a page speed monitor from GitHub Actions, check its budgets and mark every deploy on the history charts.","order":16,"noindex":null}},"allMdx":{"edges":[{"node":{"fields":{"slug":"/","title":"Welcome to the LoadFocus Documentation"}}},{"node":{"fields":{"slug":"/guides","title":"How-To Guides"}}},{"node":{"fields":{"slug":"/knowledge-base","title":"Knowledge Base"}}},{"node":{"fields":{"slug":"/pricing","title":"Pricing FAQs"}}},{"node":{"fields":{"slug":"/knowledge-base/how-to-delete-your-account","title":"How to Delete Your Account"}}},{"node":{"fields":{"slug":"/guides/api-monitoring","title":"API Monitoring"}}},{"node":{"fields":{"slug":"/knowledge-base/how-to-update-card-details","title":"How to Update Card Details for Failed Payments"}}},{"node":{"fields":{"slug":"/knowledge-base/understanding-declined-card-payments","title":"Why has my card payment been declined?"}}},{"node":{"fields":{"slug":"/knowledge-base/using-3rd-party-tools-to-load-test-website-locally","title":"How to Load Test a Locally Hosted Website or API"}}},{"node":{"fields":{"slug":"/knowledge-base/understanding-differences-between-http-and-https","title":"Differences between HTTP and HTTPS"}}},{"node":{"fields":{"slug":"/knowledge-base/using-google-analytics-and-no-requests-while-load-testing","title":"No traffic in Google Analytics while load testing"}}},{"node":{"fields":{"slug":"/knowledge-base/using-query-parameters","title":"How to Use URL Query Parameters"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing","title":"Load Testing with Apache JMeter"}}},{"node":{"fields":{"slug":"/guides/external-reports","title":"External Reporting"}}},{"node":{"fields":{"slug":"/guides/k6-load-testing","title":"k6 Load Testing"}}},{"node":{"fields":{"slug":"/knowledge-base/what-is-an-http-method","title":"What is an HTTP request method"}}},{"node":{"fields":{"slug":"/knowledge-base/using-valid-url-endpoints","title":"What is a Valid URL for a Load Test"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance","title":"Monitor Website Performance"}}},{"node":{"fields":{"slug":"/guides/mcp","title":"AI Assistants (MCP)"}}},{"node":{"fields":{"slug":"/guides/load-testing","title":"Load Testing"}}},{"node":{"fields":{"slug":"/guides/onboarding","title":"LoadFocus Onboarding"}}},{"node":{"fields":{"slug":"/guides/monitoring-as-code","title":"Monitoring as Code"}}},{"node":{"fields":{"slug":"/guides/setup-teardown-scripts","title":"Setup and teardown scripts"}}},{"node":{"fields":{"slug":"/guides/openapi-import","title":"Import from OpenAPI / Swagger"}}},{"node":{"fields":{"slug":"/guides/teams","title":"Teams Management"}}},{"node":{"fields":{"slug":"/guides/reusable-snippets","title":"Reusable snippets"}}},{"node":{"fields":{"slug":"/guides/external-reports/azure-app-insights-integration","title":"Azure App Insights Integration"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/downloading-jmx-csv-files","title":"Downloading .JMX and .CSV Files in LoadFocus"}}},{"node":{"fields":{"slug":"/guides/k6-load-testing/analyzing-k6-test-results","title":"Analyzing k6 Load Test Results"}}},{"node":{"fields":{"slug":"/guides/load-testing/adding-notes-to-results","title":"Adding Notes to Test Results"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/alert-configuration","title":"Alert Configuration"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/alert-channels","title":"Alert Channels"}}},{"node":{"fields":{"slug":"/guides/external-reports/datadog-integration","title":"Datadog Integration"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/how-to-run-new-apache-jmeter-load-test","title":"How to Run a New Apache JMeter Load Test"}}},{"node":{"fields":{"slug":"/guides/k6-load-testing/how-to-run-k6-load-test","title":"How to Run a New k6 Load Test"}}},{"node":{"fields":{"slug":"/guides/load-testing/ai-credits","title":"AI Credits"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/alert-metrics","title":"Alert Metrics"}}},{"node":{"fields":{"slug":"/guides/external-reports/dynatrace-integration","title":"Dynatrace Integration"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/api-check-results","title":"Understanding API Check Results"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/import-to-jmeter-from-curl-har-postman-openapi","title":"Import cURL, HAR, Postman or OpenAPI to a JMeter Test"}}},{"node":{"fields":{"slug":"/guides/k6-load-testing/import-to-k6-from-curl-har-postman-openapi","title":"Import cURL, HAR, Postman or OpenAPI to a k6 Test"}}},{"node":{"fields":{"slug":"/guides/load-testing/analyzing-load-test-results","title":"How to Check Load Test Results"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/browser-checks","title":"Browser Checks"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/ci-build-gating","title":"CI Build Gating & Deploy Markers"}}},{"node":{"fields":{"slug":"/guides/external-reports/new-relic-integration","title":"New Relic Integration"}}},{"node":{"fields":{"slug":"/guides/k6-load-testing/uploading-k6-scripts","title":"Uploading k6 Scripts and Data Files"}}},{"node":{"fields":{"slug":"/guides/load-testing/authorization-code-grant-type-oauth-2-0","title":"Authorization Code Grant Type in OAuth 2.0"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/core-web-vitals-competitor-comparison","title":"Core Web Vitals Competitor Comparison"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/check-groups","title":"Check Groups"}}},{"node":{"fields":{"slug":"/guides/external-reports/opentelemetry-integration","title":"OpenTelemetry (OTLP) Integration"}}},{"node":{"fields":{"slug":"/guides/load-testing/baseline-comparison-between-load-tests","title":"Baseline Comparison Between Load Tests"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/jmeter-integration-ci-cd","title":"Run JMeter Tests with the LoadFocus API Client"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/core-web-vitals-metrics","title":"What are the Core Web Vitals?"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/check-retries-and-alert-thresholds","title":"Check Retries and Alert Thresholds"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/load-generators-hardware-infrastructure-jmeter","title":"What are the hardware resources allocated to my account for load generators?"}}},{"node":{"fields":{"slug":"/guides/load-testing/client-credentials-grant-type-oauth-2-0","title":"Client Credentials Grant Type in OAuth 2.0"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/experiments","title":"Page Speed Experiments"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/custom-domain-status-page","title":"How to Add a Custom Domain to Your Status Page"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/load-testing-anomalies","title":"Load Testing Anomalies"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/getting-started","title":"Getting Started"}}},{"node":{"fields":{"slug":"/guides/load-testing/common-http-error-codes","title":"Common HTTP Error status codes"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/dashboards","title":"Dashboards"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/load-testing-engine-health-monitoring","title":"Engine Health Monitoring"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/how-to-create-new-alert","title":"Create a New Alert"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/dns-monitors","title":"DNS Monitors"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/load-testing-error-analysis","title":"Error Analysis"}}},{"node":{"fields":{"slug":"/guides/load-testing/decoding-average-response-times","title":"Decoding Average Response Time"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/how-to-run-new-website-performance-test","title":"Create New Website Performance Test"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/heartbeat-monitors","title":"Heartbeat (Cron Job) Monitors"}}},{"node":{"fields":{"slug":"/guides/load-testing/crafting-perfect-test-names","title":"Crafting Perfect Test Names"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/load-testing-insights","title":"Load Testing Insights"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/http-authentication","title":"HTTP Authentication"}}},{"node":{"fields":{"slug":"/guides/load-testing/deep-dive-samples-in-load-testing","title":"What are Samples in Load Testing?"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/incident-management","title":"Incident Management"}}},{"node":{"fields":{"slug":"/guides/load-testing/demo","title":"Demo"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/load-testing-jtl-file-analysis","title":"Logs & JTL File Analysis"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/maintenance-windows","title":"Maintenance Windows"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/largest-contentful-paint","title":"Largest Contentful Paint (LCP)"}}},{"node":{"fields":{"slug":"/guides/load-testing/end-time-in-load-testing","title":"Understanding the Significance of 'End Time' in Load Testing"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/lighthouse-opportunities","title":"Lighthouse Opportunities"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/multistep-api-checks","title":"Multistep API Checks"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/load-testing-jtl-jmeter-log-file-analysis","title":"JMeter Log File Analysis"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/load-testing-timeline-analysis","title":"Timeline View"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/pdf-report-branding","title":"Branded PDF Reports"}}},{"node":{"fields":{"slug":"/guides/load-testing/errors-by-type","title":"Errors by Type and Error Rate"}}},{"node":{"fields":{"slug":"/guides/load-testing/erros-and-reponse-codes","title":"Errors and Response Codes"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/uploading-jmeter-files-step-by-step-guide","title":"Uploading JMeter Files to LoadFocus: A Step-by-Step Guide"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check","title":"How to Create a New API Check"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/performance-budgets","title":"Performance Budgets & Alerts"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/real-user-field-data","title":"Real-User Field Data (CrUX)"}}},{"node":{"fields":{"slug":"/guides/load-testing/geographical-test-location-in-load-testing","title":"Geographical Test Location in Load Testing"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/using-multiple-csv-files-with-jmeter-engines","title":"Using Multiple CSV Files with JMeter Engines in LoadFocus"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/recent-failures","title":"Recent Failures"}}},{"node":{"fields":{"slug":"/guides/load-testing/getting-started","title":"Getting Started"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/real-user-monitoring","title":"Real User Monitoring (RUM)"}}},{"node":{"fields":{"slug":"/guides/load-testing/granularity-in-load-test-results-and-charts","title":"Granularity in Load Test Results and Chart Display"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/sla-slo-reports","title":"SLA & SLO Uptime Reports"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/sitemap-import","title":"Sitemap Import"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/snippets","title":"Snippets"}}},{"node":{"fields":{"slug":"/guides/load-testing/group-filter-load-test-results-by-url","title":"Group and Filter Load Test Results by URL"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/ssl-certificate-monitoring","title":"SSL Certificate Monitoring"}}},{"node":{"fields":{"slug":"/guides/load-testing/headers-and-manage-presets","title":"Headers and Header Presets"}}},{"node":{"fields":{"slug":"/guides/monitor-website-performance/visual-regression-testing","title":"Visual Regression Testing"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/status-page-api","title":"Status Page API, RSS Feeds and Status Badge"}}},{"node":{"fields":{"slug":"/guides/load-testing/how-to-run-new-load-test","title":"How to Run a New Load Test"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/status-pages","title":"Create a Public Status Page for Your Monitors"}}},{"node":{"fields":{"slug":"/guides/load-testing/how-to-url-query-parameters","title":"Query Parameters"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/synthetic-monitoring","title":"Synthetic Monitoring"}}},{"node":{"fields":{"slug":"/guides/load-testing/http-methods-overview-load-testing","title":"HTTP Methods: An Overview"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/tcp-monitors","title":"TCP Port Monitors"}}},{"node":{"fields":{"slug":"/guides/load-testing/load-generator-saturation","title":"Load Generator Saturation"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/uptime-monitoring","title":"Uptime Monitoring"}}},{"node":{"fields":{"slug":"/guides/load-testing/implicit-grant-type-oauth-2-0","title":"Implicit Grant Type in OAuth 2.0"}}},{"node":{"fields":{"slug":"/guides/load-testing/load-generators-hardware-infrastructure","title":"What are the hardware resources allocated to my account for load generators?"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/variables","title":"Variables"}}},{"node":{"fields":{"slug":"/guides/load-testing/load-test-results-api","title":"Results Analysis API"}}},{"node":{"fields":{"slug":"/guides/load-testing/load-test-result-ai-analysis","title":"Load Testing Results AI Analysis"}}},{"node":{"fields":{"slug":"/guides/load-testing/page-speed-under-load","title":"Page Speed Under Load"}}},{"node":{"fields":{"slug":"/guides/load-testing/page-speed-under-load-trends","title":"Page Speed Under Load Trends"}}},{"node":{"fields":{"slug":"/guides/load-testing/pass-fail-thresholds","title":"Pass/Fail Thresholds"}}},{"node":{"fields":{"slug":"/guides/load-testing/password-credentials-grant-type-oauth-2-0","title":"Password Credentials Grant Type in OAuth 2.0"}}},{"node":{"fields":{"slug":"/guides/load-testing/reading-the-capacity-panel","title":"Reading the Capacity Panel"}}},{"node":{"fields":{"slug":"/guides/load-testing/performance-trend-load-test-results","title":"Performance Trend"}}},{"node":{"fields":{"slug":"/guides/load-testing/refresh-token-grant-type-oauth-2-0","title":"Refresh Token Grant Type in OAuth 2.0"}}},{"node":{"fields":{"slug":"/guides/load-testing/response-time-distribution","title":"Response Time Distribution"}}},{"node":{"fields":{"slug":"/guides/load-testing/response-time-vs-virtual-users","title":"Response Time vs. Virtual Users"}}},{"node":{"fields":{"slug":"/guides/load-testing/release-tags-and-run-annotations","title":"Release Tags and Run Annotations"}}},{"node":{"fields":{"slug":"/guides/load-testing/results-by-location","title":"Results by Location"}}},{"node":{"fields":{"slug":"/guides/load-testing/scheduled-load-tests","title":"Scheduled Load Tests"}}},{"node":{"fields":{"slug":"/guides/load-testing/share-load-test-reports","title":"Share Load Test Reports"}}},{"node":{"fields":{"slug":"/guides/load-testing/slowest-and-most-failing-requests","title":"Slowest and Most Failing Requests"}}},{"node":{"fields":{"slug":"/guides/load-testing/start-time-in-load-testing","title":"Understanding the Significance of Start Time in Load Testing"}}},{"node":{"fields":{"slug":"/guides/load-testing/using-cookies","title":"Using Cookies"}}},{"node":{"fields":{"slug":"/guides/load-testing/what-are-virtual-users-load-testing","title":"What are Virtual Users in Load Testing"}}},{"node":{"fields":{"slug":"/guides/load-testing/use-cases","title":"Use Cases"}}},{"node":{"fields":{"slug":"/guides/load-testing/what-are-iterations-load-testing","title":"What Are Iterations in Load Testing?"}}},{"node":{"fields":{"slug":"/guides/load-testing/what-is-delay-when-running-a-load-test","title":"What is Delay when running a Load Test?"}}},{"node":{"fields":{"slug":"/guides/load-testing/what-is-duration-in-load-testing","title":"What is Duration in Load Testing"}}},{"node":{"fields":{"slug":"/guides/load-testing/what-is-grant-type","title":"What is a Grant Type?"}}},{"node":{"fields":{"slug":"/guides/load-testing/what-is-oauth-2-0-authorization","title":"OAuth 2.0 Authorization"}}},{"node":{"fields":{"slug":"/guides/load-testing/what-is-ramp-up-steps-in-load-testing","title":"What is Ramp Up Steps in Load Testing"}}},{"node":{"fields":{"slug":"/guides/load-testing/what-is-ramp-up-time-in-load-testing","title":"What is Ramp Up Time in Load Testing"}}},{"node":{"fields":{"slug":"/guides/load-testing/what-is-test-run-id","title":"What is a Test Run Id?"}}},{"node":{"fields":{"slug":"/guides/load-testing/white-label-report-branding","title":"Branded PDF Reports"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/alert-channels/email","title":"Email Alerts"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/alert-channels/discord","title":"Discord Alerts"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/alert-channels/microsoft-teams","title":"Microsoft Teams Alerts"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/alert-channels/pagerduty","title":"PagerDuty Alerts"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/alert-channels/opsgenie","title":"Opsgenie Alerts"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/alert-channels/slack","title":"Slack Alerts"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/alert-channels/webhook","title":"Webhook Alerts"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/jmeter-integration-ci-cd/azure-devops","title":"Azure DevOps"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/jmeter-integration-ci-cd/circleci","title":"CircleCI"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/jmeter-integration-ci-cd/gitlab-ci-cd","title":"GitLab CI/CD"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/jmeter-integration-ci-cd/jenkins","title":"Jenkins"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/frequency","title":"Frequency"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/jmeter-integration-ci-cd/overview","title":"Integrating JMeter API Client with CI/CD Pipelines"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/activate-deactivate","title":"Activate/Deactivate"}}},{"node":{"fields":{"slug":"/guides/jmeter-load-testing/jmeter-integration-ci-cd/github-actions","title":"GitHub Actions"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/locations","title":"Locations"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/friendly-check-name","title":"Friendly Check Name"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/assertions","title":"Assertions"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/request-configuration","title":"Request Configuration"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/alert-channels","title":"Alert Channels"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/mute-unmute","title":"Mute/Unmute"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/request-preview","title":"Request Preview"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/retries","title":"Retries Before Alerting"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/response-time-limits","title":"Response Time Limits"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/webhook-channels","title":"Webhook Channel"}}},{"node":{"fields":{"slug":"/guides/api-monitoring/new-api-check/save-run","title":"Save and Run"}}}]}},"pageContext":{"id":"80bca631-e450-5095-8561-0b6fbfa23dae","locale":"en-GB"}},"staticQueryHashes":["361965504","361965504","417421954","417421954","445494767","445494767"]}