{"id":5800,"date":"2026-08-16T07:16:15","date_gmt":"2026-08-16T07:16:15","guid":{"rendered":"https:\/\/codethataint.com\/blog\/?p=5800"},"modified":"2026-08-17T14:31:49","modified_gmt":"2026-08-17T14:31:49","slug":"microservices-patterns-resilence-and-fault-tolerance-circuit-breaker","status":"publish","type":"post","link":"https:\/\/codethataint.com\/blog\/microservices-patterns-resilence-and-fault-tolerance-circuit-breaker\/","title":{"rendered":"Microservices Patterns &#8211; Resilence and Fault Tolerance &#8211; Circuit Breaker"},"content":{"rendered":"<p><strong class=\"ctaHeader3\">Why Circuit breaker?<\/strong><br \/>\nCircuit breaker Prevents cascading failures across microservices and Improves user experience by failing fast instead of hanging. Supports graceful degradation with fallbacks (e.g., cached responses, safe defaults).<\/p>\n<pre>\r\n\r\n   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n   \u2502               \u2502\r\n   \u2502    CLOSED     \u2502  \u2190\u2500\u2500\u2500 Successes reset failure count\r\n   \u2502 (Normal flow) \u2502\r\n   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n           \u2502\r\n           \u2502 Too many failures\r\n           \u25bc\r\n   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n   \u2502               \u2502\r\n   \u2502     OPEN      \u2502  \u2190\u2500\u2500\u2500 All calls blocked, fallback used\r\n   \u2502 (Protection)  \u2502\r\n   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n           \u2502\r\n           \u2502 Wait duration expires\r\n           \u25bc\r\n   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n   \u2502               \u2502\r\n   \u2502   HALF-OPEN   \u2502  \u2190\u2500\u2500\u2500 Limited test calls allowed\r\n   \u2502 (Trial mode)  \u2502\r\n   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n           \u2502\r\n   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n   \u2502                       \u2502\r\n   \u25bc                       \u25bc\r\nSuccess \u2192 CLOSED   Failures \u2192 back to OPEN\r\n\r\n\r\n<\/pre>\n<p><strong class=\"ctaHeader3\">How Circuit breaker Works?<\/strong><br \/>\nIt cycles through three states \u2014 Closed, Open, and Half\u2011Open \u2014 to balance resilience with recovery. <\/p>\n<p><strong>Closed State<\/strong> &#8211; Requests flow normally to the downstream service, tracks metrics like error rate, timeouts, and latency.<br \/>\n<strong>Open State<\/strong> &#8211; Triggered when failures exceed the configured threshold, breaker \u201ctrips\u201d and immediately rejects further calls.This prevents wasted retries and protects system resources.<br \/>\n<strong>Half\u2011Open State<\/strong> &#8211; After a cooldown period, the breaker allows limited trial requests. If these succeed \u2192 breaker resets to Closed. If they fail \u2192 breaker returns to Open for another cooldown.<\/p>\n<p><strong class=\"ctaHeader3\">What is the Default condition of  Circuit breaker to move to open state?<\/strong><br \/>\nFor Resilence4j Failure Rate Threshold: <strong>50% <\/strong> with a sliding window size of 100 Request. I.E. If 50 calls of last 100 request fails then circuit breaker moves to open state. Wait Duration in Open State: 60 seconds. After 60 Seconds Circuit breaker comes to half open state with 10 trial calls to test recovery before deciding to close or reopen state.<\/p>\n<p><strong class=\"ctaHeader3\">Sample config of Circuit Breaker which has sliding window of size 8 and failure call limit of 4. The CB would be OPEN state for 2 Seconds and permits 3 calls in HALFOPEN before turning to CLOSED state<\/strong><\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\nresilience4j.circuitbreaker.instances.EmployeeService.registerHealthIndicator=true\r\nresilience4j.circuitbreaker.instances.EmployeeService.slidingWindowSize=8\r\nresilience4j.circuitbreaker.instances.EmployeeService.failureRateThreshold=4\r\nresilience4j.circuitbreaker.instances.EmployeeService.waitDurationInOpenState=2s\r\nresilience4j.circuitbreaker.instances.EmployeeService.permittedNumberOfCallsInHalfOpenState=3\r\n<\/pre>\n<p>From postman 20 request sent with delay interval of 0.3 seconds<\/p>\n<table border=\"1\" cellpadding=\"6\" cellspacing=\"0\">\n<thead>\n<tr>\n<th>Count<\/th>\n<th>Request<\/th>\n<th>URL<\/th>\n<th>Seconds<\/th>\n<th>Http Status<\/th>\n<th>CB State<\/th>\n<th>Comments<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>Req1<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise<\/td>\n<td>0.3<\/td>\n<td>500 Server Error<\/td>\n<td>CLOSED<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>Req2<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise<\/td>\n<td>0.6<\/td>\n<td>500 Server Error<\/td>\n<td>CLOSED<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>Req3<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise<\/td>\n<td>0.9<\/td>\n<td>500 Server Error<\/td>\n<td>CLOSED<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>Req4<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise<\/td>\n<td>1.2<\/td>\n<td>500 Server Error<\/td>\n<td>CLOSED<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>Req5<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise<\/td>\n<td>1.5<\/td>\n<td>500 Server Error<\/td>\n<td>CLOSED<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>Req6<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise<\/td>\n<td>1.8<\/td>\n<td>500 Server Error<\/td>\n<td>CLOSED<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>Req7<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise<\/td>\n<td>2.1<\/td>\n<td>500 Server Error<\/td>\n<td>CLOSED<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td>Req8<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise<\/td>\n<td>2.4<\/td>\n<td>Fallback Method<\/td>\n<td>OPEN<\/td>\n<td>CB Opens as Sliding Window Size is 8 Request<\/td>\n<\/tr>\n<tr>\n<td>9<\/td>\n<td>Req9<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>2.7<\/td>\n<td>Fallback Method<\/td>\n<td>OPEN<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td>Req10<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>3<\/td>\n<td>Fallback Method<\/td>\n<td>OPEN<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>11<\/td>\n<td>Req11<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>3.3<\/td>\n<td>Fallback Method<\/td>\n<td>OPEN<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>12<\/td>\n<td>Req12<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>3.6<\/td>\n<td>Fallback Method<\/td>\n<td>OPEN<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>13<\/td>\n<td>Req13<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>3.9<\/td>\n<td>201 OK<\/td>\n<td>HALF-OPEN<\/td>\n<td>CB comes to half open after waiting 2 Seconds<\/td>\n<\/tr>\n<tr>\n<td>14<\/td>\n<td>Req14<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>4.2<\/td>\n<td>201 OK<\/td>\n<td>HALF-OPEN<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>15<\/td>\n<td>Req15<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>4.5<\/td>\n<td>201 OK<\/td>\n<td>HALF-OPEN<\/td>\n<td>CB test 3 Request in HALF OPEN State<\/td>\n<\/tr>\n<tr>\n<td>16<\/td>\n<td>Req16<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>4.8<\/td>\n<td>201 OK<\/td>\n<td>CLOSED<\/td>\n<td>CB comes to CLOSED State if 3 Request are Successful<\/td>\n<\/tr>\n<tr>\n<td>17<\/td>\n<td>Req17<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>5.1<\/td>\n<td>201 OK<\/td>\n<td>CLOSED<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>18<\/td>\n<td>Req18<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>5.4<\/td>\n<td>201 OK<\/td>\n<td>CLOSED<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>19<\/td>\n<td>Req19<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>5.7<\/td>\n<td>201 OK<\/td>\n<td>CLOSED<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>20<\/td>\n<td>Req20<\/td>\n<td>http:\/\/localhost:8085\/empmgmt\/test\/employees<\/td>\n<td>6<\/td>\n<td>201 OK<\/td>\n<td>CLOSED<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>How it works<\/strong><\/p>\n<ol>\n<li>@Autowired private CircuitBreakerRegistry circuitBreakerRegistry;<br \/>\nSpring injects the registry that holds all configured circuit breakers. You can fetch a breaker by name from here.<\/li>\n<li>@PostConstruct<br \/>\nThis method runs automatically after the bean is initialized, ensuring your event listeners are registered before the service starts handling requests.<\/li>\n<li>circuitBreakerRegistry.circuitBreaker(EMPLOYEE_SERVICE);<br \/>\nRetrieves the circuit breaker instance named EMPLOYEE_SERVICE. That name must match what you configured in application.yml.<\/li>\n<\/ol>\n<p><strong>EmployeeService.java<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n@RestController\r\npublic class EmployeeController {\r\n    @Autowired\r\n    EmployeeService employeeService;\r\n\r\n    @GetMapping(&quot;\/employees&quot;)\r\n    public String getEmployees() {\r\n        ResponseEntity&lt;String&gt; response = employeeService.getEmployeeDetails();\r\n        return response.getBody();\r\n    }\r\n}\r\n<\/pre>\n<p><strong>EmployeeService.java<\/strong><\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n@Service\r\n@Slf4j\r\npublic class EmployeeService {\r\n    private final RestTemplate restTemplate;\r\n\r\n    private static final String EMPLOYEE_SERVICE = &quot;EmployeeService&quot;;\r\n\r\n    AtomicInteger count = new AtomicInteger(1);\r\n\r\n    @Autowired\r\n    public EmployeeService(RestTemplate restTemplate) {\r\n        this.restTemplate = restTemplate;\r\n    }\r\n\r\n    @Autowired\r\n    private CircuitBreakerRegistry circuitBreakerRegistry;\r\n\r\n    @PostConstruct\r\n    public void registerCircuitBreakerEvents() {\r\n        \/\/ Retrieve the CircuitBreaker instance from the registry\r\n        \/\/ The name EMPLOYEE_SERVICE must match the one defined in application.yml\r\n        io.github.resilience4j.circuitbreaker.CircuitBreaker cb =\r\n                circuitBreakerRegistry.circuitBreaker(EMPLOYEE_SERVICE);\r\n\r\n        \/\/ Attach a listener to the CircuitBreaker\u2019s event publisher\r\n        \/\/ This listener will be triggered whenever the breaker changes state\r\n        cb.getEventPublisher()\r\n                .onStateTransition(event -&gt; {\r\n                    \/\/ Cast the generic event to a specific CircuitBreakerOnStateTransitionEvent\r\n                    CircuitBreakerOnStateTransitionEvent transitionEvent =\r\n                            (CircuitBreakerOnStateTransitionEvent) event;\r\n\r\n                    \/\/ Check if the breaker has moved to the OPEN state\r\n                    if (transitionEvent.getStateTransition().getToState() ==\r\n                            io.github.resilience4j.circuitbreaker.CircuitBreaker.State.OPEN) {\r\n                        \/\/ Log a warning when the breaker trips OPEN (calls are blocked)\r\n                        log.warn(&quot;\u26a0\ufe0f CircuitBreaker &#x5B;{}] moved to OPEN state at {}&quot;,\r\n                                cb.getName(), transitionEvent.getCreationTime());\r\n                    } else {\r\n                        \/\/ Log info for other transitions (CLOSED \u2192 HALF_OPEN, HALF_OPEN \u2192 CLOSED, etc.)\r\n                        log.info(&quot;CircuitBreaker &#x5B;{}] transitioned: {}&quot;,\r\n                                cb.getName(), transitionEvent.getStateTransition());\r\n                    }\r\n                });\r\n    }\r\n\r\n\r\n    \/\/ Use the annotation here\r\n    @io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker(name = EMPLOYEE_SERVICE, fallbackMethod = &quot;getEmployeeFallback&quot;)\r\n    public ResponseEntity&lt;String&gt; getEmployeeDetails() {\r\n        String url = &quot;http:\/\/localhost:8085\/empmgmt\/test\/employees?delay=500&quot;;\r\n\r\n        if(count.get() &lt;=8){\r\n            url = &quot;http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise?delay=500&quot;;\r\n        }else{\r\n            url = &quot;http:\/\/localhost:8085\/empmgmt\/test\/employees?delay=2000&quot;;\r\n        }\r\n\r\n        log.info(&quot;Count value {}&quot;, count.get());\r\n\r\n        long startTime = System.nanoTime();\r\n\r\n        ResponseEntity&lt;String&gt; response =\r\n                restTemplate.getForEntity(url, String.class);\r\n\r\n        count.incrementAndGet();\r\n\r\n        long endTime = System.nanoTime();\r\n        long durationMillis = (endTime - startTime) \/ 1_000_000;\r\n\r\n        log.info(&quot;Downstream call took: {} ms&quot;, durationMillis);\r\n\r\n        return response;\r\n    }\r\n\r\n    public ResponseEntity&lt;String&gt; getEmployeeFallback(Throwable t) {\r\n        log.error(&quot;Fallback triggered due to exception: {} Count is {} &quot;, t.getMessage(), count.get());\r\n        count.incrementAndGet();\r\n        return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)\r\n                .body(&quot;Service unavailable&quot;);\r\n    }\r\n}\r\n<\/pre>\n<p><strong>Logs in Circuit Breaker<\/strong><\/p>\n<pre>\r\nCount value 1\r\nFallback triggered due to exception: 500 Server Error on GET request for \"http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise\": \"{<EOL><EOL> \"message\": \"500 Internal Server Error\"<EOL><EOL>}<EOL><EOL>\" Count is 1 \r\nCount value 2\r\nFallback triggered due to exception: 500 Server Error on GET request for \"http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise\": \"{<EOL><EOL> \"message\": \"500 Internal Server Error\"<EOL><EOL>}<EOL><EOL>\" Count is 2 \r\nCount value 3\r\nFallback triggered due to exception: 500 Server Error on GET request for \"http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise\": \"{<EOL><EOL> \"message\": \"500 Internal Server Error\"<EOL><EOL>}<EOL><EOL>\" Count is 3 \r\nCount value 4\r\nFallback triggered due to exception: 500 Server Error on GET request for \"http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise\": \"{<EOL><EOL> \"message\": \"500 Internal Server Error\"<EOL><EOL>}<EOL><EOL>\" Count is 4 \r\nCount value 5\r\nFallback triggered due to exception: 500 Server Error on GET request for \"http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise\": \"{<EOL><EOL> \"message\": \"500 Internal Server Error\"<EOL><EOL>}<EOL><EOL>\" Count is 5 \r\nCount value 6\r\nFallback triggered due to exception: 500 Server Error on GET request for \"http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise\": \"{<EOL><EOL> \"message\": \"500 Internal Server Error\"<EOL><EOL>}<EOL><EOL>\" Count is 6 \r\nCount value 7\r\nFallback triggered due to exception: 500 Server Error on GET request for \"http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise\": \"{<EOL><EOL> \"message\": \"500 Internal Server Error\"<EOL><EOL>}<EOL><EOL>\" Count is 7 \r\nCount value 8\r\n\u26a0\ufe0f CircuitBreaker [EmployeeService] moved to OPEN state at 2026-08-16T14:16:53.120914500+05:30[Asia\/Calcutta]\r\nFallback triggered due to exception: 500 Server Error on GET request for \"http:\/\/localhost:8085\/empmgmt\/test\/employees\/ise\": \"{<EOL><EOL> \"message\": \"500 Internal Server Error\"<EOL><EOL>}<EOL><EOL>\" Count is 8 \r\nFallback triggered due to exception: CircuitBreaker 'EmployeeService' is OPEN and does not permit further calls Count is 9 \r\nFallback triggered due to exception: CircuitBreaker 'EmployeeService' is OPEN and does not permit further calls Count is 10 \r\nFallback triggered due to exception: CircuitBreaker 'EmployeeService' is OPEN and does not permit further calls Count is 11 \r\nFallback triggered due to exception: CircuitBreaker 'EmployeeService' is OPEN and does not permit further calls Count is 12 \r\nCircuitBreaker [EmployeeService] transitioned: State transition from OPEN to HALF_OPEN\r\nCount value 13\r\nDownstream call took: 2009 ms\r\nCount value 14\r\nDownstream call took: 2006 ms\r\nCount value 15\r\nDownstream call took: 2008 ms\r\nCircuitBreaker [EmployeeService] transitioned: State transition from HALF_OPEN to CLOSED\r\nCount value 16\r\nDownstream call took: 2012 ms\r\nCount value 17\r\nDownstream call took: 2008 ms\r\nCount value 18\r\nDownstream call took: 2016 ms\r\nCount value 19\r\nDownstream call took: 2013 ms\r\nCount value 20\r\nDownstream call took: 2013 ms\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Why Circuit breaker? Circuit breaker Prevents cascading failures across microservices and Improves user experience by failing fast instead of hanging. Supports graceful degradation with fallbacks (e.g., cached responses, safe defaults). \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502 \u2502 CLOSED \u2502 \u2190\u2500\u2500\u2500 Successes reset failure count \u2502 (Normal flow) \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2502 Too many failures \u25bc \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502&hellip; <a href=\"https:\/\/codethataint.com\/blog\/microservices-patterns-resilence-and-fault-tolerance-circuit-breaker\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[378,379],"tags":[],"class_list":["post-5800","post","type-post","status-publish","format-standard","hentry","category-microservices-patterns","category-resilence-and-fault-tolerance"],"_links":{"self":[{"href":"https:\/\/codethataint.com\/blog\/wp-json\/wp\/v2\/posts\/5800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/codethataint.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/codethataint.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/codethataint.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/codethataint.com\/blog\/wp-json\/wp\/v2\/comments?post=5800"}],"version-history":[{"count":5,"href":"https:\/\/codethataint.com\/blog\/wp-json\/wp\/v2\/posts\/5800\/revisions"}],"predecessor-version":[{"id":5812,"href":"https:\/\/codethataint.com\/blog\/wp-json\/wp\/v2\/posts\/5800\/revisions\/5812"}],"wp:attachment":[{"href":"https:\/\/codethataint.com\/blog\/wp-json\/wp\/v2\/media?parent=5800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/codethataint.com\/blog\/wp-json\/wp\/v2\/categories?post=5800"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/codethataint.com\/blog\/wp-json\/wp\/v2\/tags?post=5800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}