{"id":3834,"date":"2025-12-24T10:01:04","date_gmt":"2025-12-24T15:01:04","guid":{"rendered":"https:\/\/www.mymiller.name\/wordpress\/?p=3834"},"modified":"2025-12-24T10:01:04","modified_gmt":"2025-12-24T15:01:04","slug":"documenting-your-datas-reach-generating-api-docs-for-spring-data-rest","status":"publish","type":"post","link":"https:\/\/www.mymiller.name\/wordpress\/spring_rest\/documenting-your-datas-reach-generating-api-docs-for-spring-data-rest\/","title":{"rendered":"Documenting Your Data&#8217;s Reach: Generating API Docs for Spring Data REST"},"content":{"rendered":"\n<div class=\"wp-block-jetpack-markdown\"><p>Spring Data REST is a fantastic tool for rapidly exposing your JPA entities as hypermedia-driven REST APIs. However, even the most intuitive APIs benefit from clear and comprehensive documentation. While HATEOAS provides discoverability at runtime, static documentation offers a bird\u2019s-eye view, making it easier for developers to understand the API\u2019s structure, available resources, and supported operations.<\/p>\n<p>This article will explore how to generate documentation for your Spring Data REST APIs, focusing on popular tools and approaches within the Spring ecosystem.<\/p>\n<p><strong>Why Document Your Spring Data REST API?<\/strong><\/p>\n<ul>\n<li><strong>Onboarding New Developers:<\/strong> Clear documentation significantly speeds up the learning curve for developers integrating with your API.<\/li>\n<li><strong>Improved Collaboration:<\/strong> Provides a shared understanding of the API\u2019s capabilities for both internal and external teams.<\/li>\n<li><strong>Reduced Ambiguity:<\/strong> Clarifies endpoints, request\/response formats, and available actions.<\/li>\n<li><strong>Client Library Generation:<\/strong> Well-structured documentation can be used to automatically generate client libraries in various languages.<\/li>\n<li><strong>Long-Term Maintainability:<\/strong> Serves as a reference point as your API evolves.<\/li>\n<\/ul>\n<p><strong>Popular Tools and Approaches<\/strong><\/p>\n<p>Here are some common ways to generate documentation for your Spring Data REST APIs:<\/p>\n<p><strong>1. Spring REST Docs (Recommended for Accuracy and Maintainability)<\/strong><\/p>\n<p>Spring REST Docs is a powerful tool specifically designed for documenting RESTful APIs built with Spring. It works by writing tests that interact with your API and, as a byproduct, generates accurate and up-to-date documentation snippets.<\/p>\n<p><strong>How it Works with Spring Data REST:<\/strong><\/p>\n<ul>\n<li><strong>Write Integration Tests:<\/strong> You write tests that exercise your Spring Data REST endpoints (e.g., creating, retrieving, updating, deleting entities).<\/li>\n<li><strong>Document API Interactions:<\/strong> Within your tests, you use Spring REST Docs\u2019 DSL to document the request and response details, including:\n<ul>\n<li>Path parameters<\/li>\n<li>Query parameters<\/li>\n<li>Request body fields<\/li>\n<li>Response body fields (including HATEOAS links)<\/li>\n<li>HTTP status codes<\/li>\n<li>Headers<\/li>\n<\/ul>\n<\/li>\n<li><strong>Generate Documentation:<\/strong> Spring REST Docs uses the information captured during the tests to generate Asciidoctor or Markdown documentation.<\/li>\n<\/ul>\n<p><strong>Example (Gradle setup and a simplified test snippet):<\/strong><\/p>\n<p><strong>build.gradle:<\/strong><\/p>\n<pre><code class=\"language-gradle\">plugins {\n    id 'org.springframework.boot' version '...'\n    id 'java'\n    id 'org.asciidoctor.jvm.convert' version '3.3.2'\n}\n\n\/\/ ... other dependencies\n\ndependencies {\n    implementation 'org.springframework.boot:spring-boot-starter-data-rest'\n    implementation 'org.springframework.boot:spring-boot-starter-web'\n    testImplementation 'org.springframework.boot:spring-boot-starter-test'\n    testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'\n}\n\nasciidoctor {\n    inputs.dir snippetsDir\n    outputDir file('build\/asciidoc')\n}\n\ntask copyDocument(type: Copy) {\n    dependsOn asciidoctor\n    from file('build\/asciidoc\/html5')\n    into file('build\/resources\/static\/docs') \/\/ Or your preferred output directory\n}\n\nbootJar {\n    dependsOn copyDocument\n}\n<\/code><\/pre>\n<p><strong>Simplified Integration Test:<\/strong><\/p>\n<pre><code class=\"language-java\">import org.junit.jupiter.api.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;\nimport org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.web.servlet.MockMvc;\n\nimport static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;\nimport static org.springframework.restdocs.payload.PayloadDocumentation.*;\nimport static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@SpringBootTest\n@AutoConfigureMockMvc\n@AutoConfigureRestDocs(outputDir = &quot;build\/generated-snippets&quot;)\npublic class ProductDocumentationIntegrationTest {\n\n    @Autowired\n    private MockMvc mockMvc;\n\n    @Test\n    void getProduct() throws Exception {\n        this.mockMvc.perform(get(&quot;\/products\/1&quot;))\n                .andExpect(status().isOk())\n                .andDo(document(&quot;product-get&quot;,\n                        responseFields(\n                                fieldWithPath(&quot;id&quot;).description(&quot;The product ID&quot;),\n                                fieldWithPath(&quot;name&quot;).description(&quot;The product name&quot;),\n                                fieldWithPath(&quot;price&quot;).description(&quot;The product price&quot;),\n                                fieldWithPath(&quot;_links.self.href&quot;).description(&quot;Link to the product itself&quot;),\n                                fieldWithPath(&quot;_links.category.href&quot;).description(&quot;Link to the product's category&quot;)\n                                \/\/ Add documentation for other fields and links\n                        )));\n    }\n}\n<\/code><\/pre>\n<p><strong>Pros:<\/strong><\/p>\n<ul>\n<li><strong>Accurate:<\/strong> Documentation is generated from actual API interactions, reducing the risk of outdated information.<\/li>\n<li><strong>Maintainable:<\/strong> Changes to the API will likely break tests, forcing you to update the documentation.<\/li>\n<li><strong>Comprehensive:<\/strong> Allows detailed documentation of requests, responses, headers, and HATEOAS links.<\/li>\n<li><strong>Integrates Well with Spring:<\/strong> Seamlessly works with Spring\u2019s testing framework.<\/li>\n<\/ul>\n<p><strong>Cons:<\/strong><\/p>\n<ul>\n<li><strong>Requires Writing Tests:<\/strong> Adds the overhead of writing detailed integration tests.<\/li>\n<li><strong>Steeper Learning Curve:<\/strong> Might have a slightly higher initial learning curve compared to purely annotation-based approaches.<\/li>\n<\/ul>\n<p><strong>2. OpenAPI (Swagger) Specification (Annotation-Based)<\/strong><\/p>\n<p>OpenAPI (formerly Swagger) is a widely adopted specification for describing RESTful APIs. You can generate OpenAPI documentation for your Spring Data REST API using libraries like <code>springdoc-openapi<\/code>.<\/p>\n<p><strong>How it Works with Spring Data REST:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>Add Dependency:<\/strong> Include the <code>springdoc-openapi-starter-data-rest<\/code> dependency in your project.<\/p>\n<p><strong>Maven:<\/strong><\/p>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;org.springdoc&lt;\/groupId&gt;\n    &lt;artifactId&gt;springdoc-openapi-starter-data-rest&lt;\/artifactId&gt;\n    &lt;version&gt;...&lt;\/version&gt;\n&lt;\/dependency&gt;\n<\/code><\/pre>\n<p><strong>Gradle:<\/strong><\/p>\n<pre><code class=\"language-gradle\">implementation 'org.springdoc:springdoc-openapi-starter-data-rest:...'\n<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>Configuration (Optional):<\/strong> You can customize the generated OpenAPI specification using properties in your <code>application.yml<\/code> or <code>@OpenAPIDefinition<\/code> and <code>@Operation<\/code> annotations. However, for basic Spring Data REST exposure, minimal configuration is often needed.<\/p>\n<\/li>\n<li>\n<p><strong>Access Documentation:<\/strong> Once your application is running, the OpenAPI specification will typically be available at endpoints like <code>\/v3\/api-docs<\/code> (in JSON format) and a UI (Swagger UI) at <code>\/swagger-ui.html<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p><strong>Example (<code>application.yml<\/code> for basic info):<\/strong><\/p>\n<pre><code class=\"language-yaml\">springdoc:\n  api-docs:\n    path: \/v3\/api-docs\n  swagger-ui:\n    path: \/swagger-ui.html\n    config:\n      defaultModelsExpandDepth: -1 # Collapse models by default\n<\/code><\/pre>\n<p><strong>Pros:<\/strong><\/p>\n<ul>\n<li><strong>Easy Setup:<\/strong> Adding the dependency and accessing the UI is straightforward.<\/li>\n<li><strong>Interactive UI (Swagger UI):<\/strong> Provides a user-friendly interface to explore and test your API.<\/li>\n<li><strong>Widely Adopted Standard:<\/strong> OpenAPI specifications can be used by various tools for client generation, testing, and more.<\/li>\n<li><strong>Annotation-Driven (with customizations):<\/strong> You can add annotations to your entities, repositories, and custom controllers for more detailed documentation.<\/li>\n<\/ul>\n<p><strong>Cons:<\/strong><\/p>\n<ul>\n<li><strong>Limited Automatic Documentation of HATEOAS:<\/strong> While <code>springdoc-openapi<\/code> can document the basic structure and fields of your entities, fully capturing the dynamic nature of HATEOAS links might require more manual configuration or customizers.<\/li>\n<li><strong>Potential for Outdated Documentation:<\/strong> If not carefully maintained with annotations, the documentation might drift from the actual API behavior.<\/li>\n<\/ul>\n<p><strong>3. Manual Documentation (Not Recommended for Evolving APIs)<\/strong><\/p>\n<p>You could manually write documentation using tools like Markdown, Confluence, or dedicated API documentation platforms.<\/p>\n<p><strong>Pros:<\/strong><\/p>\n<ul>\n<li><strong>Full Control:<\/strong> You have complete control over the content and format.<\/li>\n<\/ul>\n<p><strong>Cons:<\/strong><\/p>\n<ul>\n<li><strong>Time-Consuming:<\/strong> Requires significant manual effort to create and maintain.<\/li>\n<li><strong>Prone to Errors:<\/strong> Easily becomes outdated as the API evolves.<\/li>\n<li><strong>Difficult to Keep Synchronized:<\/strong> Ensuring accuracy with the codebase is challenging.<\/li>\n<\/ul>\n<p><strong>Best Practices for Documenting Spring Data REST APIs:<\/strong><\/p>\n<ul>\n<li><strong>Choose the Right Tool:<\/strong> For Spring-based APIs, Spring REST Docs offers the highest accuracy and maintainability. OpenAPI is a good choice for broader adoption and interactive exploration. Avoid relying solely on manual documentation for evolving APIs.<\/li>\n<li><strong>Focus on Key Information:<\/strong> Document endpoints, HTTP methods, request\/response formats (including data types), authentication requirements, and any specific business logic.<\/li>\n<li><strong>Document HATEOAS Links:<\/strong> Clearly explain the purpose and structure of the <code>_links<\/code> section and the meaning of different <code>rel<\/code> values. Provide examples of how clients can use these links to navigate the API.<\/li>\n<li><strong>Keep Documentation Up-to-Date:<\/strong> Integrate documentation generation into your build process to ensure it stays synchronized with your codebase. Tests in Spring REST Docs serve this purpose well.<\/li>\n<li><strong>Provide Examples:<\/strong> Include clear and concise examples of requests and responses.<\/li>\n<li><strong>Consider Different Formats:<\/strong> Generate documentation in formats that are easily consumable by developers (e.g., HTML, Markdown, OpenAPI JSON\/YAML).<\/li>\n<li><strong>Host Your Documentation:<\/strong> Make your API documentation easily accessible to your consumers (e.g., host it on a dedicated documentation website).<\/li>\n<\/ul>\n<p><strong>Conclusion:<\/strong><\/p>\n<p>Documenting your Spring Data REST API is essential for its successful adoption and long-term maintainability. While Spring Data REST simplifies API creation, investing in proper documentation ensures that developers can effectively understand and integrate with your data resources. By leveraging tools like Spring REST Docs or OpenAPI, you can generate accurate, discoverable, and up-to-date documentation that empowers your API consumers. Choose the approach that best fits your project\u2019s needs and prioritize keeping your documentation in sync with your evolving API.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":3769,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[447],"tags":[],"series":[],"class_list":["post-3834","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-spring_rest"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/network-5987786_1280-jpg.avif","jetpack-related-posts":[{"id":3553,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_databases\/spring-data-rest-simplify-restful-api-development\/","url_meta":{"origin":3834,"position":0},"title":"Spring Data REST: Simplify RESTful API Development","author":"Jeffery Miller","date":"April 20, 2026","format":false,"excerpt":"Spring Data REST: Simplify RESTful API Development What is Spring Data REST? Spring Data REST is a Spring module that automatically creates RESTful APIs for Spring Data repositories. It eliminates boilerplate code, allowing you to focus on your application\u2019s core logic. Benefits: Reduced Boilerplate: No need to write controllers for\u2026","rel":"","context":"In &quot;Spring Databases&quot;","block_context":{"text":"Spring Databases","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_databases\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/desk-593327_1280.jpg?fit=1200%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/desk-593327_1280.jpg?fit=1200%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/desk-593327_1280.jpg?fit=1200%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/desk-593327_1280.jpg?fit=1200%2C800&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/desk-593327_1280.jpg?fit=1200%2C800&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":3568,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_rest\/spring-data-rest-simplify-restful-api-development-2\/","url_meta":{"origin":3834,"position":1},"title":"Spring Data REST: Simplify RESTful API Development","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Spring Data REST is a Spring module that automatically creates RESTful APIs for Spring Data repositories. It eliminates boilerplate code, allowing you to focus on your application\u2019s core logic. Benefits: Reduced Boilerplate: No need to write controllers for CRUD operations. Hypermedia-Driven: APIs are discoverable through links (HAL). Customization: Fine-tune the\u2026","rel":"","context":"In &quot;Spring Rest&quot;","block_context":{"text":"Spring Rest","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_rest\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/network-3152677_640.jpg?fit=640%2C427&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/network-3152677_640.jpg?fit=640%2C427&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/network-3152677_640.jpg?fit=640%2C427&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3820,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_rest\/effortless-api-creation-generating-crud-endpoints-with-spring-data-rest\/","url_meta":{"origin":3834,"position":2},"title":"Effortless API Creation: Generating CRUD Endpoints with Spring Data REST","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Building RESTful APIs for your data can often feel like a repetitive task. Defining endpoints, handling HTTP methods (GET, POST, PUT, DELETE), serializing and deserializing data \u2013 it all adds up. But what if you could significantly reduce this boilerplate and focus on your core domain logic? Enter Spring Data\u2026","rel":"","context":"In &quot;Spring Rest&quot;","block_context":{"text":"Spring Rest","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_rest\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/05\/ai-generated-8041774_640.jpg?fit=640%2C479&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/05\/ai-generated-8041774_640.jpg?fit=640%2C479&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/05\/ai-generated-8041774_640.jpg?fit=640%2C479&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3811,"url":"https:\/\/www.mymiller.name\/wordpress\/angular\/streamline-your-workflow-generate-angular-services-from-spring-boot-rest-apis-with-gradle\/","url_meta":{"origin":3834,"position":3},"title":"Streamline Your Workflow: Generate Angular Services from Spring Boot REST APIs with Gradle","author":"Jeffery Miller","date":"February 24, 2025","format":false,"excerpt":"Integrating your Angular frontend with a Spring Boot backend can be a breeze if you automate the process of creating your Angular services. This post will show you how to leverage Gradle, OpenAPI (Swagger), and the OpenAPI Generator to generate type-safe Angular TypeScript services directly from your Spring Boot REST\u2026","rel":"","context":"In &quot;Angular&quot;","block_context":{"text":"Angular","link":"https:\/\/www.mymiller.name\/wordpress\/category\/angular\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/immune-defense-1359197_1280-jpg.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/immune-defense-1359197_1280-jpg.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/immune-defense-1359197_1280-jpg.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/immune-defense-1359197_1280-jpg.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/immune-defense-1359197_1280-jpg.avif 3x"},"classes":[]},{"id":3838,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_rest\/ensuring-api-navigation-integration-testing-hateoas-with-spring\/","url_meta":{"origin":3834,"position":4},"title":"Ensuring API Navigation: Integration Testing HATEOAS with Spring","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Building RESTful APIs with HATEOAS (Hypermedia as the Engine of Application State) offers significant advantages in terms of discoverability and evolvability. However, verifying that your API correctly generates and serves these crucial links requires a robust integration testing strategy. This article will guide you through the techniques and tools for\u2026","rel":"","context":"In &quot;Spring Rest&quot;","block_context":{"text":"Spring Rest","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_rest\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8686283_1280-jpg.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8686283_1280-jpg.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8686283_1280-jpg.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8686283_1280-jpg.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8686283_1280-jpg.avif 3x"},"classes":[]},{"id":3836,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_rest\/testing-the-waters-writing-effective-unit-tests-for-spring-data-rest-apis\/","url_meta":{"origin":3834,"position":5},"title":"Testing the Waters: Writing Effective Unit Tests for Spring Data REST APIs","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Spring Data REST is a powerful tool for rapidly exposing your JPA entities as RESTful APIs with minimal code. However, the \u201cminimal code\u201d aspect doesn\u2019t absolve you from the crucial responsibility of writing unit tests. While Spring Data REST handles much of the underlying API infrastructure, your business logic, entity\u2026","rel":"","context":"In &quot;Spring Rest&quot;","block_context":{"text":"Spring Rest","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_rest\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8136170_1280-png.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8136170_1280-png.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8136170_1280-png.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8136170_1280-png.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8136170_1280-png.avif 3x"},"classes":[]}],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3834","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/comments?post=3834"}],"version-history":[{"count":1,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3834\/revisions"}],"predecessor-version":[{"id":3835,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3834\/revisions\/3835"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media\/3769"}],"wp:attachment":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media?parent=3834"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/categories?post=3834"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/tags?post=3834"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/series?post=3834"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}