{"id":80394,"date":"2026-07-02T18:56:23","date_gmt":"2026-07-02T13:26:23","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=80394"},"modified":"2026-08-21T14:43:00","modified_gmt":"2026-08-21T09:13:00","slug":"the-performance-imperative-why-load-testing-is-non-negotiable","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/the-performance-imperative-why-load-testing-is-non-negotiable\/","title":{"rendered":"The Performance Imperative: Why Load Testing Is Non-Negotiable"},"content":{"rendered":"<p>We&#8217;ve all been there. You spend weeks building a feature, everything looks polished in staging, and then launch day arrives\u2014and the app buckles under real traffic. Suddenly, that slick UI doesn&#8217;t matter. Nothing matters when the page won&#8217;t load.<\/p>\n<p><strong>Load testing is how you find out your system is about to break before your users find out for you.<\/strong><\/p>\n<hr \/>\n<h2 id=\"why-load-testing-is-critical\">Why Load Testing Actually Matters<\/h2>\n<p>Load testing often gets pushed to the bottom of the backlog\u2014there&#8217;s always a feature to ship or a bug to squash. But skipping it is a shortcut that bites back hard when you least expect it.<\/p>\n<p>Here&#8217;s why it deserves a permanent spot in your workflow:<\/p>\n<ol>\n<li><strong>Slow apps lose users fast<\/strong> \u2014 Amazon found that every 100ms of extra latency cost them 1% in sales. Performance isn&#8217;t a nice-to-have; it&#8217;s a feature your users silently demand.<\/li>\n<li><strong>Downtime is brutally expensive<\/strong> \u2014 An e-commerce store going dark on Black Friday or a banking app glitching on payroll day costs real money and trust that&#8217;s hard to earn back.<\/li>\n<li><strong>The worst bugs only show up under pressure<\/strong> \u2014 Memory leaks, N+1 queries, connection pool exhaustion\u2014these don&#8217;t appear in unit or integration tests. They crawl out when your system is genuinely stressed.<\/li>\n<li><strong>Your infrastructure assumptions might be wrong<\/strong> \u2014 Auto-scaling, load balancers, CDN caching\u2014they look great on paper. Load testing shows if they hold up before real traffic exposes the gaps.<\/li>\n<\/ol>\n<h3 id=\"a-real-world-scenario\">Picture This<\/h3>\n<p>Say you&#8217;re running a flight search API. In staging, it handles 50 requests per second. A viral marketing campaign pushes you to 800 RPS. Without load testing, you&#8217;d discover\u2014live, with users watching\u2014that your connection pool maxes out at 100, a synchronous third-party API adds 2 seconds per request under concurrency, and Kubernetes HPA scales too slowly because the CPU threshold was set too high.<\/p>\n<p>Load testing catches these things in a safe environment\u2014not at 2 AM during a production incident.<\/p>\n<hr \/>\n<h2 id=\"comparing-the-tools-k6-vs-apache-jmeter\">k6 vs. Apache JMeter: Which One Is Right for You?<\/h2>\n<p>Once you&#8217;re sold on load testing, the next question is: what tool do you use? The two names you&#8217;ll hear most are <strong>Apache JMeter<\/strong>\u2014the old reliable\u2014and <strong>k6<\/strong> from Grafana Labs, the go-to for developer-led teams.<\/p>\n<p>Here&#8217;s a quick side-by-side:<\/p>\n<table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>k6 (Grafana)<\/th>\n<th>Apache JMeter<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Philosophy<\/strong><\/td>\n<td>Performance as Code<\/td>\n<td>UI-driven \/ traditional<\/td>\n<\/tr>\n<tr>\n<td><strong>Language<\/strong><\/td>\n<td>JavaScript \/ TypeScript<\/td>\n<td>Java (Groovy \/ BeanShell)<\/td>\n<\/tr>\n<tr>\n<td><strong>Resource usage<\/strong><\/td>\n<td>Lightweight, low memory footprint<\/td>\n<td>Can get resource-heavy at scale<\/td>\n<\/tr>\n<tr>\n<td><strong>CI\/CD fit<\/strong><\/td>\n<td>Excellent \u2014 native CLI, thresholds, exit codes<\/td>\n<td>Good \u2014 CLI works, but GUI isn&#8217;t pipeline-friendly<\/td>\n<\/tr>\n<tr>\n<td><strong>Protocols<\/strong><\/td>\n<td>HTTP\/1.1, HTTP\/2, WebSockets, gRPC<\/td>\n<td>HTTP, JDBC, FTP, LDAP, JMS, and many more<\/td>\n<\/tr>\n<tr>\n<td><strong>Best for<\/strong><\/td>\n<td>APIs, microservices, developer-led teams<\/td>\n<td>Legacy systems, complex multi-protocol scenarios<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>k6<\/strong> feels like writing application code\u2014tests live in Git, teammates review them in PRs, and you get clear pass\/fail results. If your team already lives in JavaScript, the learning curve is almost zero.<br \/>\n<strong>JMeter<\/strong> is the veteran (since 2003) with an enormous plugin ecosystem and protocols k6 doesn&#8217;t touch. Dedicated QA engineers who prefer a GUI often feel right at home here.<\/p>\n<h3 id=\"when-to-choose-which\">So, Which Should You Pick?<\/h3>\n<table>\n<thead>\n<tr>\n<th>Go with <strong>k6<\/strong> if\u2026<\/th>\n<th>Go with <strong>JMeter<\/strong> if\u2026<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Your team already writes JavaScript\/TypeScript<\/td>\n<td>You need JDBC, JMS, or other non-HTTP protocols<\/td>\n<\/tr>\n<tr>\n<td>You want tests in Git alongside your application code<\/td>\n<td>Your QA team prefers designing tests in a GUI<\/td>\n<\/tr>\n<tr>\n<td>You want tight CI\/CD integration with threshold-based gates<\/td>\n<td>You&#8217;re building on top of an existing JMeter test suite<\/td>\n<\/tr>\n<tr>\n<td>You&#8217;re load-testing REST or gRPC APIs at scale<\/td>\n<td>You need complex record-and-playback HTTP workflows<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"example-a-k6-load-test\">Let&#8217;s Write a k6 Load Test<\/h2>\n<p>Here&#8217;s a real k6 script that simulates users hitting a flight search API, checks for sane responses, and fails your build if latency gets out of hand.<\/p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-comment\">\/\/ tests\/load-test.js<\/span>\r\n<span class=\"hljs-keyword\">import<\/span> http <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'k6\/http'<\/span>;\r\n<span class=\"hljs-keyword\">import<\/span> { check, sleep } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'k6'<\/span>;\r\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">const<\/span> options = {\r\n  <span class=\"hljs-attr\">stages<\/span>: [\r\n    { <span class=\"hljs-attr\">duration<\/span>: <span class=\"hljs-string\">'30s'<\/span>, <span class=\"hljs-attr\">target<\/span>: <span class=\"hljs-number\">50<\/span> },   <span class=\"hljs-comment\">\/\/ ramp up to 50 virtual users<\/span>\r\n    { <span class=\"hljs-attr\">duration<\/span>: <span class=\"hljs-string\">'1m'<\/span>, <span class=\"hljs-attr\">target<\/span>: <span class=\"hljs-number\">50<\/span> },    <span class=\"hljs-comment\">\/\/ hold at 50 VUs<\/span>\r\n    { <span class=\"hljs-attr\">duration<\/span>: <span class=\"hljs-string\">'30s'<\/span>, <span class=\"hljs-attr\">target<\/span>: <span class=\"hljs-number\">100<\/span> },  <span class=\"hljs-comment\">\/\/ spike to 100 VUs<\/span>\r\n    { <span class=\"hljs-attr\">duration<\/span>: <span class=\"hljs-string\">'30s'<\/span>, <span class=\"hljs-attr\">target<\/span>: <span class=\"hljs-number\">0<\/span> },    <span class=\"hljs-comment\">\/\/ ramp down<\/span>\r\n  ],\r\n  <span class=\"hljs-attr\">thresholds<\/span>: {\r\n    <span class=\"hljs-attr\">http_req_duration<\/span>: [<span class=\"hljs-string\">'p(95)&lt;300'<\/span>],  <span class=\"hljs-comment\">\/\/ 95th percentile under 300ms<\/span>\r\n    http_req_failed: [<span class=\"hljs-string\">'rate&lt;0.01'<\/span>],    <span class=\"hljs-comment\">\/\/ fewer than 1% errors<\/span>\r\n  },\r\n};\r\n\r\n<span class=\"hljs-keyword\">const<\/span> BASE_URL = __ENV.BASE_URL || <span class=\"hljs-string\">'https:\/\/api.example.com'<\/span>;\r\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> () <\/span>{\r\n  <span class=\"hljs-keyword\">const<\/span> res = http.get(<span class=\"hljs-string\">`<span class=\"hljs-subst\">${BASE_URL}<\/span>\/v1\/flights\/search?origin=LHR&amp;destination=JFK&amp;date=2026-08-01`<\/span>);\r\n  check(res, {\r\n    <span class=\"hljs-string\">'status is 200'<\/span>: <span class=\"hljs-function\">(<span class=\"hljs-params\">r<\/span>) =&gt;<\/span> r.status === <span class=\"hljs-number\">200<\/span>,\r\n    <span class=\"hljs-string\">'response has results'<\/span>: <span class=\"hljs-function\">(<span class=\"hljs-params\">r<\/span>) =&gt;<\/span> r.json(<span class=\"hljs-string\">'results'<\/span>) !== <span class=\"hljs-literal\">undefined<\/span>,\r\n  });\r\n  sleep(<span class=\"hljs-number\">1<\/span>); <span class=\"hljs-comment\">\/\/ think time between requests<\/span>\r\n}\r\n<\/code><\/pre>\n<p>Run it locally or point it at staging:<\/p>\n<pre><code class=\"lang-bash\">k6 <span class=\"hljs-keyword\">run<\/span><span class=\"bash\"> tests\/load-test.js<\/span>\r\nk6 <span class=\"hljs-built_in\">run<\/span> <span class=\"hljs-comment\">--env BASE_URL=https:\/\/staging.api.example.com tests\/load-test.js<\/span>\r\n<\/code><\/pre>\n<p>The <code>thresholds<\/code> block is where the magic happens. If <code>p(95)<\/code> climbs above 300ms or errors creep past 1%, k6 exits with a non-zero code\u2014your pipeline fails and the regression never ships.<\/p>\n<hr \/>\n<h2 id=\"example-a-jmeter-load-test\">Running a JMeter Load Test<\/h2>\n<p>JMeter stores tests in <code>.jmx<\/code> files built through the GUI or generated programmatically. A basic flight search Thread Group might look like this:<\/p>\n<table>\n<thead>\n<tr>\n<th>Setting<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Number of Threads (users)<\/td>\n<td>100<\/td>\n<\/tr>\n<tr>\n<td>Ramp-Up Period (seconds)<\/td>\n<td>60<\/td>\n<\/tr>\n<tr>\n<td>Loop Count<\/td>\n<td>10<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Wire up an <strong>HTTP Request Sampler<\/strong>, a <strong>Response Assertion<\/strong> for HTTP 200, and a <strong>Duration Assertion<\/strong> flagging anything over 500ms.<\/p>\n<p>Run headlessly in CI with:<\/p>\n<pre><code class=\"lang-bash\">jmeter -n -t tests\/flight-search.jmx \\\r\n  -<span class=\"ruby\">l results.jtl \\\r\n<\/span>  -<span class=\"ruby\">e -o reports\/ \\\r\n<\/span>  -<span class=\"ruby\">Jthreads=<span class=\"hljs-number\">100<\/span> \\\r\n<\/span>  -<span class=\"ruby\">Jrampup=<span class=\"hljs-number\">60<\/span> \\\r\n<\/span>  -<span class=\"ruby\">JbaseUrl=<span class=\"hljs-symbol\">https:<\/span>\/<span class=\"hljs-regexp\">\/staging.api.example.com<\/span><\/span>\r\n<\/code><\/pre>\n<p>Key flags: <code>-n<\/code> (non-GUI), <code>-t<\/code> (test plan), <code>-l<\/code> (results log), <code>-e -o<\/code> (HTML report), <code>-J<\/code> (runtime config). For pass\/fail gates, parse the JTL output or use <strong>AutoStop<\/strong> to kill the test when error rates spike.<\/p>\n<hr \/>\n<h2 id=\"performance-as-an-nfr-non-functional-requirement-\">Stop Treating Performance as an Afterthought<\/h2>\n<p>Treat performance like any other product requirement\u2014a Non-Functional Requirement (NFR) with actual numbers. Vague goals like &#8220;the app should be fast&#8221; are useless. Specific ones are not:<\/p>\n<table>\n<thead>\n<tr>\n<th>NFR Category<\/th>\n<th>Example Requirement<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Response time<\/strong><\/td>\n<td>The search API must respond within 200ms at p95 under 500 RPS<\/td>\n<\/tr>\n<tr>\n<td><strong>Throughput<\/strong><\/td>\n<td>The system must handle 1,000 transactions per minute with zero errors<\/td>\n<\/tr>\n<tr>\n<td><strong>Concurrency<\/strong><\/td>\n<td>The app must support 5,000 simultaneous active sessions<\/td>\n<\/tr>\n<tr>\n<td><strong>Stability<\/strong><\/td>\n<td>Performance must not degrade more than 5% over a 24-hour soak test<\/td>\n<\/tr>\n<tr>\n<td><strong>Recovery<\/strong><\/td>\n<td>After a traffic spike, the system must return to baseline within 2 minutes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"translating-nfrs-into-test-thresholds\">Turning NFRs into k6 Thresholds<\/h3>\n<p>NFRs translate almost directly into k6 code:<\/p>\n<pre><code class=\"lang-javascript\"><span class=\"hljs-attribute\">thresholds<\/span>: {\r\n  <span class=\"hljs-attribute\">http_req_duration<\/span>: [<span class=\"hljs-string\">'p(95)&lt;200'<\/span>, <span class=\"hljs-string\">'p(99)&lt;500'<\/span>],\r\n  <span class=\"hljs-attribute\">http_req_failed<\/span>: [<span class=\"hljs-string\">'rate&lt;0.001'<\/span>],\r\n  <span class=\"hljs-attribute\">http_reqs<\/span>: [<span class=\"hljs-string\">'rate&gt;500'<\/span>],  <span class=\"hljs-comment\">\/\/ minimum 500 requests\/sec<\/span>\r\n}\r\n<\/code><\/pre>\n<p>In JMeter, use <strong>Duration Assertions<\/strong>, <strong>Size Assertions<\/strong>, and post-run analysis of the HTML dashboard. Write requirements that are <strong>measurable, tied to realistic load profiles, and agreed on by the team<\/strong>.<\/p>\n<hr \/>\n<h2 id=\"automating-success-ci-cd-integration\">Making Load Testing Part of Your Normal Routine<\/h2>\n<p>The teams that catch performance regressions early have made load testing automatic. Plug it into your <strong>CI\/CD pipeline<\/strong> and catch slowdowns the moment they&#8217;re introduced.<\/p>\n<h3 id=\"github-actions-with-k6\">GitHub Actions + k6<\/h3>\n<pre><code class=\"lang-yaml\"><span class=\"hljs-attribute\">name<\/span>: Performance Regression Test\r\n<span class=\"yaml\"><span class=\"hljs-attr\">on:<\/span>\r\n<span class=\"hljs-attr\">  push:<\/span>\r\n<span class=\"hljs-attr\">    branches:<\/span> [main]\r\n<span class=\"hljs-attr\">  pull_request:<\/span>\r\n<span class=\"hljs-attr\">    branches:<\/span> [main]\r\n<span class=\"hljs-attr\">jobs:<\/span>\r\n<span class=\"hljs-attr\">  load-test:<\/span>\r\n<span class=\"hljs-attr\">    runs-on:<\/span> ubuntu-latest\r\n<span class=\"hljs-attr\">    steps:<\/span>\r\n<span class=\"hljs-attr\">      - name:<\/span> Checkout code\r\n<span class=\"hljs-attr\">        uses:<\/span> actions\/checkout@v4\r\n<span class=\"hljs-attr\">      - name:<\/span> Run k6 load test\r\n<span class=\"hljs-attr\">        uses:<\/span> grafana\/k6-action@v0<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.2<\/span>\r\n<span class=\"hljs-attr\">        with:<\/span>\r\n<span class=\"hljs-attr\">          filename:<\/span> tests\/load-test.js\r\n<span class=\"hljs-attr\">          flags:<\/span> --env BASE_URL=https:\/\/staging.api.example.com\r\n<span class=\"hljs-attr\">      - name:<\/span> Upload results\r\n<span class=\"hljs-attr\">        if:<\/span> always()\r\n<span class=\"hljs-attr\">        uses:<\/span> actions\/upload-artifact@v4\r\n<span class=\"hljs-attr\">        with:<\/span>\r\n<span class=\"hljs-attr\">          name:<\/span> k6-results\r\n<span class=\"hljs-attr\">          path:<\/span> result.json<\/span>\r\n<\/code><\/pre>\n<p>Every PR that breaches your thresholds fails the pipeline automatically\u2014no manual inspection required.<\/p>\n<h3 id=\"github-actions-with-jmeter\">GitHub Actions + JMeter<\/h3>\n<pre><code class=\"lang-yaml\"><span class=\"hljs-attribute\">name<\/span>: JMeter Load Test\r\n<span class=\"yaml\"><span class=\"hljs-attr\">on:<\/span>\r\n<span class=\"hljs-attr\">  schedule:<\/span>\r\n<span class=\"hljs-attr\">    - cron:<\/span> <span class=\"hljs-string\">'0 2 * * 1'<\/span>  <span class=\"hljs-comment\"># weekly, Monday 2 AM<\/span>\r\n<span class=\"hljs-attr\">  workflow_dispatch:<\/span>\r\n<span class=\"hljs-attr\">jobs:<\/span>\r\n<span class=\"hljs-attr\">  jmeter:<\/span>\r\n<span class=\"hljs-attr\">    runs-on:<\/span> ubuntu-latest\r\n<span class=\"hljs-attr\">    steps:<\/span>\r\n<span class=\"hljs-attr\">      - uses:<\/span> actions\/checkout@v4\r\n<span class=\"hljs-attr\">      - name:<\/span> Run JMeter\r\n<span class=\"hljs-attr\">        uses:<\/span> jmeter-actions\/jmeter-action@v0<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.0<\/span>\r\n<span class=\"hljs-attr\">        with:<\/span>\r\n<span class=\"hljs-attr\">          jmeterPath:<\/span> tests\/flight-search.jmx\r\n<span class=\"hljs-attr\">          jmeterArgs:<\/span> &gt;-\r\n<span class=\"hljs-bullet\">            -<\/span>Jthreads=<span class=\"hljs-number\">50<\/span>\r\n<span class=\"hljs-bullet\">            -<\/span>Jrampup=<span class=\"hljs-number\">30<\/span>\r\n<span class=\"hljs-bullet\">            -<\/span>JbaseUrl=https:\/\/staging.api.example.com\r\n<span class=\"hljs-attr\">      - name:<\/span> Publish HTML report\r\n<span class=\"hljs-attr\">        if:<\/span> always()\r\n<span class=\"hljs-attr\">        uses:<\/span> actions\/upload-artifact@v4\r\n<span class=\"hljs-attr\">        with:<\/span>\r\n<span class=\"hljs-attr\">          name:<\/span> jmeter-report\r\n<span class=\"hljs-attr\">          path:<\/span> reports\/<\/span>\r\n<\/code><\/pre>\n<h3 id=\"tips-for-ci-friendly-load-testing\">A Few Things Worth Getting Right from the Start<\/h3>\n<ol>\n<li><strong>Never test against production from CI<\/strong> \u2014 Use staging. Load testing production without safeguards is a recipe for a very bad day.<\/li>\n<li><strong>Start small, scale gradually<\/strong> \u2014 Smoke-level tests on every PR; full-scale runs nightly or pre-release.<\/li>\n<li><strong>Track results over time<\/strong> \u2014 A single run tells you where you are; a history tells you where you&#8217;re heading. Grafana Cloud k6 or InfluxDB make trending easy.<\/li>\n<li><strong>Define clear pass\/fail criteria<\/strong> \u2014 If someone has to manually read results, it&#8217;s not a real gate. Use thresholds and let the exit code decide.<\/li>\n<\/ol>\n<hr \/>\n<h2 id=\"resources-for-further-learning\">Want to Go Deeper?<\/h2>\n<ul>\n<li><a href=\"https:\/\/k6.io\/docs\/testing-guides\/running-k6-in-ci\/\">k6 Documentation: Running k6 in CI<\/a><\/li>\n<li><a href=\"https:\/\/k6.io\/docs\/using-k6\/thresholds\/\">k6 Thresholds Guide<\/a><\/li>\n<li><a href=\"https:\/\/k6.io\/docs\/test-types\/introduction\/\">k6 Test Types (smoke, load, stress, soak)<\/a><\/li>\n<li><a href=\"https:\/\/jmeter.apache.org\/usermanual\/get-started.html\">Apache JMeter Getting Started<\/a><\/li>\n<li><a href=\"https:\/\/grafana.com\/products\/cloud\/k6\/\">Grafana k6 Cloud (hosted results and dashboards)<\/a><\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"conclusion-the-goal-is-consistency\">The Bottom Line<\/h2>\n<p>Whether you choose JMeter&#8217;s breadth or k6&#8217;s developer experience, the tool matters less than the habit. Run load tests regularly, write down your NFRs, automate the gates, and treat performance as a first-class concern\u2014not a last-minute scramble before launch.<br \/>\nUsers won&#8217;t praise your architecture, but they&#8217;ll quietly close the tab if things are slow. The ones who stick around are using apps that hold up when it counts.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We&#8217;ve all been there. You spend weeks building a feature, everything looks polished in staging, and then launch day arrives\u2014and the app buckles under real traffic. Suddenly, that slick UI doesn&#8217;t matter. Nothing matters when the page won&#8217;t load. Load testing is how you find out your system is about to break before your users [&hellip;]<\/p>\n","protected":false},"author":2005,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":2},"categories":[5867],"tags":[4252,696,1308,8686,1767],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/80394"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/2005"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=80394"}],"version-history":[{"count":2,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/80394\/revisions"}],"predecessor-version":[{"id":80536,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/80394\/revisions\/80536"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=80394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=80394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=80394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}