{"id":3881,"date":"2026-06-26T08:59:22","date_gmt":"2026-06-26T07:59:22","guid":{"rendered":"https:\/\/www.gironi.it\/blog\/?p=3881"},"modified":"2026-07-13T08:05:17","modified_gmt":"2026-07-13T07:05:17","slug":"bayesian-ab-testing","status":"publish","type":"post","link":"https:\/\/www.gironi.it\/blog\/en\/bayesian-ab-testing\/","title":{"rendered":"Bayesian A\/B Testing: not just &#8220;whether&#8221; B beats A, but &#8220;by how much&#8221;"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In the article on <a href=\"https:\/\/www.gironi.it\/blog\/en\/ab-testing-statistically-valid-experiments\/\">classic A\/B testing<\/a> we saw how to compare two variants with the two-proportion test: we compute a statistic, get a p-value, and decide whether to reject the null hypothesis. It works, and it is the daily bread of anyone running online experiments. But there is a subtle gap between what the p-value tells us and what we actually want to know.<br> The p-value answers a convoluted question: &#8220;if A and B were identical, how unlikely would it be to observe a difference as large as this one?&#8221;. The question we care about in practice is a different, far more direct one: <strong>what is the probability that B is better than A?<\/strong> And, right after: by how much, and how much can we trust that &#8220;how much&#8221;?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/www.gironi.it\/blog\/en\/bayesian-statistics-how-to-learn-from-data-one-step-at-a-time\/\">Bayesian<\/a> approach answers both questions natively. In this article we apply it to the comparison of two variants, picking up the thread we left hanging when we estimated <a href=\"https:\/\/www.gironi.it\/blog\/en\/bayesian-conversion-rate-estimation\/\">the conversion rate of a single variant<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is the question behind every conversion test with an SEO angle: two versions of the same landing page competing for the same organic traffic, or two title-and-meta wordings judged by their <a href=\"https:\/\/www.gironi.it\/blog\/en\/expected-vs-actual-ctr\/\">actual versus expected CTR<\/a> in the SERP. Wherever there are <em>successes over trials<\/em> \u2014 clicks over impressions, sign-ups over visits, conversions over sessions \u2014 the reasoning that follows is the same.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What we will cover<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"#two-posteriors\">Two posteriors instead of one: a distribution per variant<\/a><\/li><li><a href=\"#probability-b-wins\">What is the probability that B really wins<\/a><\/li><li><a href=\"#distribution-of-difference\">By how much it is better: the distribution of the difference<\/a><\/li><li><a href=\"#when-to-stop\">When to stop: expected loss and the peeking problem<\/a><\/li><li><a href=\"#try-it-yourself\">Try it yourself<\/a><\/li><li><a href=\"#further-reading\">Further reading<\/a><\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"two-posteriors\">Two posteriors instead of one<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When we estimated the conversion rate of a single variant, we saw that \u2014 starting from a <a href=\"https:\/\/www.gironi.it\/blog\/en\/the-beta-distribution-explained-simply\/\">Beta<\/a> prior and observing binomial data \u2014 the posterior is again a Beta distribution. The updating rule was simple arithmetic: if the prior is Beta(\u03b1, \u03b2) and we observe \\( k \\) conversions out of \\( n \\) sessions, the posterior is:<\/p>\n\n\n\n\\( Beta(\\alpha + k,\\ \\beta + (n &#8211; k)) \\\\ \\)\n\n\n\n<p class=\"wp-block-paragraph\">Put in words: we add the observed conversions to the first parameter and the non-conversions to the second, nothing more.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In an A\/B test we do not have a single proportion, we have two: one for the control (A) and one for the treatment (B). The mechanism, however, is identical: we build <strong>one posterior per variant<\/strong>, independently, applying the same rule twice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a quick example. We tested two versions of a landing page that receives organic traffic, assigning visitors at random:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Variant A<\/strong> (control): 90 conversions out of 1000 sessions \u2192 raw rate 9.0%<\/li><li><strong>Variant B<\/strong> (treatment): 120 conversions out of 1000 sessions \u2192 raw rate 12.0%<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">We start from a non-informative Beta(1, 1) prior for both \u2014 &#8220;we know nothing, before the data every rate is equally plausible&#8221;. Applying the rule, the posterior of A is Beta(91, 911) and that of B is Beta(121, 881).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I build the two posteriors in R, sampling them by simulation:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set.seed(42)\n# Variant A: 90 conv \/ 1000 ; Variant B: 120 conv \/ 1000\ncA &lt;- 90; nA &lt;- 1000; cB &lt;- 120; nB &lt;- 1000\n\n# Posteriors with uniform Beta(1,1) prior\npostA &lt;- rbeta(1e5, 1 + cA, 1 + nA - cA)   # Beta(91, 911)\npostB &lt;- rbeta(1e5, 1 + cB, 1 + nB - cB)   # Beta(121, 881)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now we hold two distributions, not two numbers. And this is precisely the point: instead of comparing 9.0% against 12.0% as if they were fixed values, we compare the whole uncertainty surrounding them. The operational questions become operations on these distributions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It helps to keep the picture in mind: two ridges of probability side by side along the conversion-rate axis. The further B&#8217;s ridge sits to the right of A&#8217;s, and the less the two overlap, the more likely it becomes that B is genuinely the better variant.<\/p>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f5f7f9;margin-top:2.5rem;margin-bottom:2.5rem;padding-top:1.5rem;padding-right:1.5rem;padding-bottom:1rem;padding-left:1.5rem\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-eed7543b wp-block-group-is-layout-constrained\">\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1050\" height=\"630\" src=\"https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-due-posterior-en-1.png\" alt=\"The two Beta posteriors side by side: not two numbers (9% and 12%) but two distributions, still overlapping a little \u2014 and it is in that overlap that the residual doubt lives.\" class=\"wp-image-4217\" srcset=\"https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-due-posterior-en-1.png 1050w, https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-due-posterior-en-1-300x180.png 300w, https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-due-posterior-en-1-1024x614.png 1024w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">The two Beta posteriors side by side: not two numbers (9% and 12%) but two distributions, still overlapping a little \u2014 and it is in that overlap that the residual doubt lives.<\/figcaption><\/figure>\n\n<\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"probability-b-wins\">What is the probability that B wins?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The first question \u2014 the one the p-value never answers directly \u2014 is the probability that B is genuinely better than A.<br> With the posteriors in hand, the calculation is almost trivial: we compare B&#8217;s samples with A&#8217;s, pair by pair, and count in what fraction of cases B exceeds A. That fraction <em>is<\/em> the probability we are after.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I compute in R the probability that B beats A:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat(\"P(B&gt;A) =\", round(mean(postB &gt; postA), 3), \"\\n\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output: P(B&gt;A) = 0.985.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>There is a 98.5% probability that variant B converts better than variant A.<\/strong><br> Notice the change of register compared to the frequentist version. We are not saying &#8220;the observed difference is unlikely under the null hypothesis&#8221;: we are saying, directly, that given the evidence collected it is almost certain that B is the better variant. This is exactly the statement we would want to base a decision on \u2014 and the Bayesian approach hands it over without circumlocutions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"distribution-of-difference\">By how much it is better: the distribution of the difference<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Knowing that B wins with 98.5% probability is not enough to decide. There is almost surely an improvement, but if it were two tenths of a percentage point, perhaps it would not be worth shipping the new page. The next question is therefore: <em>by how much<\/em> is it better?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So far we have kept A and B separate, one posterior each. But the object we actually care about is neither of them on its own: it is the distance between them. The answer therefore lives in the <strong>distribution of the difference<\/strong> between the two posteriors. We subtract, sample by sample, A&#8217;s rate from B&#8217;s: we obtain a new distribution, that of the uplift. From it we read both the typical value (the mean) and a credible interval that quantifies its uncertainty.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I compute in R the difference and its 95% interval:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>diff &lt;- postB - postA\ncat(\"mean uplift (pct points) =\", round(mean(diff)*100, 2), \"\\n\")\ncat(\"95% CI of difference =\", round(quantile(diff, c(.025,.975))*100, 2), \"\\n\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output: mean uplift = 3.00 pct points, 95% CI = [0.31, 5.68].<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The expected gain is about 3 percentage points of conversion, with a 95% credible interval running from 0.31 to 5.68 points.<\/strong><br> Here too the meaning is direct, not an abstract property of the procedure: there is a 95% probability that the true improvement of B over A lies between 0.3 and 5.7 percentage points. The interval does not touch zero, which confirms \u2014 consistently with the earlier 98.5% \u2014 that B is almost certainly superior. But the valuable figure is the width: the improvement could be modest (half a point) or robust (over five points), and this spread is information the operational decision must keep in mind.<\/p>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f5f7f9;margin-top:2.5rem;margin-bottom:2.5rem;padding-top:1.5rem;padding-right:1.5rem;padding-bottom:1rem;padding-left:1.5rem\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-eed7543b wp-block-group-is-layout-constrained\">\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1080\" height=\"645\" src=\"https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-differenza-en-1.png\" alt=\"The distribution of the B \u2212 A uplift in percentage points: the area to the right of zero is the probability that B wins (98.5%), the blue bar the 95% credible interval, from 0.31 to 5.68 points. A single chart answers both questions \u2014 \u201cwhether\u201d and \u201cby how much\u201d.\" class=\"wp-image-4218\" srcset=\"https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-differenza-en-1.png 1080w, https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-differenza-en-1-300x179.png 300w, https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-differenza-en-1-1024x612.png 1024w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">The distribution of the B \u2212 A uplift in percentage points: the area to the right of zero is the probability that B wins (98.5%), the blue bar the 95% credible interval, from 0.31 to 5.68 points. A single chart answers both questions \u2014 \u201cwhether\u201d and \u201cby how much\u201d.<\/figcaption><\/figure>\n\n<\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"when-to-stop\">When to stop: expected loss and the peeking problem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the article on classic A\/B testing we devoted space to one of the most insidious errors: <a href=\"https:\/\/www.gironi.it\/blog\/en\/peeking-problem-ab-testing\/\">peeking<\/a>, that is, glancing at the interim data and stopping as soon as the difference looks significant. In the frequentist framework this inflates the false-positive rate, because each glance is effectively a new test on the same null hypothesis, and repeated tests multiply the chances of being wrong.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Bayesian approach changes the nature of the problem. Here we are not repeating a test on a null hypothesis: we are updating a belief. Today&#8217;s posterior becomes tomorrow&#8217;s prior, and looking at the data as it arrives does not &#8220;consume&#8221; an error budget in the same way. This does not mean we can stop on a whim: we still need a <strong>stopping rule<\/strong> declared in advance. And the natural Bayesian rule is not &#8220;stop when P(B&gt;A) is high&#8221;, but is based on <strong>expected loss<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The idea is this: if we choose B but A were in fact the better variant, we are wrong, and the size of the error is how much A beats B in those cases. The expected loss of choosing B is the average of this &#8220;regret&#8221; over all the residual uncertainty. In plain words: by how much, on average, we would regret having chosen B if we were wrong.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I compute in R the expected loss of choosing B:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Expected loss of choosing B: average loss if A were actually better\nloss_B &lt;- mean(pmax(postA - postB, 0))\ncat(\"expected loss choosing B =\", round(loss_B*100, 3), \"pct points\\n\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output: expected loss choosing B = 0.007 pct points.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The expected loss of choosing B is a mere 0.007 percentage points: negligible. In plainer terms, even in the unlucky scenario where we were wrong, the average damage would be tiny. We then set a tolerance threshold <em>before<\/em> starting \u2014 for example &#8220;I stop when the expected loss drops below 0.01 points&#8221; \u2014 and let the test run until we reach it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And here is where we see why the expected loss, and not &#8220;P(B&gt;A) is high&#8221;, is the right criterion. If we recompute at every step of the test, as traffic comes in, the two quantities do not trip at the same moment: the probability that B wins crosses 95% well before the expected loss becomes truly negligible.<\/p>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f5f7f9;margin-top:2.5rem;margin-bottom:2.5rem;padding-top:1.5rem;padding-right:1.5rem;padding-bottom:1rem;padding-left:1.5rem\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-eed7543b wp-block-group-is-layout-constrained\">\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1140\" height=\"600\" src=\"https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-expected-loss-en-1.png\" alt=\"As data accumulate, P(B&gt;A) crosses 95% already around 570 visitors per variant, but the expected loss drops below the 0.01-point threshold only near 855: stopping as soon as the probability \u201clooks high\u201d is precisely the peeking trap.\" class=\"wp-image-4219\" srcset=\"https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-expected-loss-en-1.png 1140w, https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-expected-loss-en-1-300x158.png 300w, https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/07\/ab-test-expected-loss-en-1-1024x539.png 1024w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">As data accumulate, P(B&gt;A) crosses 95% already around 570 visitors per variant, but the expected loss drops below the 0.01-point threshold only near 855: stopping as soon as the probability \u201clooks high\u201d is precisely the peeking trap.<\/figcaption><\/figure>\n\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f5f7f9;margin-top:2.5rem;margin-bottom:2.5rem;padding-top:1.5rem;padding-right:1.5rem;padding-bottom:1.5rem;padding-left:1.5rem\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>A note of caution: the freedom to look at the data as it comes in is not a licence to stop whenever the result pleases us. The stopping rule \u2014 the expected-loss threshold, or a minimum level of P(B&gt;A) \u2014 must be fixed before collecting the data, exactly as in the frequentist setting we fix the sample size. Rigour does not lie in the method we use, but in deciding the criterion before seeing the numbers.<\/p>\n<\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"try-it-yourself\">Try it yourself<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A lead generation website tests two variants of its contact form. On variant A we observe 45 conversions out of 600 sessions; on B, 52 conversions out of 600 sessions.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Build the two posteriors with a non-informative Beta(1, 1) prior: <code>postA &lt;- rbeta(1e5, 1 + 45, 1 + 555)<\/code> and the analogue for B.<\/li><li>Compute <strong>P(B&gt;A)<\/strong>: is B better with a probability high enough to convince you?<\/li><li>Compute the <strong>mean uplift and 95% interval<\/strong> of the difference: does the interval touch zero?<\/li><li>Compute the <strong>expected loss<\/strong> of choosing B. With these numbers (closer to each other than in the case above), how does it change compared to the article&#8217;s example?<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Hint: the structure of the code is identical to the one we used. Only the starting counts change \u2014 and the result, far less clear-cut, is precisely why the interval and the expected loss matter more than a plain &#8220;B won&#8221;.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">So far we have compared two variants at a fixed sample size: we collect the data, compute, decide. And yet we have just watched that probability recompute itself at every step, as traffic comes in \u2014 and if one variant is turning out clearly better, why keep sending half the visitors to the worse one? We can do better: use that real-time probability to allocate traffic adaptively, shifting it toward the winning variant while the test is still running. It is the leap from the test to the <em>bandit<\/em>, the subject of the next article.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"further-reading\">Further reading<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to explore Bayesian A\/B testing with a practical, code-oriented angle, <a href=\"https:\/\/www.amazon.it\/dp\/0133902838?tag=consulenzeinf-21\" rel=\"nofollow sponsored noopener\" target=\"_blank\"><em>Bayesian Methods for Hackers<\/em><\/a> by Cameron Davidson-Pilon is the book I recommend. It tackles Bayesian reasoning starting from programming rather than formal mathematics, and devotes an explicit chapter to the Bayesian comparison of variants \u2014 probability that B wins, distribution of the difference, expected loss. It is written for those who learn better by reading code than proofs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This article is part of the <a href=\"https:\/\/www.gironi.it\/blog\/en\/bayesian-approach\/\">&#8220;The Bayesian Approach&#8221;<\/a> path, a guided route through the articles on Bayesian statistics and inference for SEO.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the article on classic A\/B testing we saw how to compare two variants with the two-proportion test: we compute a statistic, get a p-value, and decide whether to reject the null hypothesis. It works, and it is the daily bread of anyone running online experiments. But there is a subtle gap between what the &hellip; <a href=\"https:\/\/www.gironi.it\/blog\/en\/bayesian-ab-testing\/\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> &#8220;Bayesian A\/B Testing: not just &#8220;whether&#8221; B beats A, but &#8220;by how much&#8221;&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"categories":[161],"tags":[],"class_list":["post-3881","post","type-post","status-publish","format-standard","hentry","category-statistics"],"lang":"en","translations":{"en":3881,"it":3880},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"post-thumbnail":false},"uagb_author_info":{"display_name":"Paolo Gironi","author_link":"https:\/\/www.gironi.it\/blog\/author\/autore-articoli\/"},"uagb_comment_info":0,"uagb_excerpt":"In the article on classic A\/B testing we saw how to compare two variants with the two-proportion test: we compute a statistic, get a p-value, and decide whether to reject the null hypothesis. It works, and it is the daily bread of anyone running online experiments. But there is a subtle gap between what the&hellip;","_links":{"self":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3881","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/comments?post=3881"}],"version-history":[{"count":5,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3881\/revisions"}],"predecessor-version":[{"id":4220,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3881\/revisions\/4220"}],"wp:attachment":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/media?parent=3881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/categories?post=3881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/tags?post=3881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}